{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}

module Text.Parsec.Free where

import                    Control.Applicative hiding (many)
import                    Control.Monad
import                    Control.Monad.Cont.Class
import                    Control.Monad.Error.Class
import                    Control.Monad.Free
import                    Control.Monad.IO.Class
import                    Control.Monad.Reader.Class
import                    Control.Monad.State.Class
import                    Control.Monad.Trans.Class
import qualified "parsec" Text.Parsec.Pos as P
import qualified "parsec" Text.Parsec.Prim as P

newtype ParsecDSL s u m a = ParsecDSL {
    runParsecDSL :: Free (ParsecF s u m) a
    }
    deriving (Functor, Applicative, Monad, Show)

instance Alternative (ParsecDSL s u m) where
    empty = parserZero
    (<|>) = parserPlus

instance MonadPlus (ParsecDSL s u m) where
    mzero = parserZero
    mplus = parserPlus

instance (MonadReader r m) => MonadReader r (ParsecDSL s u m) where
    ask = lift ask
    -- local f p = ParsecDSL $ \s -> local f (runParsecDSL p s)
    local f p = error "NYI Free.MonadReader"

-- I'm presuming the user might want a separate, non-backtracking
-- state aside from the Parsec user state.
instance (MonadState s m) => MonadState s (ParsecDSL s' u m) where
    get = lift get
    put = lift . put

instance (MonadCont m) => MonadCont (ParsecDSL s u m) where
    callCC f = error "NYI Free.callCC"

instance (MonadError e m) => MonadError e (ParsecDSL s u m) where
    throwError = lift . throwError
    p `catchError` h = error "NYI Free.catchError"

instance MonadTrans (ParsecDSL s u) where
    lift m = liftF' $ Peffect m id

instance MonadIO m => MonadIO (ParsecDSL s u m) where
    liftIO = lift . liftIO

data ParsecF s u m r
    = forall a. Plifted (P.ParsecT s u m a) (a -> r)
    | forall a. Peffect (m a) (a -> r)

    | PgetState (u -> r)
    | PputState u r
    | PmodifyState (u -> u) r
    | PgetPosition (P.SourcePos -> r)
    | PsetPosition P.SourcePos r
    | PgetInput (s -> r)
    | PsetInput s r
    | PgetParserState (P.State s u -> r)
    | PsetParserState (P.State s u) (P.State s u -> r)
    | PupdateParserState (P.State s u -> P.State s u) (P.State s u -> r)

    | forall t. (P.Stream s m t, Eq t)
      => Ptokens ([t] -> String) (P.SourcePos -> [t] -> P.SourcePos)
                [t] ([t] -> r)
    | forall t a. P.Stream s m t
      => PtokenPrimEx (t -> String) (P.SourcePos -> t -> s -> P.SourcePos)
                     (Maybe (P.SourcePos -> t -> s -> u -> u))
                     (t -> Maybe a) (a -> r)

    | P.Stream s m Char => PalphaNum (Char -> r)
    | P.Stream s m Char => PanyChar (Char -> r)
    | forall t. (Show t, P.Stream s m t) => PanyToken (t -> r)
    | P.Stream s m Char => Pchar Char r
    | P.Stream s m Char => Pcrlf (Char -> r)
    | P.Stream s m Char => Pdigit (Char -> r)
    | P.Stream s m Char => PendOfLine (Char -> r)
    | forall t. (Show t, P.Stream s m t) => Peof r
    | P.Stream s m Char => PhexDigit (Char -> r)
    | P.Stream s m Char => Pletter (Char -> r)
    | P.Stream s m Char => Plower (Char -> r)
    | P.Stream s m Char => Pnewline (Char -> r)
    | P.Stream s m Char => PnoneOf [Char] (Char -> r)
    | P.Stream s m Char => PoctDigit (Char -> r)
    | P.Stream s m Char => PoneOf [Char] (Char -> r)
    | PparserFail String
    | PparserZero
    | P.Stream s m Char => Psatisfy (Char -> Bool) (Char -> r)
    | P.Stream s m Char => Pspace (Char -> r)
    | P.Stream s m Char => Pspaces r
    | P.Stream s m Char => Pstring String r
    | P.Stream s m Char => Ptab (Char -> r)
    | P.Stream s m Char => Pupper (Char -> r)
    | Punexpected String

    | forall a. PparserPlus (ParsecDSL s u m a) (ParsecDSL s u m a) (a -> r)
    | forall a. Plabel (ParsecDSL s u m a) String (a -> r)
    | forall a. Plabels (ParsecDSL s u m a) [String] (a -> r)
    | forall a. Ptry (ParsecDSL s u m a) (a -> r)
    | forall a. Pchainl (ParsecDSL s u m a) (ParsecDSL s u m (a -> a -> a)) a (a -> r)
    | forall a. Pchainl1 (ParsecDSL s u m a) (ParsecDSL s u m (a -> a -> a)) (a -> r)
    | forall a. Pchainr (ParsecDSL s u m a) (ParsecDSL s u m (a -> a -> a)) a (a -> r)
    | forall a. Pchainr1 (ParsecDSL s u m a) (ParsecDSL s u m (a -> a -> a)) (a -> r)
    | forall a. Pchoice [ParsecDSL s u m a] (a -> r)
    | forall a. Pcount Int (ParsecDSL s u m a) ([a] -> r)
    | forall a. PlookAhead (ParsecDSL s u m a) (a -> r)
    | forall a. Pmany (ParsecDSL s u m a) ([a] -> r)
    | forall a. Pmany1 (ParsecDSL s u m a) ([a] -> r)
    | forall a. PmanyAccum (a -> [a] -> [a]) (ParsecDSL s u m a) ([a] -> r)
    | forall a. Show a => PnotFollowedBy (ParsecDSL s u m a) r
    | forall a. Poption a (ParsecDSL s u m a) (a -> r)
    | forall a. PoptionMaybe (ParsecDSL s u m a) (Maybe a -> r)
    | forall a. Poptional (ParsecDSL s u m a) r
    | forall a. PskipMany (ParsecDSL s u m a) r
    | forall a. PskipMany1 (ParsecDSL s u m a) r
    | forall end a. PmanyTill (ParsecDSL s u m a) (ParsecDSL s u m end) ([a] -> r)
    | forall open close a. Pbetween (ParsecDSL s u m open) (ParsecDSL s u m close)
                               (ParsecDSL s u m a) (a -> r)
    | forall sep a. PendBy (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)
    | forall sep a. PendBy1 (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)
    | forall sep a. PsepBy (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)
    | forall sep a. PsepBy1 (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)
    | forall sep a. PsepEndBy (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)
    | forall sep a. PsepEndBy1 (ParsecDSL s u m a) (ParsecDSL s u m sep) ([a] -> r)

    | Pidentifier (ParsecDSL s u m String) (String -> r)
    | Preserved (ParsecDSL s u m ()) String r
    | Poperator (ParsecDSL s u m String) (String -> r)
    | PreservedOp (ParsecDSL s u m ()) String r
    | PcharLiteral (ParsecDSL s u m Char) (Char -> r)
    | PstringLiteral (ParsecDSL s u m String) (String -> r)
    | Pnatural (ParsecDSL s u m Integer) (Integer -> r)
    | Pinteger (ParsecDSL s u m Integer) (Integer -> r)
    | Pfloat (ParsecDSL s u m Double) (Double -> r)
    | PnaturalOrFloat (ParsecDSL s u m (Either Integer Double))
                      (Either Integer Double -> r)
    | Pdecimal (ParsecDSL s u m Integer) (Integer -> r)
    | Phexadecimal (ParsecDSL s u m Integer) (Integer -> r)
    | Poctal (ParsecDSL s u m Integer) (Integer -> r)
    | Psymbol (ParsecDSL s u m String) String (String -> r)
    | forall a. Plexeme (ParsecDSL s u m a) (a -> r)
    | PwhiteSpace (ParsecDSL s u m ()) r
    | forall a. Pparens (ParsecDSL s u m a) (a -> r)
    | forall a. Pbraces (ParsecDSL s u m a) (a -> r)
    | forall a. Pangles (ParsecDSL s u m a) (a -> r)
    | forall a. Pbrackets (ParsecDSL s u m a) (a -> r)
    | forall a. Psquares (ParsecDSL s u m a) (a -> r)
    | Psemi (ParsecDSL s u m String) (String -> r)
    | Pcomma (ParsecDSL s u m String) (String -> r)
    | Pcolon (ParsecDSL s u m String) (String -> r)
    | Pdot (ParsecDSL s u m String) (String -> r)
    | forall a. PsemiSep (ParsecDSL s u m [a]) ([a] -> r)
    | forall a. PsemiSep1 (ParsecDSL s u m [a]) ([a] -> r)
    | forall a. PcommaSep (ParsecDSL s u m [a]) ([a] -> r)
    | forall a. PcommaSep1 (ParsecDSL s u m [a]) ([a] -> r)

instance Functor (ParsecF s u m) where
    fmap f (Plifted p k)            = Plifted p (f . k)
    fmap f (Peffect m k)            = Peffect m (f . k)

    fmap f (PgetState k)            = PgetState (f . k)
    fmap f (PputState u r)          = PputState u (f r)
    fmap f (PmodifyState g r)       = PmodifyState g (f r)
    fmap f (PgetPosition k)         = PgetPosition (f . k)
    fmap f (PsetPosition p r)       = PsetPosition p (f r)
    fmap f (PgetInput k)            = PgetInput (f . k)
    fmap f (PsetInput s r)          = PsetInput s (f r)
    fmap f (PgetParserState k)      = PgetParserState (f . k)
    fmap f (PsetParserState s k)    = PsetParserState s (f . k)
    fmap f (PupdateParserState g k) = PupdateParserState g (f . k)

    fmap f (Ptokens a b c k)        = Ptokens a b c (f . k)
    fmap f (PtokenPrimEx a b c d k) = PtokenPrimEx a b c d (f . k)

    fmap f (PalphaNum k)            = PalphaNum (f . k)
    fmap f (PanyChar k)             = PanyChar (f . k)
    fmap f (PanyToken k)            = PanyToken (f . k)
    fmap f (Pchar x r)              = Pchar x (f r)
    fmap f (Pcrlf k)                = Pcrlf (f . k)
    fmap f (Pdigit k)               = Pdigit (f . k)
    fmap f (PendOfLine k)           = PendOfLine (f . k)
    fmap f (Peof r)                 = Peof (f r)
    fmap f (PhexDigit k)            = PhexDigit (f . k)
    fmap f (Pletter k)              = Pletter (f . k)
    fmap f (Plower k)               = Plower (f . k)
    fmap f (Pnewline k)             = Pnewline (f . k)
    fmap f (PnoneOf xs k)           = PnoneOf xs (f . k)
    fmap f (PoctDigit k)            = PoctDigit (f . k)
    fmap f (PoneOf xs k)            = PoneOf xs (f . k)
    fmap _ (PparserFail s)          = PparserFail s
    fmap _ PparserZero              = PparserZero
    fmap f (Psatisfy g k)           = Psatisfy g (f . k)
    fmap f (Pspace k)               = Pspace (f . k)
    fmap f (Pspaces r)              = Pspaces (f r)
    fmap f (Pstring x r)            = Pstring x (f r)
    fmap f (Ptab k)                 = Ptab (f . k)
    fmap f (Pupper k)               = Pupper (f . k)
    fmap _ (Punexpected s)          = Punexpected s

    fmap f (PparserPlus p q k)      = PparserPlus p q (f . k)
    fmap f (Plabel p a k)           = Plabel p a (f . k)
    fmap f (Plabels p a k)          = Plabels p a (f . k)
    fmap f (Ptry p k)               = Ptry p (f . k)
    fmap f (Pchainl p q a k)        = Pchainl p q a (f . k)
    fmap f (Pchainl1 p q k)         = Pchainl1 p q (f . k)
    fmap f (Pchainr p q a k)        = Pchainr p q a (f . k)
    fmap f (Pchainr1 p q k)         = Pchainr1 p q (f . k)
    fmap f (Pchoice xs k)           = Pchoice xs (f . k)
    fmap f (Pcount n p k)           = Pcount n p (f . k)
    fmap f (PlookAhead p k)         = PlookAhead p (f . k)
    fmap f (Pmany p k)              = Pmany p (f . k)
    fmap f (Pmany1 p k)             = Pmany1 p (f . k)
    fmap f (PmanyAccum g p k)       = PmanyAccum g p (f . k)
    fmap f (PnotFollowedBy p r)     = PnotFollowedBy p (f r)
    fmap f (Poption a p k)          = Poption a p (f . k)
    fmap f (PoptionMaybe p k)       = PoptionMaybe p (f . k)
    fmap f (Poptional p r)          = Poptional p (f r)
    fmap f (PskipMany p r)          = PskipMany p (f r)
    fmap f (PskipMany1 p r)         = PskipMany1 p (f r)
    fmap f (PmanyTill p e k)        = PmanyTill p e (f . k)
    fmap f (Pbetween o c p k)       = Pbetween o c p (f . k)
    fmap f (PendBy p s k)           = PendBy p s (f . k)
    fmap f (PendBy1 p s k)          = PendBy1 p s (f . k)
    fmap f (PsepBy p s k)           = PsepBy p s (f . k)
    fmap f (PsepBy1 p s k)          = PsepBy1 p s (f . k)
    fmap f (PsepEndBy p s k)        = PsepEndBy p s (f . k)
    fmap f (PsepEndBy1 p s k)       = PsepEndBy1 p s (f . k)

    fmap f (Pidentifier t k)        = Pidentifier t (f . k)
    fmap f (Preserved t s r)        = Preserved t s (f r)
    fmap f (Poperator t k)          = Poperator t (f . k)
    fmap f (PreservedOp t s r)      = PreservedOp t s (f r)
    fmap f (PcharLiteral t k)       = PcharLiteral t (f . k)
    fmap f (PstringLiteral t k)     = PstringLiteral t (f . k)
    fmap f (Pnatural t k)           = Pnatural t (f . k)
    fmap f (Pinteger t k)           = Pinteger t (f . k)
    fmap f (Pfloat t k)             = Pfloat t (f . k)
    fmap f (PnaturalOrFloat t k)    = PnaturalOrFloat t (f . k)
    fmap f (Pdecimal t k)           = Pdecimal t (f . k)
    fmap f (Phexadecimal t k)       = Phexadecimal t (f . k)
    fmap f (Poctal t k)             = Poctal t (f . k)
    fmap f (Psymbol t s k)          = Psymbol t s (f . k)
    fmap f (Plexeme p k)            = Plexeme p (f . k)
    fmap f (PwhiteSpace t r)        = PwhiteSpace t (f r)
    fmap f (Pparens p k)            = Pparens p (f . k)
    fmap f (Pbraces p k)            = Pbraces p (f . k)
    fmap f (Pangles p k)            = Pangles p (f . k)
    fmap f (Pbrackets p k)          = Pbrackets p (f . k)
    fmap f (Psquares p k)           = Psquares p (f . k)
    fmap f (Psemi t k)              = Psemi t (f . k)
    fmap f (Pcomma t k)             = Pcomma t (f . k)
    fmap f (Pcolon t k)             = Pcolon t (f . k)
    fmap f (Pdot t k)               = Pdot t (f . k)
    fmap f (PsemiSep p k)           = PsemiSep p (f . k)
    fmap f (PsemiSep1 p k)          = PsemiSep1 p (f . k)
    fmap f (PcommaSep p k)          = PcommaSep p (f . k)
    fmap f (PcommaSep1 p k)         = PcommaSep1 p (f . k)

instance Show (ParsecF s u m r) where
    show (Plifted _ _)            = "lifted"
    show (Peffect _ _)            = "effect"

    show (PgetState _)            = "getState"
    show (PputState _ _)          = "putState"
    show (PmodifyState _ _)       = "modifyState"
    show (PgetPosition _)         = "getPosition"
    show (PsetPosition _ _)       = "setPosition"
    show (PgetInput _)            = "getInput"
    show (PsetInput _ _)          = "setInput"
    show (PgetParserState _)      = "getParserState"
    show (PsetParserState _ _)    = "setParserState"
    show (PupdateParserState _ _) = "updateParserState"

    show (Ptokens _ _ _ _)        = "tokens"
    show (PtokenPrimEx _ _ _ _ _) = "tokenPrim"

    show (PalphaNum _)            = "alphaNum"
    show (PanyChar _)             = "anyChar"
    show (PanyToken _)            = "anyToken"
    show (Pchar x _)              = "char " ++ show x
    show (Pcrlf _)                = "crlf"
    show (Pdigit _)               = "digit"
    show (PendOfLine _)           = "endOfLine"
    show (Peof _)                 = "eof"
    show (PhexDigit _)            = "hexDigit"
    show (Pletter _)              = "letter"
    show (Plower _)               = "lower"
    show (Pnewline _)             = "newline"
    show (PnoneOf xs _)           = "noneOf " ++ show xs
    show (PoctDigit _)            = "octDigit"
    show (PoneOf xs _)            = "oneOf " ++ show xs
    show (PparserFail s)          = "parserFail " ++ show s
    show PparserZero              = "parserZero"
    show (Psatisfy _ _)           = "satisfy"
    show (Pspace _)               = "space"
    show (Pspaces _)              = "spaces"
    show (Pstring x _)            = "string " ++ show x
    show (Ptab _)                 = "tab"
    show (Pupper _)               = "upper"
    show (Punexpected s)          = "unexpected " ++ show s

    show (PparserPlus _ _ _)      = "parserPlus"
    show (Plabel _ a _)           = "label " ++ show a
    show (Plabels _ a _)          = "labels " ++ show a
    show (Ptry _ _)               = "try"
    show (Pchainl _ _ _ _)        = "chainl"
    show (Pchainl1 _ _ _)         = "chainl1"
    show (Pchainr _ _ _ _)        = "chainr"
    show (Pchainr1 _ _ _)         = "chainr1"
    show (Pchoice _ _)            = "choice"
    show (Pcount n _ _)           = "count " ++ show n
    show (PlookAhead _ _)         = "lookAhead"
    show (Pmany _ _)              = "many"
    show (Pmany1 _ _)             = "many1"
    show (PmanyAccum _ _ _)       = "manyAccum"
    show (PnotFollowedBy _ _)     = "notFollowedBy"
    show (Poption _ _ _)          = "option"
    show (PoptionMaybe _ _)       = "optionMaybe"
    show (Poptional _ _)          = "optional"
    show (PskipMany _ _)          = "skipMany"
    show (PskipMany1 _ _)         = "skipMany1"
    show (PmanyTill _ _ _)        = "manyTill"
    show (Pbetween _ _ _ _)       = "between"
    show (PendBy _ _ _)           = "endBy"
    show (PendBy1 _ _ _)          = "endBy1"
    show (PsepBy _ _ _)           = "sepBy"
    show (PsepBy1 _ _ _)          = "sepBy1"
    show (PsepEndBy _ _ _)        = "sepEndBy"
    show (PsepEndBy1 _ _ _)       = "sepEndBy1"

    show (Pidentifier _ _)        = "identifier"
    show (Preserved _ s _)        = "reserved " ++ show s
    show (Poperator _ _)          = "operator"
    show (PreservedOp _ s _)      = "reservedOp " ++ show s
    show (PcharLiteral _ _)       = "charLiteral"
    show (PstringLiteral _ _)     = "stringLiteral"
    show (Pnatural _ _)           = "natural"
    show (Pinteger _ _)           = "integer"
    show (Pfloat _ _)             = "float"
    show (PnaturalOrFloat _ _)    = "naturalOrFloat"
    show (Pdecimal _ _)           = "decimal"
    show (Phexadecimal _ _)       = "hexadecimal"
    show (Poctal _ _)             = "octal"
    show (Psymbol _ s _)          = "symbol " ++ show s
    show (Plexeme _ _)            = "lexeme"
    show (PwhiteSpace _ _)        = "whiteSpace"
    show (Pparens _ _)            = "parens"
    show (Pbraces _ _)            = "braces"
    show (Pangles _ _)            = "angles"
    show (Pbrackets _ _)          = "brackets"
    show (Psquares _ _)           = "squares"
    show (Psemi _ _)              = "semi"
    show (Pcomma _ _)             = "comma"
    show (Pcolon _ _)             = "colon"
    show (Pdot _ _)               = "dot"
    show (PsemiSep _ _)           = "semiSep"
    show (PsemiSep1 _ _)          = "semiSep1"
    show (PcommaSep _ _)          = "commaSep"
    show (PcommaSep1 _ _)         = "commaSep1"

liftF' :: ParsecF s u m a -> ParsecDSL s u m a
liftF' x = ParsecDSL $ Free (fmap pure x)

lifted :: P.ParsecT s u m a -> ParsecDSL s u m a
lifted p = liftF' $ Plifted p id

getState :: ParsecDSL s u m u
getState = liftF' $ PgetState id

putState :: u -> ParsecDSL s u m ()
putState u = liftF' $ PputState u ()

modifyState :: (u -> u) -> ParsecDSL s u m ()
modifyState g = liftF' $ PmodifyState g ()

getPosition :: ParsecDSL s u m P.SourcePos
getPosition = liftF' $ PgetPosition id

setPosition :: P.SourcePos -> ParsecDSL s u m ()
setPosition p = liftF' $ PsetPosition p ()

getInput :: ParsecDSL s u m s
getInput = liftF' $ PgetInput id

setInput :: s -> ParsecDSL s u m ()
setInput s = liftF' $ PsetInput s ()

getParserState :: ParsecDSL s u m (P.State s u)
getParserState = liftF' $ PgetParserState id

setParserState :: P.State s u -> ParsecDSL s u m (P.State s u)
setParserState s = liftF' $ PsetParserState s id

updateParserState :: (P.State s u -> P.State s u)
                  -> ParsecDSL s u m (P.State s u)
updateParserState g = liftF' $ PupdateParserState g id

tokens :: (P.Stream s m t, Eq t)
       => ([t] -> String)      -- Pretty print a list of tokens
       -> (P.SourcePos -> [t] -> P.SourcePos)
       -> [t]                  -- List of tokens to parse
       -> ParsecDSL s u m [t]
tokens a b c = liftF' $ Ptokens a b c id

tokenPrimEx :: (P.Stream s m t)
            => (t -> String)
            -> (P.SourcePos -> t -> s -> P.SourcePos)
            -> Maybe (P.SourcePos -> t -> s -> u -> u)
            -> (t -> Maybe a)
            -> ParsecDSL s u m a
tokenPrimEx a b c d = liftF' $ PtokenPrimEx a b c d id

alphaNum :: P.Stream s m Char => ParsecDSL s u m Char
alphaNum = liftF' $ PalphaNum id

anyChar :: P.Stream s m Char => ParsecDSL s u m Char
anyChar = liftF' $ PanyChar id

anyToken :: (Show t, P.Stream s m t) => ParsecDSL s u m t
anyToken = liftF' $ PanyToken id

char :: P.Stream s m Char => Char -> ParsecDSL s u m Char
char x = liftF' $ Pchar x x

crlf :: P.Stream s m Char => ParsecDSL s u m Char
crlf = liftF' $ Pcrlf id

digit :: P.Stream s m Char => ParsecDSL s u m Char
digit = liftF' $ Pdigit id

endOfLine :: P.Stream s m Char => ParsecDSL s u m Char
endOfLine = liftF' $ PendOfLine id

eof :: (Show t, P.Stream s m t) => ParsecDSL s u m ()
eof = liftF' $ Peof ()

hexDigit :: P.Stream s m Char => ParsecDSL s u m Char
hexDigit = liftF' $ PhexDigit id

letter :: P.Stream s m Char => ParsecDSL s u m Char
letter = liftF' $ Pletter id

lower :: P.Stream s m Char => ParsecDSL s u m Char
lower = liftF' $ Plower id

newline :: P.Stream s m Char => ParsecDSL s u m Char
newline = liftF' $ Pnewline id

noneOf :: P.Stream s m Char => [Char] -> ParsecDSL s u m Char
noneOf xs = liftF' $ PnoneOf xs id

octDigit :: P.Stream s m Char => ParsecDSL s u m Char
octDigit = liftF' $ PoctDigit id

oneOf :: P.Stream s m Char => [Char] -> ParsecDSL s u m Char
oneOf xs = liftF' $ PoneOf xs id

parserFail :: String -> ParsecDSL s u m a
parserFail s = liftF' $ PparserFail s

parserZero :: ParsecDSL s u m a
parserZero = liftF' PparserZero

satisfy :: P.Stream s m Char => (Char -> Bool) -> ParsecDSL s u m Char
satisfy g = liftF' $ Psatisfy g id

space :: P.Stream s m Char => ParsecDSL s u m Char
space = liftF' $ Pspace id

spaces :: P.Stream s m Char => ParsecDSL s u m ()
spaces = liftF' $ Pspaces ()

string :: P.Stream s m Char => String -> ParsecDSL s u m String
string x = liftF' $ Pstring x x

tab :: P.Stream s m Char => ParsecDSL s u m Char
tab = liftF' $ Ptab id

upper :: P.Stream s m Char => ParsecDSL s u m Char
upper = liftF' $ Pupper id

unexpected :: String -> ParsecDSL s u m a
unexpected s = liftF' $ Punexpected s

parserPlus :: ParsecDSL s u m a -> ParsecDSL s u m a -> ParsecDSL s u m a
parserPlus p q = liftF' $ PparserPlus p q id

label :: ParsecDSL s u m a -> String -> ParsecDSL s u m a
label p a = liftF' $ Plabel p a id

labels :: ParsecDSL s u m a -> [String] -> ParsecDSL s u m a
labels p a = liftF' $ Plabels p a id

try :: ParsecDSL s u m a -> ParsecDSL s u m a
try p = liftF' $ Ptry p id

chainl :: ParsecDSL s u m a -> ParsecDSL s u m (a -> a -> a) -> a -> ParsecDSL s u m a
chainl p q a = liftF' $ Pchainl p q a id

chainl1 :: ParsecDSL s u m a -> ParsecDSL s u m (a -> a -> a) -> ParsecDSL s u m a
chainl1 p q = liftF' $ Pchainl1 p q id

chainr :: ParsecDSL s u m a -> ParsecDSL s u m (a -> a -> a) -> a -> ParsecDSL s u m a
chainr p q a = liftF' $ Pchainr p q a id

chainr1 :: ParsecDSL s u m a -> ParsecDSL s u m (a -> a -> a) -> ParsecDSL s u m a
chainr1 p q = liftF' $ Pchainr1 p q id

choice :: [ParsecDSL s u m a] -> ParsecDSL s u m a
choice xs = liftF' $ Pchoice xs id

count :: Int -> ParsecDSL s u m a -> ParsecDSL s u m [a]
count n p = liftF' $ Pcount n p id

lookAhead :: ParsecDSL s u m a -> ParsecDSL s u m a
lookAhead p = liftF' $ PlookAhead p id

many :: ParsecDSL s u m a -> ParsecDSL s u m [a]
many p = liftF' $ Pmany p id

many1 :: ParsecDSL s u m a -> ParsecDSL s u m [a]
many1 p = liftF' $ Pmany1 p id

manyAccum :: (a -> [a] -> [a]) -> ParsecDSL s u m a -> ParsecDSL s u m [a]
manyAccum acc p = liftF' $ PmanyAccum acc p id

notFollowedBy :: Show a => ParsecDSL s u m a -> ParsecDSL s u m ()
notFollowedBy p = liftF' $ PnotFollowedBy p ()

option :: a -> ParsecDSL s u m a -> ParsecDSL s u m a
option a p = liftF' $ Poption a p id

optionMaybe :: ParsecDSL s u m a -> ParsecDSL s u m (Maybe a)
optionMaybe p = liftF' $ PoptionMaybe p id

optional :: ParsecDSL s u m a -> ParsecDSL s u m ()
optional p = liftF' $ Poptional p ()

skipMany :: ParsecDSL s u m a -> ParsecDSL s u m ()
skipMany p = liftF' $ PskipMany p ()

skipMany1 :: ParsecDSL s u m a -> ParsecDSL s u m ()
skipMany1 p = liftF' $ PskipMany1 p ()

manyTill :: ParsecDSL s u m a -> ParsecDSL s u m end -> ParsecDSL s u m [a]
manyTill p e = liftF' $ PmanyTill p e id

between :: ParsecDSL s u m open -> ParsecDSL s u m close -> ParsecDSL s u m a
        -> ParsecDSL s u m a
between o c p = liftF' $ Pbetween o c p id

endBy :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
endBy p s = liftF' $ PendBy p s id

endBy1 :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
endBy1 p s = liftF' $ PendBy1 p s id

sepBy :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
sepBy p s = liftF' $ PsepBy p s id

sepBy1 :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
sepBy1 p s = liftF' $ PsepBy1 p s id

sepEndBy :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
sepEndBy p s = liftF' $ PsepEndBy p s id

sepEndBy1 :: ParsecDSL s u m a -> ParsecDSL s u m sep -> ParsecDSL s u m [a]
sepEndBy1 p s = liftF' $ PsepEndBy1 p s id