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