-- This confusingly gives an error that -- it doesn't know what `Console.simulate` is. effect State s where get : {State s} s set : s -> {State s} () effect Console where read : {Console} (Optional Text) write : Text -> {Console} () use Console simulate fst x = case x of Pair.Pair a _ -> a snd x = case x of Pair.Pair _ (Pair.Pair b _) -> b namespace Console where simulate : Effect Console a -> {State ([Text], [Text])} a simulate c = case c of {Console.read -> k} -> io = State.get ins = fst io outs = snd io State.set (drop 1 ins, outs) todo {Console.write t -> k} -> io = State.get ins = fst io outs = snd io todo (++) = concatenate handle simulate in use Console read write use Optional Some None write "What's your name?" case read of Some name -> write ("Hello" ++ name) None -> write "Fine, be that way." ()