bitr 0.1.1

Minimal BitScript interpreter.
Documentation
use crate::bools_to_string;

pub fn run_gate(name: &str, args: &[bool]) -> Result<String, String> {
    let res = match name {
        "NOT" => not(args),
        "AND" => and(args),
        "OR" => or(args),
        "NOR" => nor(args),
        "NAND" => nand(args),
        "XOR" => xor(args),
        "XNOR" => xnor(args),
        _ => return Err(format!("unknown gate `{name}`")),
    };

    Ok(bools_to_string(&res))
}

fn not(args: &[bool]) -> Vec<bool> {
    args.iter().map(|&b| !b).collect()
}

fn and(args: &[bool]) -> Vec<bool> {
    vec![args.iter().all(|&b| b)]
}

fn or(args: &[bool]) -> Vec<bool> {
    vec![args.iter().any(|&b| b)]
}

fn nor(args: &[bool]) -> Vec<bool> {
    not(&or(args))
}

fn nand(args: &[bool]) -> Vec<bool> {
    not(&and(args))
}

fn xor(args: &[bool]) -> Vec<bool> {
    vec![!xnor(args)[0]]
}

fn xnor(args: &[bool]) -> Vec<bool> {
    vec![args.iter().filter(|&&b| b).count() % 2 == 0]
}