Skip to content

Commit 911b1c3

Browse files
committed
Update Grammar.hs
1 parent 57783f9 commit 911b1c3

File tree

1 file changed

+89
-68
lines changed

1 file changed

+89
-68
lines changed

src/Data/Profunctor/Grammar.hs

Lines changed: 89 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,20 @@ evalGrammor = extract . extract . runGrammor
7272
evalGrammor_ :: Grammor () t Identity a b -> t
7373
evalGrammor_ = evalGrammor
7474

75-
newtype Reador f a b = Reador {unReador :: Codensity (LookT f) b}
75+
newtype Reador s f a b = Reador {unReador :: Codensity (LookT s f) b}
7676
runReador
77-
:: (Alternative m, Monad m)
78-
=> Reador m a b -> String -> m (b, String)
77+
:: (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
78+
=> Reador s m a b -> s -> m (b, s)
7979
runReador (Reador (Codensity f)) = runLookT (f return)
8080

81-
data LookT f a
82-
= LookT (String -> LookT f a)
83-
| GetT (Char -> LookT f a)
84-
| ResultT a (LookT f a)
85-
| FinalT (f (a, String))
86-
runLookT :: Alternative f => LookT f a -> String -> f (a, String)
81+
data LookT s f a
82+
= LookT (s -> LookT s f a)
83+
| GetT (Item s -> LookT s f a)
84+
| ResultT a (LookT s f a)
85+
| FinalT (f (a, s))
86+
runLookT
87+
:: (Alternative f, IsList s, Cons s s (Item s) (Item s))
88+
=> LookT s f a -> s -> f (a, s)
8789
runLookT (GetT f) s =
8890
maybe empty (\(h,t) -> runLookT (f h) t) (uncons s)
8991
runLookT (LookT f) s = runLookT (f s) s
@@ -112,6 +114,9 @@ instance (Alternative m, Monad m) => Alternative (PP s s m a) where
112114
empty = PP (\_ _ -> empty)
113115
PP p <|> PP q = PP $ \ma s -> p ma s <|> q ma s
114116
instance (Alternative m, Monad m) => MonadPlus (PP s s m a)
117+
instance Monad m => MonadReader s (PP s s m a) where
118+
ask = PP $ \_ s -> return (s,s)
119+
local f = PP . fmap (lmap f) . runPP
115120
instance Filterable f => Filterable (PP s t f a) where
116121
mapMaybe f (PP p) = PP $ \fa s ->
117122
mapMaybe (\(a,t) -> fmap (,t) (f a)) (p fa s)
@@ -142,7 +147,7 @@ instance Monad m => Polyadic m PP where
142147
Just (a,b) -> \s0 -> do
143148
(x,s1) <- p (Just a) s0
144149
(y,s2) <- runPP (f x) (Just b) s1
145-
return ((a,y),s2)
150+
return ((x,y),s2)
146151
instance (Alternative m, Monad m) => Distributor (PP s s m)
147152
instance (Alternative m, Monad m) => Choice (PP s s m) where
148153
left' = alternate . Left
@@ -179,30 +184,32 @@ instance (Alternative m, Monad m) => ArrowChoice (PP s s m) where
179184
(+++) = (>+<)
180185
left = left'
181186
right = right'
182-
-- instance
183-
-- ( Categorized a, a ~ Item s, IsList s, Cons s s a a
184-
-- , Filterable m, Alternative m, Monad m
185-
-- ) => Tokenized a (Printor s s m a a) where
186-
-- anyToken = Printor (\b -> pure (b, cons b))
187-
-- instance
188-
-- ( Categorized a, a ~ Item s, IsList s, Cons s s a a
189-
-- , Filterable m, Alternative m, Monad m
190-
-- ) => TokenAlgebra a (Printor s s m a a)
191-
-- instance
192-
-- ( Categorized a, a ~ Item s, IsList s, Cons s s a a
193-
-- , Filterable m, Alternative m, Monad m
194-
-- ) => TerminalSymbol a (Printor s s m () ()) where
195-
-- instance
196-
-- ( Char ~ Item s, IsList s, Cons s s Char Char
197-
-- , Filterable m, Alternative m, Monad m
198-
-- ) => IsString (Printor s s m () ()) where
199-
-- fromString = terminal
200-
-- instance
201-
-- ( Char ~ Item s, IsList s, Cons s s Char Char, AsEmpty s
202-
-- , Filterable m, Alternative m, Monad m
203-
-- ) => IsString (Printor s s m s s) where
204-
-- fromString = fromTokens
205-
-- instance BackusNaurForm (Printor s t m a b)
187+
instance
188+
( Categorized a, a ~ Item s, IsList s, Cons s s a a
189+
, Filterable m, Alternative m, Monad m
190+
) => Tokenized a (PP s s m a a) where
191+
anyToken = PP $ maybe
192+
(maybe empty pure . uncons)
193+
(\a -> pure . (a,) . cons a)
194+
instance
195+
( Categorized a, a ~ Item s, IsList s, Cons s s a a
196+
, Filterable m, Alternative m, Monad m
197+
) => TokenAlgebra a (PP s s m a a)
198+
instance
199+
( Categorized a, a ~ Item s, IsList s, Cons s s a a
200+
, Filterable m, Alternative m, Monad m
201+
) => TerminalSymbol a (PP s s m () ()) where
202+
instance
203+
( Char ~ Item s, IsList s, Cons s s Char Char
204+
, Filterable m, Alternative m, Monad m
205+
) => IsString (PP s s m () ()) where
206+
fromString = terminal
207+
instance
208+
( Char ~ Item s, IsList s, Cons s s Char Char, AsEmpty s
209+
, Filterable m, Alternative m, Monad m
210+
) => IsString (PP s s m s s) where
211+
fromString = fromTokens
212+
instance BackusNaurForm (PP s t m a b)
206213

207214
-- Parsor instances
208215
instance Functor f => Functor (Parsor s t f a) where
@@ -483,82 +490,95 @@ instance (Comonad f, Applicative f, Monoid s, BackusNaurForm t)
483490
ruleRec name = grammor . ruleRec name . dimap grammor evalGrammor
484491

485492
-- Reador instances
486-
deriving newtype instance Functor (Reador f a)
487-
deriving newtype instance Applicative (Reador f a)
488-
deriving newtype instance Monad (Reador f a)
489-
deriving newtype instance (Alternative m, Monad m)
490-
=> Alternative (Reador m a)
491-
deriving newtype instance (Alternative m, Monad m)
492-
=> MonadPlus (Reador m a)
493-
instance (Alternative m, Filterable m, Monad m)
494-
=> Filterable (Reador m a) where
493+
deriving newtype instance Functor (Reador s f a)
494+
deriving newtype instance Applicative (Reador s f a)
495+
deriving newtype instance Monad (Reador s f a)
496+
deriving newtype instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
497+
=> Alternative (Reador s m a)
498+
deriving newtype instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
499+
=> MonadPlus (Reador s m a)
500+
instance (Alternative m, Filterable m, Monad m, IsList s, Cons s s (Item s) (Item s))
501+
=> Filterable (Reador s m a) where
495502
mapMaybe f
496503
= Reador . lift
497504
. mapMaybe f
498505
. lowerCodensity . unReador
499-
instance Profunctor (Reador f) where
506+
instance Profunctor (Reador s f) where
500507
dimap _ f (Reador p) = Reador (fmap f p)
501-
instance Bifunctor (Reador f) where
508+
instance Bifunctor (Reador s f) where
502509
bimap _ f (Reador p) = Reador (fmap f p)
503-
instance (Alternative m, Monad m) => Monadic m Reador where
510+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
511+
=> Monadic m (Reador s) where
504512
liftP m = Reador $ do
505513
s <- ask
506514
lift $ FinalT ((,s) <$> m)
507515
bondM (Reador m) f = Reador $ do
508516
a <- m
509517
c <- unReador (f a)
510518
return (a,c)
511-
instance (Alternative m, Monad m) => Choice (Reador m) where
519+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
520+
=> Choice (Reador s m) where
512521
left' = alternate . Left
513522
right' = alternate . Right
514-
instance (Alternative m, Monad m, Filterable m)
515-
=> Cochoice (Reador m) where
523+
instance (Alternative m, Monad m, Filterable m, IsList s, Cons s s (Item s) (Item s))
524+
=> Cochoice (Reador s m) where
516525
unleft = fst . filtrate
517526
unright = snd . filtrate
518-
instance (Alternative m, Monad m) => Distributor (Reador m)
519-
instance (Alternative m, Monad m) => Alternator (Reador m) where
527+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
528+
=> Distributor (Reador s m)
529+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
530+
=> Alternator (Reador s m) where
520531
alternate (Left (Reador p)) = Reador (fmap Left p)
521532
alternate (Right (Reador p)) = Reador (fmap Right p)
522-
instance (Alternative m, Filterable m, Monad m)
523-
=> Filtrator (Reador m) where
533+
instance (Alternative m, Filterable m, Monad m, IsList s, Cons s s (Item s) (Item s))
534+
=> Filtrator (Reador s m) where
524535
filtrate = mfiltrate
525-
instance (Alternative m, Filterable m, Monad m)
526-
=> Tokenized Char (Reador m Char Char) where
536+
instance
537+
( Alternative m, Filterable m, Monad m
538+
, IsList s, Categorized c, c ~ Item s, Cons s s c c
539+
) => Tokenized c (Reador s m c c) where
527540
anyToken = Reador (lift (GetT return))
528541
instance
529542
( Filterable m, Alternative m, Monad m
530-
) => TokenAlgebra Char (Reador m Char Char)
543+
, IsList s, Categorized c, c ~ Item s, Cons s s c c
544+
) => TokenAlgebra c (Reador s m c c)
531545
instance
532546
( Filterable m, Alternative m, Monad m
533-
) => TerminalSymbol Char (Reador m () ())
547+
, IsList s, Categorized c, c ~ Item s, Cons s s c c
548+
) => TerminalSymbol c (Reador s m () ())
534549
instance
535550
( Filterable m, Alternative m, Monad m
536-
) => IsString (Reador m () ()) where
551+
, IsList s, Item s ~ Char, Cons s s Char Char
552+
) => IsString (Reador s m () ()) where
537553
fromString = terminal
538554
instance
539555
( Filterable m, Alternative m, Monad m
540-
, AsEmpty s, Cons s s Char Char
541-
) => IsString (Reador m s s) where
556+
, IsList s, Item s ~ Char, AsEmpty s, Cons s s Char Char
557+
) => IsString (Reador s m s s) where
542558
fromString = fromTokens
543-
instance BackusNaurForm (Reador m a b)
544-
instance Matching String (Reador Maybe a b) where
559+
instance BackusNaurForm (Reador s m a b)
560+
instance (IsList s, Cons s s (Item s) (Item s), AsEmpty s)
561+
=> Matching s (Reador s Maybe a b) where
545562
word =~ reador = case runReador reador word of
546563
Nothing -> False
547564
Just (_,t) -> is _Empty t
548565

549566
-- LookT instances
550-
deriving stock instance Functor f => Functor (LookT f)
551-
instance (Alternative m, Monad m) => Applicative (LookT m) where
567+
deriving stock instance Functor f => Functor (LookT s f)
568+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
569+
=> Applicative (LookT s m) where
552570
pure x = ResultT x (FinalT empty)
553571
(<*>) = ap
554-
instance (Alternative m, Monad m) => Monad (LookT m) where
572+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
573+
=> Monad (LookT s m) where
555574
GetT f >>= k = GetT $ \c -> f c >>= k
556575
LookT f >>= k = LookT $ \s -> f s >>= k
557576
ResultT x p >>= k = k x <|> (p >>= k)
558577
FinalT r >>= k = FinalT $ do
559578
(x,s) <- r
560579
runLookT (k x) s
561-
instance (Alternative m, Monad m) => MonadReader String (LookT m) where
580+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
581+
=> MonadReader s (LookT s m) where
562582
ask = LookT return
563583
local f = \case
564584
GetT k -> do
@@ -567,15 +587,16 @@ instance (Alternative m, Monad m) => MonadReader String (LookT m) where
567587
LookT k -> LookT (k . f)
568588
ResultT x p -> ResultT x (local f p)
569589
FinalT r -> FinalT r
570-
instance Filterable f => Filterable (LookT f) where
590+
instance Filterable f => Filterable (LookT s f) where
571591
mapMaybe f = \case
572592
GetT k -> GetT (mapMaybe f . k)
573593
LookT k -> LookT (mapMaybe f . k)
574594
ResultT x p -> mapMaybe f p & case f x of
575595
Nothing -> id
576596
Just y -> ResultT y
577597
FinalT r -> FinalT (mapMaybe (\(a,s) -> (,s) <$> f a) r)
578-
instance (Alternative m, Monad m) => Alternative (LookT m) where
598+
instance (Alternative m, Monad m, IsList s, Cons s s (Item s) (Item s))
599+
=> Alternative (LookT s m) where
579600
empty = FinalT empty
580601
-- most common case: two gets are combined
581602
GetT f1 <|> GetT f2 = GetT (\c -> f1 c <|> f2 c)

0 commit comments

Comments
 (0)