{-# LANGUAGE UndecidableInstances #-}

-- | Type-level string parsers shaped like 'Monad' functions.

module Symparsec.Parser.Monad ( type (>>=) ) where

import Symparsec.Parser.Common

-- | '>>=' for parsers. Sequentially compose two parsers, passing the value from
-- the left parser as an argument to the second.
type (>>=) :: PParser a -> (a ~> PParser b) -> PParser b
infixl 1 >>=
data (>>=) l r s
type instance App (l >>= r) s = BindL r (l @@ s)
type BindL :: (a ~> PParser b) -> PReply a -> PReply b
type family BindL r rep where
    BindL r ('Reply (OK  a) s) = r @@ a @@ s
    BindL r ('Reply (Err e) s) = 'Reply (Err e) s