((S, S => Unit)) => R ) type CUSH[S, R] = Freer[[T] => UseState[S, T], R] def useState[S](initialState: S) : CUSH[S, (S, S => Unit)] = Impure(UseState(initialState, x => x), x => Pure(x)) def injectState[S, R] (freer: CUSH[S, R], state: S, setState: S => Unit) = freer match { case Freer.Pure(a) => throw new Error case Freer.Impure( UseState(initialState, meansNothing), k ) => k(typeConv((state, setState))) }