1
module UU.Parsing.Perms(Perms(), pPerms, pPermsSep, succeedPerms, (~*~), (~$~)) where
6
-- =======================================================================================
7
-- ===== PERMUTATIONS ================================================================
8
-- =======================================================================================
10
newtype Perms p a = Perms (Maybe (p a), [Br p a])
11
data Br p a = forall b. Br (Perms p (b -> a)) (p b)
13
instance IsParser p s => Functor (Perms p) where
14
fmap f (Perms (mb, bs)) = Perms (fmap (f<$>) mb, map (fmap f) bs)
16
instance IsParser p s => Functor (Br p) where
17
fmap f (Br perm p) = Br (fmap (f.) perm) p
19
(~*~) :: IsParser p s => Perms p (a -> b) -> p a -> Perms p b
20
perms ~*~ p = perms `add` (getzerop p, getonep p)
22
(~$~) :: IsParser p s => (a -> b) -> p a -> Perms p b
23
f ~$~ p = succeedPerms f ~*~ p
25
succeedPerms :: IsParser p s => a -> Perms p a
26
succeedPerms x = Perms (Just (pLow x), [])
28
add :: IsParser p s => Perms p (a -> b) -> (Maybe (p a),Maybe (p a)) -> Perms p b
29
add b2a@(Perms (eb2a, nb2a)) bp@(eb, nb)
30
= let changing :: IsParser p s => (a -> b) -> Perms p a -> Perms p b
31
f `changing` Perms (ep, np) = Perms (fmap (f <$>) ep, [Br ((f.) `changing` pp) p | Br pp p <- np])
39
Just pb -> (Br b2a pb:)
40
)[ Br ((flip `changing` c) `add` bp) d | Br c d <- nb2a]
43
pPerms :: IsParser p s => Perms p a -> p a
44
pPerms (Perms (empty,nonempty))
45
= foldl (<|>) (fromMaybe pFail empty) [ (flip ($)) <$> p <*> pPerms pp
49
pPermsSep :: IsParser p s => p x -> Perms p a -> p a
50
pPermsSep (sep :: p z) perm = p2p (pSucceed ()) perm
51
where p2p :: IsParser p s => p x -> Perms p a -> p a
52
p2p fsep (Perms (mbempty, nonempties)) =
53
let empty = fromMaybe pFail mbempty
54
pars (Br t p) = flip ($) <$ fsep <*> p <*> p2p sep t
55
in foldr (<|>) empty (map pars nonempties)
b'\\ No newline at end of file'