///|
pub(all) type State[S, A] (S) -> (A, S)
///|
pub fn[S, A, B] State::map(state : State[S, A], f : (A) -> B) -> State[S, B] {
State(fn(seed) {
let (a, s2) = state.inner()(seed)
(f(a), s2)
})
}
///|
pub fn[S, A] State::evaluate(self : State[S, A], state : S) -> A {
self.inner()(state).0
}