{-# LANGUAGE PatternSynonyms #-}
module Parsley.Fold (
many, some, manyN,
skipMany, skipSome, skipManyN,
sepBy, sepBy1, endBy, endBy1, sepEndBy, sepEndBy1,
chainl1, chainr1, chainl, chainr,
infixl1, infixr1, prefix, postfix,
manyr, manyl,
somer, somel
) where
import Prelude hiding (pure, (<*>), (<$>), (*>), (<*))
import Parsley.Alternative ((<|>), option)
import Parsley.Applicative (pure, (<*>), (<$>), (*>), (<*), (<:>), (<**>), void)
import Parsley.Defunctionalized (Defunc(FLIP, ID, COMPOSE, EMPTY, CONS, CONST, APP_H), pattern FLIP_H, pattern UNIT)
import Parsley.Internal (Parser)
import Parsley.ParserOps (ParserOps)
import Parsley.Register (get, modify, newRegister, newRegister_)
import qualified Parsley.Internal as Internal (loop)
loop :: Parser () -> Parser a -> Parser a
loop :: Parser () -> Parser a -> Parser a
loop = Parser () -> Parser a -> Parser a
forall a. Parser () -> Parser a -> Parser a
Internal.loop
prefix :: Parser (a -> a) -> Parser a -> Parser a
prefix :: Parser (a -> a) -> Parser a -> Parser a
prefix Parser (a -> a)
op Parser a
p =
Defunc (a -> a)
-> (forall r. Reg r (a -> a) -> Parser (a -> a)) -> Parser (a -> a)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep a -> (forall r. Reg r a -> Parser b) -> Parser b
newRegister_ Defunc (a -> a)
forall a1. Defunc (a1 -> a1)
ID (\Reg r (a -> a)
r ->
Parser () -> Parser (a -> a) -> Parser (a -> a)
forall a. Parser () -> Parser a -> Parser a
loop (Reg r (a -> a) -> Parser ((a -> a) -> a -> a) -> Parser ()
forall r a. Reg r a -> Parser (a -> a) -> Parser ()
modify Reg r (a -> a)
r (Defunc ((a -> a) -> (a -> a) -> a -> a)
-> Defunc ((a -> a) -> (a -> a) -> a -> a)
forall y x a b c.
((x -> y) ~ ((a -> b -> c) -> b -> a -> c)) =>
Defunc x -> Defunc y
FLIP_H Defunc ((a -> a) -> (a -> a) -> a -> a)
forall b c a1. Defunc ((b -> c) -> (a1 -> b) -> a1 -> c)
COMPOSE Defunc ((a -> a) -> (a -> a) -> a -> a)
-> Parser (a -> a) -> Parser ((a -> a) -> a -> a)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser (a -> a)
op))
(Reg r (a -> a) -> Parser (a -> a)
forall r a. Reg r a -> Parser a
get Reg r (a -> a)
r))
Parser (a -> a) -> Parser a -> Parser a
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser a
p
postfix :: Parser a -> Parser (a -> a) -> Parser a
postfix :: Parser a -> Parser (a -> a) -> Parser a
postfix Parser a
p Parser (a -> a)
op =
Parser a -> (forall r. Reg r a -> Parser a) -> Parser a
forall a b. Parser a -> (forall r. Reg r a -> Parser b) -> Parser b
newRegister Parser a
p ((forall r. Reg r a -> Parser a) -> Parser a)
-> (forall r. Reg r a -> Parser a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Reg r a
r ->
Parser () -> Parser a -> Parser a
forall a. Parser () -> Parser a -> Parser a
loop (Reg r a -> Parser (a -> a) -> Parser ()
forall r a. Reg r a -> Parser (a -> a) -> Parser ()
modify Reg r a
r Parser (a -> a)
op)
(Reg r a -> Parser a
forall r a. Reg r a -> Parser a
get Reg r a
r)
manyr :: (ParserOps repf, ParserOps repk) => repf (a -> b -> b) -> repk b -> Parser a -> Parser b
manyr :: repf (a -> b -> b) -> repk b -> Parser a -> Parser b
manyr repf (a -> b -> b)
f repk b
k Parser a
p = Parser (b -> b) -> Parser b -> Parser b
forall a. Parser (a -> a) -> Parser a -> Parser a
prefix (repf (a -> b -> b)
f repf (a -> b -> b) -> Parser a -> Parser (b -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser a
p) (repk b -> Parser b
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure repk b
k)
somer :: (ParserOps repf, ParserOps repk) => repf (a -> b -> b) -> repk b -> Parser a -> Parser b
somer :: repf (a -> b -> b) -> repk b -> Parser a -> Parser b
somer repf (a -> b -> b)
f repk b
k Parser a
p = repf (a -> b -> b)
f repf (a -> b -> b) -> Parser a -> Parser (b -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser a
p Parser (b -> b) -> Parser b -> Parser b
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> repf (a -> b -> b) -> repk b -> Parser a -> Parser b
forall (repf :: Type -> Type) (repk :: Type -> Type) a b.
(ParserOps repf, ParserOps repk) =>
repf (a -> b -> b) -> repk b -> Parser a -> Parser b
manyr repf (a -> b -> b)
f repk b
k Parser a
p
manyl :: (ParserOps repf, ParserOps repk) => repf (b -> a -> b) -> repk b -> Parser a -> Parser b
manyl :: repf (b -> a -> b) -> repk b -> Parser a -> Parser b
manyl repf (b -> a -> b)
f repk b
k Parser a
p = Parser b -> Parser (b -> b) -> Parser b
forall a. Parser a -> Parser (a -> a) -> Parser a
postfix (repk b -> Parser b
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure repk b
k) ((Defunc ((b -> a -> b) -> a -> b -> b)
forall a1 b c. Defunc ((a1 -> b -> c) -> b -> a1 -> c)
FLIP Defunc ((b -> a -> b) -> a -> b -> b)
-> Parser (b -> a -> b) -> Parser (a -> b -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> repf (b -> a -> b) -> Parser (b -> a -> b)
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure repf (b -> a -> b)
f) Parser (a -> b -> b) -> Parser a -> Parser (b -> b)
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser a
p)
somel :: (ParserOps repf, ParserOps repk) => repf (b -> a -> b) -> repk b -> Parser a -> Parser b
somel :: repf (b -> a -> b) -> repk b -> Parser a -> Parser b
somel repf (b -> a -> b)
f repk b
k Parser a
p = Parser b -> Parser (b -> b) -> Parser b
forall a. Parser a -> Parser (a -> a) -> Parser a
postfix (repf (b -> a -> b)
f repf (b -> a -> b) -> Parser b -> Parser (a -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> repk b -> Parser b
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure repk b
k Parser (a -> b) -> Parser a -> Parser b
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser a
p) ((Defunc ((b -> a -> b) -> a -> b -> b)
forall a1 b c. Defunc ((a1 -> b -> c) -> b -> a1 -> c)
FLIP Defunc ((b -> a -> b) -> a -> b -> b)
-> Parser (b -> a -> b) -> Parser (a -> b -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> repf (b -> a -> b) -> Parser (b -> a -> b)
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure repf (b -> a -> b)
f) Parser (a -> b -> b) -> Parser a -> Parser (b -> b)
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser a
p)
infixl1 :: ParserOps rep => rep (a -> b) -> Parser a -> Parser (b -> a -> b) -> Parser b
infixl1 :: rep (a -> b) -> Parser a -> Parser (b -> a -> b) -> Parser b
infixl1 rep (a -> b)
wrap Parser a
p Parser (b -> a -> b)
op = Parser b -> Parser (b -> b) -> Parser b
forall a. Parser a -> Parser (a -> a) -> Parser a
postfix (rep (a -> b)
wrap rep (a -> b) -> Parser a -> Parser b
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser a
p) (Defunc ((b -> a -> b) -> a -> b -> b)
forall a1 b c. Defunc ((a1 -> b -> c) -> b -> a1 -> c)
FLIP Defunc ((b -> a -> b) -> a -> b -> b)
-> Parser (b -> a -> b) -> Parser (a -> b -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser (b -> a -> b)
op Parser (a -> b -> b) -> Parser a -> Parser (b -> b)
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser a
p)
chainl1 :: Parser a -> Parser (a -> a -> a) -> Parser a
chainl1 :: Parser a -> Parser (a -> a -> a) -> Parser a
chainl1 = Defunc (a -> a) -> Parser a -> Parser (a -> a -> a) -> Parser a
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser (b -> a -> b) -> Parser b
infixl1 Defunc (a -> a)
forall a1. Defunc (a1 -> a1)
ID
infixr1 :: ParserOps rep => rep (a -> b) -> Parser a -> Parser (a -> b -> b) -> Parser b
infixr1 :: rep (a -> b) -> Parser a -> Parser (a -> b -> b) -> Parser b
infixr1 rep (a -> b)
wrap Parser a
p Parser (a -> b -> b)
op = let go :: Parser b
go = Parser a
p Parser a -> Parser (a -> b) -> Parser b
forall a b. Parser a -> Parser (a -> b) -> Parser b
<**> (Defunc ((a -> b -> b) -> b -> a -> b)
forall a1 b c. Defunc ((a1 -> b -> c) -> b -> a1 -> c)
FLIP Defunc ((a -> b -> b) -> b -> a -> b)
-> Parser (a -> b -> b) -> Parser (b -> a -> b)
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Parser (a -> b -> b)
op Parser (b -> a -> b) -> Parser b -> Parser (a -> b)
forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser b
go Parser (a -> b) -> Parser (a -> b) -> Parser (a -> b)
forall a. Parser a -> Parser a -> Parser a
<|> rep (a -> b) -> Parser (a -> b)
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure rep (a -> b)
wrap) in Parser b
go
chainr1 :: Parser a -> Parser (a -> a -> a) -> Parser a
chainr1 :: Parser a -> Parser (a -> a -> a) -> Parser a
chainr1 = Defunc (a -> a) -> Parser a -> Parser (a -> a -> a) -> Parser a
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser (a -> b -> b) -> Parser b
infixr1 Defunc (a -> a)
forall a1. Defunc (a1 -> a1)
ID
chainr :: ParserOps rep => Parser a -> Parser (a -> a -> a) -> rep a -> Parser a
chainr :: Parser a -> Parser (a -> a -> a) -> rep a -> Parser a
chainr Parser a
p Parser (a -> a -> a)
op rep a
x = rep a -> Parser a -> Parser a
forall (rep :: Type -> Type) a.
ParserOps rep =>
rep a -> Parser a -> Parser a
option rep a
x (Parser a -> Parser (a -> a -> a) -> Parser a
forall a. Parser a -> Parser (a -> a -> a) -> Parser a
chainr1 Parser a
p Parser (a -> a -> a)
op)
chainl :: ParserOps rep => Parser a -> Parser (a -> a -> a) -> rep a -> Parser a
chainl :: Parser a -> Parser (a -> a -> a) -> rep a -> Parser a
chainl Parser a
p Parser (a -> a -> a)
op rep a
x = rep a -> Parser a -> Parser a
forall (rep :: Type -> Type) a.
ParserOps rep =>
rep a -> Parser a -> Parser a
option rep a
x (Parser a -> Parser (a -> a -> a) -> Parser a
forall a. Parser a -> Parser (a -> a -> a) -> Parser a
chainl1 Parser a
p Parser (a -> a -> a)
op)
many :: Parser a -> Parser [a]
many :: Parser a -> Parser [a]
many = Defunc (a -> [a] -> [a]) -> Defunc [a] -> Parser a -> Parser [a]
forall (repf :: Type -> Type) (repk :: Type -> Type) a b.
(ParserOps repf, ParserOps repk) =>
repf (a -> b -> b) -> repk b -> Parser a -> Parser b
manyr Defunc (a -> [a] -> [a])
forall a1. Defunc (a1 -> [a1] -> [a1])
CONS Defunc [a]
forall a1. Defunc [a1]
EMPTY
manyN :: Int -> Parser a -> Parser [a]
manyN :: Int -> Parser a -> Parser [a]
manyN Int
n Parser a
p = (Int -> Parser [a] -> Parser [a])
-> Parser [a] -> [Int] -> Parser [a]
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((Parser [a] -> Parser [a]) -> Int -> Parser [a] -> Parser [a]
forall a b. a -> b -> a
const (Parser a
p Parser a -> Parser [a] -> Parser [a]
forall a. Parser a -> Parser [a] -> Parser [a]
<:>)) (Parser a -> Parser [a]
forall a. Parser a -> Parser [a]
many Parser a
p) [Int
1..Int
n]
some :: Parser a -> Parser [a]
some :: Parser a -> Parser [a]
some = Int -> Parser a -> Parser [a]
forall a. Int -> Parser a -> Parser [a]
manyN Int
1
skipMany :: Parser a -> Parser ()
skipMany :: Parser a -> Parser ()
skipMany = Parser () -> Parser ()
forall a. Parser a -> Parser ()
void (Parser () -> Parser ())
-> (Parser a -> Parser ()) -> Parser a -> Parser ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Defunc (() -> a -> ()) -> Defunc () -> Parser a -> Parser ()
forall (repf :: Type -> Type) (repk :: Type -> Type) b a.
(ParserOps repf, ParserOps repk) =>
repf (b -> a -> b) -> repk b -> Parser a -> Parser b
manyl Defunc (() -> a -> ())
forall a1 b. Defunc (a1 -> b -> a1)
CONST Defunc ()
UNIT
skipManyN :: Int -> Parser a -> Parser ()
skipManyN :: Int -> Parser a -> Parser ()
skipManyN Int
n Parser a
p = (Int -> Parser () -> Parser ()) -> Parser () -> [Int] -> Parser ()
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((Parser () -> Parser ()) -> Int -> Parser () -> Parser ()
forall a b. a -> b -> a
const (Parser a
p Parser a -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
*>)) (Parser a -> Parser ()
forall a. Parser a -> Parser ()
skipMany Parser a
p) [Int
1..Int
n]
skipSome :: Parser a -> Parser ()
skipSome :: Parser a -> Parser ()
skipSome = Int -> Parser a -> Parser ()
forall a. Int -> Parser a -> Parser ()
skipManyN Int
1
sepBy :: Parser a -> Parser b -> Parser [a]
sepBy :: Parser a -> Parser b -> Parser [a]
sepBy Parser a
p Parser b
sep = Defunc [a] -> Parser [a] -> Parser [a]
forall (rep :: Type -> Type) a.
ParserOps rep =>
rep a -> Parser a -> Parser a
option Defunc [a]
forall a1. Defunc [a1]
EMPTY (Parser a -> Parser b -> Parser [a]
forall a b. Parser a -> Parser b -> Parser [a]
sepBy1 Parser a
p Parser b
sep)
sepBy1 :: Parser a -> Parser b -> Parser [a]
sepBy1 :: Parser a -> Parser b -> Parser [a]
sepBy1 Parser a
p Parser b
sep = Parser a
p Parser a -> Parser [a] -> Parser [a]
forall a. Parser a -> Parser [a] -> Parser [a]
<:> Parser a -> Parser [a]
forall a. Parser a -> Parser [a]
many (Parser b
sep Parser b -> Parser a -> Parser a
forall a b. Parser a -> Parser b -> Parser b
*> Parser a
p)
endBy :: Parser a -> Parser b -> Parser [a]
endBy :: Parser a -> Parser b -> Parser [a]
endBy Parser a
p Parser b
sep = Parser a -> Parser [a]
forall a. Parser a -> Parser [a]
many (Parser a
p Parser a -> Parser b -> Parser a
forall a b. Parser a -> Parser b -> Parser a
<* Parser b
sep)
endBy1 :: Parser a -> Parser b -> Parser [a]
endBy1 :: Parser a -> Parser b -> Parser [a]
endBy1 Parser a
p Parser b
sep = Parser a -> Parser [a]
forall a. Parser a -> Parser [a]
some (Parser a
p Parser a -> Parser b -> Parser a
forall a b. Parser a -> Parser b -> Parser a
<* Parser b
sep)
sepEndBy :: Parser a -> Parser b -> Parser [a]
sepEndBy :: Parser a -> Parser b -> Parser [a]
sepEndBy Parser a
p Parser b
sep = Defunc [a] -> Parser [a] -> Parser [a]
forall (rep :: Type -> Type) a.
ParserOps rep =>
rep a -> Parser a -> Parser a
option Defunc [a]
forall a1. Defunc [a1]
EMPTY (Parser a -> Parser b -> Parser [a]
forall a b. Parser a -> Parser b -> Parser [a]
sepEndBy1 Parser a
p Parser b
sep)
sepEndBy1 :: Parser a -> Parser b -> Parser [a]
sepEndBy1 :: Parser a -> Parser b -> Parser [a]
sepEndBy1 Parser a
p Parser b
sep =
let seb1 :: Parser [a]
seb1 = Parser a
p Parser a -> Parser (a -> [a]) -> Parser [a]
forall a b. Parser a -> Parser (a -> b) -> Parser b
<**> (Parser b
sep Parser b -> Parser (a -> [a]) -> Parser (a -> [a])
forall a b. Parser a -> Parser b -> Parser b
*> (Defunc (a -> [a] -> [a]) -> Defunc ([a] -> a -> [a])
forall y x a b c.
((x -> y) ~ ((a -> b -> c) -> b -> a -> c)) =>
Defunc x -> Defunc y
FLIP_H Defunc (a -> [a] -> [a])
forall a1. Defunc (a1 -> [a1] -> [a1])
CONS Defunc ([a] -> a -> [a]) -> Parser [a] -> Parser (a -> [a])
forall (rep :: Type -> Type) a b.
ParserOps rep =>
rep (a -> b) -> Parser a -> Parser b
<$> Defunc [a] -> Parser [a] -> Parser [a]
forall (rep :: Type -> Type) a.
ParserOps rep =>
rep a -> Parser a -> Parser a
option Defunc [a]
forall a1. Defunc [a1]
EMPTY Parser [a]
seb1)
Parser (a -> [a]) -> Parser (a -> [a]) -> Parser (a -> [a])
forall a. Parser a -> Parser a -> Parser a
<|> Defunc (a -> [a]) -> Parser (a -> [a])
forall (rep :: Type -> Type) a. ParserOps rep => rep a -> Parser a
pure (Defunc ([a] -> a -> [a]) -> Defunc [a] -> Defunc (a -> [a])
forall a1 a. Defunc (a1 -> a) -> Defunc a1 -> Defunc a
APP_H (Defunc (a -> [a] -> [a]) -> Defunc ([a] -> a -> [a])
forall y x a b c.
((x -> y) ~ ((a -> b -> c) -> b -> a -> c)) =>
Defunc x -> Defunc y
FLIP_H Defunc (a -> [a] -> [a])
forall a1. Defunc (a1 -> [a1] -> [a1])
CONS) Defunc [a]
forall a1. Defunc [a1]
EMPTY))
in Parser [a]
seb1