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