{-# 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 :) ()