1module Main where 2 3import Prelude 4 5import Effect (Effect) 6import Effect.Console (log) 7 8class IsStream el s | s -> el where 9 cons :: el -> (Unit -> s) -> s 10 uncons :: s -> { head :: el, tail :: s } 11 12data Stream a = Stream a (Unit -> Stream a) 13 14instance streamIsStream :: IsStream a (Stream a) where 15 cons x xs = Stream x xs 16 uncons (Stream x f) = { head: x, tail: f unit } 17 18test :: forall el s. IsStream el s => s -> s 19test s = case uncons s of 20 { head, tail } -> cons head \_ -> tail 21 22main :: Effect Unit 23main = do 24 let dones :: Stream String 25 dones = cons "Done" \_ -> dones 26 log (uncons (test dones)).head 27