haskell-ci-0.6: src/HaskellCI/List.hs
{-# LANGUAGE RankNTypes #-}
module HaskellCI.List (
ListBuilder,
buildList,
item,
) where
import HaskellCI.Prelude
newtype ListBuilder x a = LB { unLB :: forall r. (([x] -> [x]) -> a -> r) -> r }
instance Functor (ListBuilder x) where
fmap f (LB k) = LB $ k $ \endo a k' -> k' endo (f a)
instance Applicative (ListBuilder x) where
pure x = LB $ \f -> f id x
(<*>) = ap
instance Monad (ListBuilder x) where
return = pure
m >>= k =
LB $ \r ->
unLB m $ \endo1 a ->
unLB (k a) $ \endo2 b ->
r (endo1 . endo2) b
buildList :: ListBuilder x () -> [x]
buildList (LB f) = f $ \endo _ -> endo []
item :: x -> ListBuilder x ()
item x = LB $ \f -> f (x :) ()