const cap = 3

const enabled = true

const selected = Mode.fast

type Gate<static enabledFlag: Bool, static selectedMode: Mode> {
    value: i32,
}

enum Mode: u8 {
    fast,
    tiny,
}

fn head<T: Type, static N: usize>(items: ref<[N]T>) -> T {
    return items[0]
}

fn readGate<static enabledFlag: Bool, static selectedMode: Mode>(gate: ref<Gate<enabledFlag, selectedMode>>) -> i32 {
    if enabledFlag {
        return gate.value
    }
    return 0
}

pub fn main() -> Void {
    let values: [cap]i32 = [3, 4, 5]
    let first: i32 = head(&values)
    let gate: Gate<enabled, selected> = Gate { value: 9 }
    let gated: i32 = readGate(&gate)
    expect (first == 3 && gated == 9)
}
