8 | data Late : Type -> Type where
10 | Later : Inf (Late a) -> Late a
22 | unfold : (seed -> Either seed value) -> seed -> Late value
23 | unfold f s = case f s of
24 | Left s' => Later (unfold f s')
30 | bind : Late a -> (a -> Late b) -> Late b
31 | bind (Now v) f = f v
32 | bind (Later d) f = Later (bind d f)
39 | isNow : Late a -> Maybe a
40 | isNow (Now v) = Just v
41 | isNow (Later d) = Nothing
45 | wait : Late a -> Late a
51 | engine : Nat -> Late a -> Late a
53 | engine (S n) = engine n . wait
57 | petrol : Nat -> Late a -> Maybe a
58 | petrol n = isNow . engine n
62 | accelerate : Late a -> Late a
63 | accelerate (Later (Later d)) = Later (accelerate d)
64 | accelerate (Later (Now v)) = Now v
72 | map f d = bind d (Now . f)
75 | Applicative Late where
77 | df <*> dx = bind df (\ f => map (f $
) dx)