Agda-2.3.2.2: src/prototyping/mixfix/benchmarks/ContTrans.hs
------------------------------------------------------------------------
-- A continuation transformer
------------------------------------------------------------------------
{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FlexibleInstances,
UndecidableInstances #-}
module ContTrans where
import Control.Applicative
import Control.Monad
import qualified Parser
newtype ContTrans p r =
P { unP :: forall r'. (r -> p r') -> p r' }
instance Functor (ContTrans p) where
fmap f (P p) = P (\k -> p (k . f))
instance Monad (ContTrans p) where
return x = P (\k -> k x)
P p >>= f = P (\k -> p (\x -> unP (f x) k))
instance Applicative (ContTrans p) where
pure = return
p1 <*> p2 = p1 >>= \f -> fmap f p2
instance Alternative p => Alternative (ContTrans p) where
empty = P (\_ -> empty)
P p1 <|> P p2 = P (\k -> p1 k <|> p2 k)
parse :: Monad p =>
(p r -> [tok] -> [r]) ->
(ContTrans p r -> [tok] -> [r])
parse parse' (P p) = parse' (p return)
instance (Monad p, Alternative p, Parser.Parser p k r' tok) =>
Parser.Parser (ContTrans p) k r' tok where
sym c = P (\k -> Parser.sym c >>= k)