module Parsley.ParserOps (module Parsley.ParserOps) where
import Prelude hiding (pure)
import Control.Arrow (first)
import Parsley.Internal (Parser, WQ, Defunc(BLACK))
import qualified Parsley.Internal as Internal (pure, satisfy, conditional)
class ParserOps rep where
pure :: rep a -> Parser a
satisfy :: rep (Char -> Bool)
-> Parser Char
conditional :: [(rep (a -> Bool), Parser b)]
-> Parser a
-> Parser b
-> Parser b
instance ParserOps WQ where
pure :: WQ a -> Parser a
pure = Defunc a -> Parser a
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure (Defunc a -> Parser a) -> (WQ a -> Defunc a) -> WQ a -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WQ a -> Defunc a
forall a. WQ a -> Defunc a
BLACK
satisfy :: WQ (Char -> Bool) -> Parser Char
satisfy = Defunc (Char -> Bool) -> Parser Char
forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
satisfy (Defunc (Char -> Bool) -> Parser Char)
-> (WQ (Char -> Bool) -> Defunc (Char -> Bool))
-> WQ (Char -> Bool)
-> Parser Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WQ (Char -> Bool) -> Defunc (Char -> Bool)
forall a. WQ a -> Defunc a
BLACK
conditional :: [(WQ (a -> Bool), Parser b)] -> Parser a -> Parser b -> Parser b
conditional = [(Defunc (a -> Bool), Parser b)]
-> Parser a -> Parser b -> Parser b
forall (rep :: Type -> Type) a b.
ParserOps rep =>
[(rep (a -> Bool), Parser b)] -> Parser a -> Parser b -> Parser b
conditional ([(Defunc (a -> Bool), Parser b)]
-> Parser a -> Parser b -> Parser b)
-> ([(WQ (a -> Bool), Parser b)]
-> [(Defunc (a -> Bool), Parser b)])
-> [(WQ (a -> Bool), Parser b)]
-> Parser a
-> Parser b
-> Parser b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((WQ (a -> Bool), Parser b) -> (Defunc (a -> Bool), Parser b))
-> [(WQ (a -> Bool), Parser b)] -> [(Defunc (a -> Bool), Parser b)]
forall a b. (a -> b) -> [a] -> [b]
map ((WQ (a -> Bool) -> Defunc (a -> Bool))
-> (WQ (a -> Bool), Parser b) -> (Defunc (a -> Bool), Parser b)
forall (a :: Type -> Type -> Type) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first WQ (a -> Bool) -> Defunc (a -> Bool)
forall a. WQ a -> Defunc a
BLACK)
instance {-# INCOHERENT #-} x ~ Defunc => ParserOps x where
pure :: x a -> Parser a
pure = x a -> Parser a
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
Internal.pure
satisfy :: x (Char -> Bool) -> Parser Char
satisfy = x (Char -> Bool) -> Parser Char
forall (rep :: Type -> Type).
ParserOps rep =>
rep (Char -> Bool) -> Parser Char
Internal.satisfy
conditional :: [(x (a -> Bool), Parser b)] -> Parser a -> Parser b -> Parser b
conditional = [(x (a -> Bool), Parser b)] -> Parser a -> Parser b -> Parser b
forall (rep :: Type -> Type) a b.
ParserOps rep =>
[(rep (a -> Bool), Parser b)] -> Parser a -> Parser b -> Parser b
Internal.conditional