> module ParseMonad where

> import Control.Monad( ap )
> import Control.Applicative( Applicative(..) )
> import qualified Control.Monad.Fail as Fail

> data ParseResult a = OkP a | FailP String
> newtype P a = P (String -> Int -> ParseResult a)
> runP :: P a -> String -> Int -> ParseResult a
> runP :: forall a. P a -> String -> Int -> ParseResult a
runP (P String -> Int -> ParseResult a
f) = String -> Int -> ParseResult a
f


> lineP :: P Int
> lineP :: P Int
lineP = forall a. (String -> Int -> ParseResult a) -> P a
P forall a b. (a -> b) -> a -> b
$ \String
_ Int
l -> forall a. a -> ParseResult a
OkP Int
l


> instance Monad P where
>	return :: forall a. a -> P a
return a
m = forall a. (String -> Int -> ParseResult a) -> P a
P forall a b. (a -> b) -> a -> b
$ \ String
_ Int
_ -> forall a. a -> ParseResult a
OkP a
m
>	P a
m >>= :: forall a b. P a -> (a -> P b) -> P b
>>= a -> P b
k =  forall a. (String -> Int -> ParseResult a) -> P a
P forall a b. (a -> b) -> a -> b
$ \String
s Int
l -> case forall a. P a -> String -> Int -> ParseResult a
runP P a
m String
s Int
l of
>		OkP a
a -> forall a. P a -> String -> Int -> ParseResult a
runP (a -> P b
k a
a) String
s Int
l
>		FailP String
err -> forall a. String -> ParseResult a
FailP String
err

> instance Fail.MonadFail P where
>	fail :: forall a. String -> P a
fail String
s = forall a. (String -> Int -> ParseResult a) -> P a
P forall a b. (a -> b) -> a -> b
$ \ String
_ Int
_ -> forall a. String -> ParseResult a
FailP String
s

> instance Functor P where
>   fmap :: forall a b. (a -> b) -> P a -> P b
fmap a -> b
f P a
a = P a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f)

> instance Applicative P where
>   <*> :: forall a b. P (a -> b) -> P a -> P b
(<*>) = forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
>   pure :: forall a. a -> P a
pure = forall (m :: * -> *) a. Monad m => a -> m a
return