@@ -72,18 +72,20 @@ evalGrammor = extract . extract . runGrammor
7272evalGrammor_ :: Grammor () t Identity a b -> t
7373evalGrammor_ = 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 }
7676runReador
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 )
7979runReador (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 )
8789runLookT (GetT f) s =
8890 maybe empty (\ (h,t) -> runLookT (f h) t) (uncons s)
8991runLookT (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
114116instance (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
115120instance 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)
146151instance (Alternative m , Monad m ) => Distributor (PP s s m )
147152instance (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
208215instance 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 ))
528541instance
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 )
531545instance
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 () () )
534549instance
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
538554instance
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