oters_lang 0.1.3

Language definitions and interpreter for the oters programming language
Documentation
use std::*

type Event<A> = Stream<Option<A>>

let never = Option::None << @never

let switch = fn (x << xs) (e << es) -> 
  match e with {
    Option::None => x << @(switch !@xs !@es),
    Option::Some (a << as) => a << @(switch !@as !@es)
  }

let switch_trans' = fn (a << as) (e << es) bs -> 
  match e with {
    Option::None => a << @(switch_trans' !@as !@es !@(std::stream::tail bs)),
    Option::Some f => {
      let (b' << bs') = f bs;
      b' << @(switch_trans' !@bs' !@es !@(std::stream::tail bs))
    }
  }
let switch_trans = fn f es as -> switch_trans' (f as) es as

let trigger = fn pred (x << xs) -> {
  let x' = if !#pred x then
    Option::Some(x) 
  else 
    Option::None;
  x' << @(trigger pred !@xs)
}