{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExistentialQuantification #-}
module Data.SExpresso.Parse.Generic
(
SExprParser(..),
getAtom,
getSpace,
getSpacingRule,
setTags,
setTagsFromList,
setTagsFromMap,
setSpace,
setSpacingRule,
setAtom,
SpacingRule(..),
spaceIsMandatory,
spaceIsOptional,
mkSpacingRule,
withLocation,
parseSExprList,
parseSExpr,
decodeOne,
decode
)
where
import Data.Maybe
import qualified Data.Map as M
import Control.Applicative
import Control.Monad (mzero)
import Text.Megaparsec
import Data.SExpresso.SExpr
import Data.SExpresso.Parse.Location
data SpacingRule =
SMandatory
| SOptional
deriving (Int -> SpacingRule -> ShowS
[SpacingRule] -> ShowS
SpacingRule -> String
(Int -> SpacingRule -> ShowS)
-> (SpacingRule -> String)
-> ([SpacingRule] -> ShowS)
-> Show SpacingRule
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SpacingRule] -> ShowS
$cshowList :: [SpacingRule] -> ShowS
show :: SpacingRule -> String
$cshow :: SpacingRule -> String
showsPrec :: Int -> SpacingRule -> ShowS
$cshowsPrec :: Int -> SpacingRule -> ShowS
Show, SpacingRule -> SpacingRule -> Bool
(SpacingRule -> SpacingRule -> Bool)
-> (SpacingRule -> SpacingRule -> Bool) -> Eq SpacingRule
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SpacingRule -> SpacingRule -> Bool
$c/= :: SpacingRule -> SpacingRule -> Bool
== :: SpacingRule -> SpacingRule -> Bool
$c== :: SpacingRule -> SpacingRule -> Bool
Eq)
data SExprParser m b a
= forall c. SExprParser
(m c)
(c -> m b)
(m a)
(m ())
(a -> a -> SpacingRule)
getSpace :: SExprParser m b a -> m ()
getSpace :: SExprParser m b a -> m ()
getSpace (SExprParser m c
_ c -> m b
_ m a
_ m ()
sp a -> a -> SpacingRule
_) = m ()
sp
getSpacingRule :: SExprParser m b a -> (a -> a -> SpacingRule)
getSpacingRule :: SExprParser m b a -> a -> a -> SpacingRule
getSpacingRule (SExprParser m c
_ c -> m b
_ m a
_ m ()
_ a -> a -> SpacingRule
sr) = a -> a -> SpacingRule
sr
getAtom :: SExprParser m b a -> m a
getAtom :: SExprParser m b a -> m a
getAtom (SExprParser m c
_ c -> m b
_ m a
a m ()
_ a -> a -> SpacingRule
_) = m a
a
withLocation :: (MonadParsec e s m, TraversableStream s) => SExprParser m b a -> SExprParser m (Located b) (Located a)
withLocation :: SExprParser m b a -> SExprParser m (Located b) (Located a)
withLocation (SExprParser m c
pSTag c -> m b
pETag m a
atom m ()
sp a -> a -> SpacingRule
sr) =
let s :: m (SourcePos, c)
s = do
SourcePos
pos <- m SourcePos
forall s e (m :: * -> *).
(TraversableStream s, MonadParsec e s m) =>
m SourcePos
getSourcePos
c
c <- m c
pSTag
(SourcePos, c) -> m (SourcePos, c)
forall (m :: * -> *) a. Monad m => a -> m a
return (SourcePos
pos, c
c)
e :: (SourcePos, c) -> m (Located b)
e = \(SourcePos
pos, c
c) -> do
b
b <- c -> m b
pETag c
c
SourcePos
pos2 <- m SourcePos
forall s e (m :: * -> *).
(TraversableStream s, MonadParsec e s m) =>
m SourcePos
getSourcePos
Located b -> m (Located b)
forall (m :: * -> *) a. Monad m => a -> m a
return (Located b -> m (Located b)) -> Located b -> m (Located b)
forall a b. (a -> b) -> a -> b
$ Location -> b -> Located b
forall a. Location -> a -> Located a
At (SourcePos -> SourcePos -> Location
Span SourcePos
pos SourcePos
pos2) b
b
in m (SourcePos, c)
-> ((SourcePos, c) -> m (Located b))
-> m (Located a)
-> m ()
-> (Located a -> Located a -> SpacingRule)
-> SExprParser m (Located b) (Located a)
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser m (SourcePos, c)
s (SourcePos, c) -> m (Located b)
e (m a -> m (Located a)
forall e s (m :: * -> *) a.
(MonadParsec e s m, TraversableStream s) =>
m a -> m (Located a)
located m a
atom) m ()
sp (\(At Location
_ a
a1) (At Location
_ a
a2) -> a -> a -> SpacingRule
sr a
a1 a
a2)
setAtom :: m a -> (a -> a -> SpacingRule) -> SExprParser m b a' -> SExprParser m b a
setAtom :: m a
-> (a -> a -> SpacingRule)
-> SExprParser m b a'
-> SExprParser m b a
setAtom m a
a a -> a -> SpacingRule
sr (SExprParser m c
pSTag c -> m b
pETag m a'
_ m ()
sp a' -> a' -> SpacingRule
_) = m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser m c
pSTag c -> m b
pETag m a
a m ()
sp a -> a -> SpacingRule
sr
setTags :: m c -> (c -> m b) -> SExprParser m b' a -> SExprParser m b a
setTags :: m c -> (c -> m b) -> SExprParser m b' a -> SExprParser m b a
setTags m c
s c -> m b
e (SExprParser m c
_ c -> m b'
_ m a
a m ()
sp a -> a -> SpacingRule
sr) = m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser m c
s c -> m b
e m a
a m ()
sp a -> a -> SpacingRule
sr
setTagsFromList :: (MonadParsec e s m) =>
[(Tokens s, Tokens s, b)] -> SExprParser m b' a -> SExprParser m b a
setTagsFromList :: [(Tokens s, Tokens s, b)]
-> SExprParser m b' a -> SExprParser m b a
setTagsFromList [(Tokens s, Tokens s, b)]
l SExprParser m b' a
p =
let m :: Map (Tokens s) [(Tokens s, b)]
m = ([(Tokens s, b)] -> [(Tokens s, b)] -> [(Tokens s, b)])
-> [(Tokens s, [(Tokens s, b)])] -> Map (Tokens s) [(Tokens s, b)]
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
M.fromListWith [(Tokens s, b)] -> [(Tokens s, b)] -> [(Tokens s, b)]
forall a. [a] -> [a] -> [a]
(++) ([(Tokens s, [(Tokens s, b)])] -> Map (Tokens s) [(Tokens s, b)])
-> [(Tokens s, [(Tokens s, b)])] -> Map (Tokens s) [(Tokens s, b)]
forall a b. (a -> b) -> a -> b
$ ((Tokens s, Tokens s, b) -> (Tokens s, [(Tokens s, b)]))
-> [(Tokens s, Tokens s, b)] -> [(Tokens s, [(Tokens s, b)])]
forall a b. (a -> b) -> [a] -> [b]
map (\(Tokens s
s,Tokens s
e,b
b) -> (Tokens s
s, [(Tokens s
e,b
b)])) [(Tokens s, Tokens s, b)]
l
in Map (Tokens s) [(Tokens s, b)]
-> SExprParser m b' a -> SExprParser m b a
forall e s (m :: * -> *) b b' a.
MonadParsec e s m =>
Map (Tokens s) [(Tokens s, b)]
-> SExprParser m b' a -> SExprParser m b a
setTagsFromMap Map (Tokens s) [(Tokens s, b)]
m SExprParser m b' a
p
setTagsFromMap :: (MonadParsec e s m) =>
M.Map (Tokens s) [(Tokens s, b)] -> SExprParser m b' a -> SExprParser m b a
setTagsFromMap :: Map (Tokens s) [(Tokens s, b)]
-> SExprParser m b' a -> SExprParser m b a
setTagsFromMap Map (Tokens s) [(Tokens s, b)]
m SExprParser m b' a
p =
let l :: [(Tokens s, [(Tokens s, b)])]
l = Map (Tokens s) [(Tokens s, b)] -> [(Tokens s, [(Tokens s, b)])]
forall k a. Map k a -> [(k, a)]
M.toList Map (Tokens s) [(Tokens s, b)]
m
choose :: [(Tokens s, a)] -> f a
choose [] = f a
forall (f :: * -> *) a. Alternative f => f a
empty
choose ((Tokens s
s, a
eb) : [(Tokens s, a)]
ts) = (Tokens s -> f (Tokens s)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
chunk Tokens s
s f (Tokens s) -> f a -> f a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> f a
forall (m :: * -> *) a. Monad m => a -> m a
return a
eb) f a -> f a -> f a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [(Tokens s, a)] -> f a
choose [(Tokens s, a)]
ts
stag :: m [(Tokens s, b)]
stag = [(Tokens s, [(Tokens s, b)])] -> m [(Tokens s, b)]
forall (f :: * -> *) e s a.
MonadParsec e s f =>
[(Tokens s, a)] -> f a
choose [(Tokens s, [(Tokens s, b)])]
l
etag :: [(Tokens s, a)] -> m a
etag = \[(Tokens s, a)]
xs -> [m a] -> m a
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice ([m a] -> m a) -> [m a] -> m a
forall a b. (a -> b) -> a -> b
$ ((Tokens s, a) -> m a) -> [(Tokens s, a)] -> [m a]
forall a b. (a -> b) -> [a] -> [b]
map (\(Tokens s
e, a
b) -> Tokens s -> m (Tokens s)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
chunk Tokens s
e m (Tokens s) -> m a -> m a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
b) [(Tokens s, a)]
xs
in m [(Tokens s, b)]
-> ([(Tokens s, b)] -> m b)
-> SExprParser m b' a
-> SExprParser m b a
forall (m :: * -> *) c b b' a.
m c -> (c -> m b) -> SExprParser m b' a -> SExprParser m b a
setTags m [(Tokens s, b)]
stag [(Tokens s, b)] -> m b
forall a. [(Tokens s, a)] -> m a
etag SExprParser m b' a
p
spaceIsMandatory :: a -> a -> SpacingRule
spaceIsMandatory :: a -> a -> SpacingRule
spaceIsMandatory = \a
_ a
_ -> SpacingRule
SMandatory
spaceIsOptional :: a -> a -> SpacingRule
spaceIsOptional :: a -> a -> SpacingRule
spaceIsOptional = \a
_ a
_ -> SpacingRule
SOptional
setSpacingRule :: (a -> a -> SpacingRule) -> SExprParser m b a -> SExprParser m b a
setSpacingRule :: (a -> a -> SpacingRule) -> SExprParser m b a -> SExprParser m b a
setSpacingRule a -> a -> SpacingRule
r p :: SExprParser m b a
p@(SExprParser m c
pSTag c -> m b
pETag m a
_ m ()
_ a -> a -> SpacingRule
_) = m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser m c
pSTag c -> m b
pETag (SExprParser m b a -> m a
forall (m :: * -> *) b a. SExprParser m b a -> m a
getAtom SExprParser m b a
p) (SExprParser m b a -> m ()
forall (m :: * -> *) b a. SExprParser m b a -> m ()
getSpace SExprParser m b a
p) a -> a -> SpacingRule
r
mkSpacingRule :: (a -> SpacingRule) -> (a -> a -> SpacingRule)
mkSpacingRule :: (a -> SpacingRule) -> a -> a -> SpacingRule
mkSpacingRule a -> SpacingRule
f = \a
a1 a
a2 -> case a -> SpacingRule
f a
a1 of
SpacingRule
SOptional -> SpacingRule
SOptional
SpacingRule
SMandatory -> a -> SpacingRule
f a
a2
setSpace :: m () -> SExprParser m b a -> SExprParser m b a
setSpace :: m () -> SExprParser m b a -> SExprParser m b a
setSpace m ()
sp (SExprParser m c
s c -> m b
e m a
a m ()
_ a -> a -> SpacingRule
sr) = m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser m c
s c -> m b
e m a
a m ()
sp a -> a -> SpacingRule
sr
spaceIsOK :: (a -> a -> SpacingRule) -> (SExpr b a) -> (SExpr b a) -> Bool -> Bool
spaceIsOK :: (a -> a -> SpacingRule) -> SExpr b a -> SExpr b a -> Bool -> Bool
spaceIsOK a -> a -> SpacingRule
getSpacingRule' SExpr b a
sexp1 SExpr b a
sexp2 Bool
spaceInBetween =
case (SExpr b a
sexp1, SExpr b a
sexp2, Bool
spaceInBetween) of
(SExpr b a
_, SExpr b a
_, Bool
True) -> Bool
True
(SList b
_ [SExpr b a]
_, SExpr b a
_, Bool
_) -> Bool
True
(SExpr b a
_, SList b
_ [SExpr b a]
_, Bool
_) -> Bool
True
(SAtom a
a1, SAtom a
a2, Bool
_) -> a -> a -> SpacingRule
getSpacingRule' a
a1 a
a2 SpacingRule -> SpacingRule -> Bool
forall a. Eq a => a -> a -> Bool
== SpacingRule
SOptional
sepEndBy' :: (MonadParsec e s m, TraversableStream s) => m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy' :: m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy' m (SExpr b a)
p m ()
sep a -> a -> SpacingRule
f = m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy1' m (SExpr b a)
p m ()
sep a -> a -> SpacingRule
f m [SExpr b a] -> m [SExpr b a] -> m [SExpr b a]
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [SExpr b a] -> m [SExpr b a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
sepEndBy1' :: (MonadParsec e s m, TraversableStream s) => m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy1' :: m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy1' m (SExpr b a)
p m ()
sep a -> a -> SpacingRule
f = do
SExpr b a
x <- m (SExpr b a)
p
[SExpr b a]
xs <- SExpr b a -> m [SExpr b a]
forall e s.
(MonadParsec e s m, TraversableStream s) =>
SExpr b a -> m [SExpr b a]
parseContent SExpr b a
x
[SExpr b a] -> m [SExpr b a]
forall (m :: * -> *) a. Monad m => a -> m a
return ([SExpr b a] -> m [SExpr b a]) -> [SExpr b a] -> m [SExpr b a]
forall a b. (a -> b) -> a -> b
$ SExpr b a
x SExpr b a -> [SExpr b a] -> [SExpr b a]
forall a. a -> [a] -> [a]
: [SExpr b a]
xs
where parseContent :: SExpr b a -> m [SExpr b a]
parseContent SExpr b a
a1 = do
Bool
s <- Bool -> (() -> Bool) -> Maybe () -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> () -> Bool
forall a b. a -> b -> a
const Bool
True) (Maybe () -> Bool) -> m (Maybe ()) -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m () -> m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m ()
sep
Maybe SourcePos
mpos <- if Bool -> Bool
not Bool
s then SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just (SourcePos -> Maybe SourcePos)
-> m SourcePos -> m (Maybe SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m SourcePos
forall s e (m :: * -> *).
(TraversableStream s, MonadParsec e s m) =>
m SourcePos
getSourcePos else Maybe SourcePos -> m (Maybe SourcePos)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe SourcePos
forall a. Maybe a
Nothing
Maybe (SExpr b a)
mx <- m (SExpr b a) -> m (Maybe (SExpr b a))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m (SExpr b a)
p
case Maybe (SExpr b a)
mx of
Maybe (SExpr b a)
Nothing -> [SExpr b a] -> m [SExpr b a]
forall (m :: * -> *) a. Monad m => a -> m a
return []
Just SExpr b a
a2 ->
if (a -> a -> SpacingRule) -> SExpr b a -> SExpr b a -> Bool -> Bool
forall a b.
(a -> a -> SpacingRule) -> SExpr b a -> SExpr b a -> Bool -> Bool
spaceIsOK a -> a -> SpacingRule
f SExpr b a
a1 SExpr b a
a2 Bool
s
then do
[SExpr b a]
xs <- SExpr b a -> m [SExpr b a]
parseContent SExpr b a
a2
[SExpr b a] -> m [SExpr b a]
forall (m :: * -> *) a. Monad m => a -> m a
return ([SExpr b a] -> m [SExpr b a]) -> [SExpr b a] -> m [SExpr b a]
forall a b. (a -> b) -> a -> b
$ SExpr b a
a2 SExpr b a -> [SExpr b a] -> [SExpr b a]
forall a. a -> [a] -> [a]
: [SExpr b a]
xs
else String -> m [SExpr b a] -> m [SExpr b a]
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
label (String
"The previous two atoms are not separated by space.\n" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
String
"A space was expected at " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> SourcePos -> String
sourcePosPretty (Maybe SourcePos -> SourcePos
forall a. HasCallStack => Maybe a -> a
fromJust Maybe SourcePos
mpos)) m [SExpr b a]
forall (m :: * -> *) a. MonadPlus m => m a
mzero
parseSExprList :: (MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExprList :: SExprParser m b a -> m (SExpr b a)
parseSExprList def :: SExprParser m b a
def@(SExprParser m c
pSTag c -> m b
pETag m a
_ m ()
sp a -> a -> SpacingRule
sr) = do
c
c <- m c
pSTag
Maybe ()
_ <- m () -> m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m ()
sp
[SExpr b a]
xs <- m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy' (SExprParser m b a -> m (SExpr b a)
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExpr SExprParser m b a
def) m ()
sp a -> a -> SpacingRule
sr
b
b <- c -> m b
pETag c
c
SExpr b a -> m (SExpr b a)
forall (m :: * -> *) a. Monad m => a -> m a
return (SExpr b a -> m (SExpr b a)) -> SExpr b a -> m (SExpr b a)
forall a b. (a -> b) -> a -> b
$ b -> [SExpr b a] -> SExpr b a
forall b a. b -> [SExpr b a] -> SExpr b a
SList b
b [SExpr b a]
xs
parseSExpr :: (MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExpr :: SExprParser m b a -> m (SExpr b a)
parseSExpr SExprParser m b a
def = (SExprParser m b a -> m a
forall (m :: * -> *) b a. SExprParser m b a -> m a
getAtom SExprParser m b a
def m a -> (a -> m (SExpr b a)) -> m (SExpr b a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= SExpr b a -> m (SExpr b a)
forall (m :: * -> *) a. Monad m => a -> m a
return (SExpr b a -> m (SExpr b a))
-> (a -> SExpr b a) -> a -> m (SExpr b a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> SExpr b a
forall b a. a -> SExpr b a
SAtom) m (SExpr b a) -> m (SExpr b a) -> m (SExpr b a)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (SExprParser m b a -> m (SExpr b a)
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExprList SExprParser m b a
def)
decodeOne :: (MonadParsec e s m, TraversableStream s) => SExprParser m b a -> m (SExpr b a)
decodeOne :: SExprParser m b a -> m (SExpr b a)
decodeOne SExprParser m b a
def =
let ws :: m ()
ws = SExprParser m b a -> m ()
forall (m :: * -> *) b a. SExprParser m b a -> m ()
getSpace SExprParser m b a
def
in m () -> m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m ()
ws m (Maybe ()) -> m (SExpr b a) -> m (SExpr b a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> SExprParser m b a -> m (SExpr b a)
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExpr SExprParser m b a
def m (SExpr b a) -> m () -> m (SExpr b a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (m () -> m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m ()
ws m (Maybe ()) -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
decode :: (MonadParsec e s m, TraversableStream s) => SExprParser m b a -> m [SExpr b a]
decode :: SExprParser m b a -> m [SExpr b a]
decode SExprParser m b a
def =
let ws :: m ()
ws = SExprParser m b a -> m ()
forall (m :: * -> *) b a. SExprParser m b a -> m ()
getSpace SExprParser m b a
def
in m () -> m (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional m ()
ws m (Maybe ()) -> m [SExpr b a] -> m [SExpr b a]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
m (SExpr b a) -> m () -> (a -> a -> SpacingRule) -> m [SExpr b a]
sepEndBy' (SExprParser m b a -> m (SExpr b a)
forall e s (m :: * -> *) b a.
(MonadParsec e s m, TraversableStream s) =>
SExprParser m b a -> m (SExpr b a)
parseSExpr SExprParser m b a
def) m ()
ws (SExprParser m b a -> a -> a -> SpacingRule
forall (m :: * -> *) b a.
SExprParser m b a -> a -> a -> SpacingRule
getSpacingRule SExprParser m b a
def) m [SExpr b a] -> m () -> m [SExpr b a]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* m ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof