{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Control.Monad.Parser.Class
( module Control.Monad.Parser.Class,
)
where
import Control.Applicative ((<**>))
import Data.Kind (Type)
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.List.NonEmpty as NonEmpty
import Data.Stream
infixl 3 <|>
infixl 1 <?>
class (Monad m, Stream (Input m)) => MonadParser m where
type Input m :: Type
parseStream :: m (Input m)
setParseStream :: Input m -> m ()
noParse :: m a
item :: m (Item (Input m))
followedBy :: m a -> m ()
notFollowedBy :: m a -> m ()
try :: m a -> m a
(<|>) :: m a -> m a -> m a
(<?>) :: m a -> String -> m a
eof :: MonadParser m => m ()
eof :: m ()
eof = m (Item (Input m)) -> m ()
forall (m :: * -> *) a. MonadParser m => m a -> m ()
notFollowedBy m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item m () -> String -> m ()
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> String
"end of input"
expected :: MonadParser m => String -> m a
expected :: String -> m a
expected String
s = m a
forall (m :: * -> *) a. MonadParser m => m a
noParse m a -> String -> m a
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> String
s
satisfy :: MonadParser m => m a -> (a -> Bool) -> m a
satisfy :: m a -> (a -> Bool) -> m a
satisfy m a
p a -> Bool
f = m a -> m a
forall (m :: * -> *) a. MonadParser m => m a -> m a
try (m a -> m a) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ do
a
i <- m a
p
if a -> Bool
f a
i
then a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
i
else m a
forall (m :: * -> *) a. MonadParser m => m a
noParse
match :: MonadParser m => (Item (Input m) -> Bool) -> m (Item (Input m))
match :: (Item (Input m) -> Bool) -> m (Item (Input m))
match = m (Item (Input m))
-> (Item (Input m) -> Bool) -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> (a -> Bool) -> m a
satisfy m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item
optional :: MonadParser m => m a -> m (Maybe a)
optional :: m a -> m (Maybe a)
optional m a
p = a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
p m (Maybe a) -> m (Maybe a) -> m (Maybe a)
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
<|> Maybe a -> m (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
choice :: MonadParser m => [m a] -> m a
choice :: [m a] -> m a
choice = (m a -> m a -> m a) -> m a -> [m a] -> m a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr m a -> m a -> m a
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
(<|>) m a
forall (m :: * -> *) a. MonadParser m => m a
noParse
many :: MonadParser m => m a -> m [a]
many :: m a -> m [a]
many m a
p = ((:) (a -> [a] -> [a]) -> m a -> m ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
p m ([a] -> [a]) -> m [a] -> m [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m [a]
many m a
p) m [a] -> m [a] -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
<|> [a] -> m [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
many1 :: MonadParser m => m a -> m [a]
many1 :: m a -> m [a]
many1 m a
p = (:) (a -> [a] -> [a]) -> m a -> m ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
p m ([a] -> [a]) -> m [a] -> m [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m [a]
many m a
p
some :: MonadParser m => m a -> m (NonEmpty a)
some :: m a -> m (NonEmpty a)
some m a
p = a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
(:|) (a -> [a] -> NonEmpty a) -> m a -> m ([a] -> NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
p m ([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m [a]
many m a
p
sepBy1 :: MonadParser m => m a -> m b -> m (NonEmpty a)
sepBy1 :: m a -> m b -> m (NonEmpty a)
sepBy1 m a
a m b
b = a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
(:|) (a -> [a] -> NonEmpty a) -> m a -> m ([a] -> NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
a m ([a] -> NonEmpty a) -> m [a] -> m (NonEmpty a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m [a]
many (m b
b m b -> m a -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m a
a)
sepBy :: MonadParser m => m a -> m b -> m [a]
sepBy :: m a -> m b -> m [a]
sepBy m a
a m b
b = NonEmpty a -> [a]
forall a. NonEmpty a -> [a]
NonEmpty.toList (NonEmpty a -> [a]) -> m (NonEmpty a) -> m [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a -> m b -> m (NonEmpty a)
forall (m :: * -> *) a b.
MonadParser m =>
m a -> m b -> m (NonEmpty a)
sepBy1 m a
a m b
b m [a] -> m [a] -> m [a]
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
<|> [a] -> m [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
like ::
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
Item (Input m) ->
m (Item (Input m))
like :: Item (Input m) -> m (Item (Input m))
like Item (Input m)
a = m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item m (Item (Input m))
-> (Item (Input m) -> Bool) -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> (a -> Bool) -> m a
`satisfy` (Item (Input m) -> Item (Input m) -> Bool
forall a. Eq a => a -> a -> Bool
== Item (Input m)
a) m (Item (Input m)) -> String -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> Item (Input m) -> String
forall a. Show a => a -> String
show Item (Input m)
a
unlike ::
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
Item (Input m) ->
m (Item (Input m))
unlike :: Item (Input m) -> m (Item (Input m))
unlike Item (Input m)
a = m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item m (Item (Input m))
-> (Item (Input m) -> Bool) -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> (a -> Bool) -> m a
`satisfy` (Item (Input m) -> Item (Input m) -> Bool
forall a. Eq a => a -> a -> Bool
/= Item (Input m)
a) m (Item (Input m)) -> String -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> String
"anything but " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Item (Input m) -> String
forall a. Show a => a -> String
show Item (Input m)
a
string ::
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
[Item (Input m)] ->
m [Item (Input m)]
string :: [Item (Input m)] -> m [Item (Input m)]
string [] = [Item (Input m)] -> m [Item (Input m)]
forall (m :: * -> *) a. Monad m => a -> m a
return []
string (Item (Input m)
x : [Item (Input m)]
xs) = Item (Input m) -> m (Item (Input m))
forall (m :: * -> *).
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
Item (Input m) -> m (Item (Input m))
like Item (Input m)
x m (Item (Input m)) -> m [Item (Input m)] -> m [Item (Input m)]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Item (Input m)] -> m [Item (Input m)]
forall (m :: * -> *).
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
[Item (Input m)] -> m [Item (Input m)]
string [Item (Input m)]
xs m [Item (Input m)] -> m [Item (Input m)] -> m [Item (Input m)]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [Item (Input m)] -> m [Item (Input m)]
forall (m :: * -> *) a. Monad m => a -> m a
return (Item (Input m)
x Item (Input m) -> [Item (Input m)] -> [Item (Input m)]
forall a. a -> [a] -> [a]
: [Item (Input m)]
xs)
oneOf ::
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
[Item (Input m)] ->
m (Item (Input m))
oneOf :: [Item (Input m)] -> m (Item (Input m))
oneOf [Item (Input m)]
l = m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item m (Item (Input m))
-> (Item (Input m) -> Bool) -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> (a -> Bool) -> m a
`satisfy` (Item (Input m) -> [Item (Input m)] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Item (Input m)]
l) m (Item (Input m)) -> String -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> String
"one of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Item (Input m)] -> String
forall a. Show a => a -> String
show [Item (Input m)]
l
noneOf ::
(MonadParser m, Eq (Item (Input m)), Show (Item (Input m))) =>
[Item (Input m)] ->
m (Item (Input m))
noneOf :: [Item (Input m)] -> m (Item (Input m))
noneOf [Item (Input m)]
l = m (Item (Input m))
forall (m :: * -> *). MonadParser m => m (Item (Input m))
item m (Item (Input m))
-> (Item (Input m) -> Bool) -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> (a -> Bool) -> m a
`satisfy` (Item (Input m) -> [Item (Input m)] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Item (Input m)]
l) m (Item (Input m)) -> String -> m (Item (Input m))
forall (m :: * -> *) a. MonadParser m => m a -> String -> m a
<?> String
"none of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Item (Input m)] -> String
forall a. Show a => a -> String
show [Item (Input m)]
l
chainl1 :: MonadParser m => m a -> m (a -> a -> a) -> m a
chainl1 :: m a -> m (a -> a -> a) -> m a
chainl1 m a
p m (a -> a -> a)
op = m a
scan
where
scan :: m a
scan = m a
p m a -> m (a -> a) -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> m (a -> a)
rst
rst :: m (a -> a)
rst = (\a -> a -> a
f a
y a -> a
g a
x -> a -> a
g (a -> a -> a
f a
x a
y)) ((a -> a -> a) -> a -> (a -> a) -> a -> a)
-> m (a -> a -> a) -> m (a -> (a -> a) -> a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (a -> a -> a)
op m (a -> (a -> a) -> a -> a) -> m a -> m ((a -> a) -> a -> a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a
p m ((a -> a) -> a -> a) -> m (a -> a) -> m (a -> a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m (a -> a)
rst m (a -> a) -> m (a -> a) -> m (a -> a)
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
<|> (a -> a) -> m (a -> a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> a
forall a. a -> a
id
chainr1 :: MonadParser m => m a -> m (a -> a -> a) -> m a
chainr1 :: m a -> m (a -> a -> a) -> m a
chainr1 m a
p m (a -> a -> a)
op = m a
scan
where
scan :: m a
scan = m a
p m a -> m (a -> a) -> m a
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> m (a -> a)
rst
rst :: m (a -> a)
rst = ((a -> a -> a) -> a -> a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> a -> a) -> a -> a -> a)
-> m (a -> a -> a) -> m (a -> a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (a -> a -> a)
op m (a -> a -> a) -> m a -> m (a -> a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m a
scan) m (a -> a) -> m (a -> a) -> m (a -> a)
forall (m :: * -> *) a. MonadParser m => m a -> m a -> m a
<|> (a -> a) -> m (a -> a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> a
forall a. a -> a
id
withInput :: MonadParser m => Input m -> m a -> m (a, Input m)
withInput :: Input m -> m a -> m (a, Input m)
withInput Input m
s' m a
p = do
Input m
s <- m (Input m)
forall (m :: * -> *). MonadParser m => m (Input m)
parseStream
Input m -> m ()
forall (m :: * -> *). MonadParser m => Input m -> m ()
setParseStream Input m
s'
a
x <- m a
p
Input m
s'' <- m (Input m)
forall (m :: * -> *). MonadParser m => m (Input m)
parseStream
Input m -> m ()
forall (m :: * -> *). MonadParser m => Input m -> m ()
setParseStream Input m
s
(a, Input m) -> m (a, Input m)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x, Input m
s'')