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)
}