package snake /** * m04 state (optional, Exercise 4.7): the general pattern behind Random. A State[S, A] is a function * s => (A, nextS): it reads a state, produces a value and hands on a new state. Random[A] is State[Long, A]. * Nothing in the game uses this file; it is here to show that Random was one example of a bigger idea. */ final case class State[S, A](run: S => (A, S)): def map[B](f: A => B): State[S, B] = State { s => val (a, next) = run(s) (f(a), next) } def flatMap[B](f: A => State[S, B]): State[S, B] = State { s => val (a, next) = run(s) f(a).run(next) } object State: def pure[S, A](a: A): State[S, A] = State(s => (a, s)) /** The current state as the value; the state is left untouched. */ def get[S]: State[S, S] = State(s => (s, s)) /** Replace the state with `s`; there is no interesting value, so it is `()`. */ def put[S](s: S): State[S, Unit] = State(_ => ((), s)) def modify[S](f: S => S): State[S, Unit] = State(s => ((), f(s)))