{-# LANGUAGE TupleSections #-}------------------------------------------------------------------------------- |-- Module : Data.Machine.MealyT-- License : BSD-style (see the file LICENSE)---- <http://en.wikipedia.org/wiki/Mealy_machine>-- <https://github.com/ivanperez-keera/dunai/blob/develop/src/Data/MonadicStreamFunction/Core.hs#L35>-- <https://hackage.haskell.org/package/auto-0.4.3.0/docs/Control-Auto.html>-- <https://hackage.haskell.org/package/varying-0.6.0.0/docs/Control-Varying-Core.html>----------------------------------------------------------------------------moduleData.Machine.MealyT(MealyT (..),arrPure ,arrM ,upgrade ,scanMealyT ,scanMealyTM )whereimportData.Machine importControl.ArrowimportControl.ApplicativeimportControl.Monad.TransimportData.PointedimportControl.Monad.IdentityimportData.ProfunctorimportData.SemigroupimportqualifiedControl.CategoryasCimportPrelude-- | 'Mealy' machine, with applicative effectsnewtypeMealyT m a b =MealyT {forall (m :: * -> *) a b. MealyT m a b -> a -> m (b, MealyT m a b) runMealyT ::a ->m (b ,MealyT m a b )}instanceFunctorm =>Functor(MealyT m a )where{-# INLINEfmap#-}fmap :: forall a b. (a -> b) -> MealyT m a a -> MealyT m a b fmapa -> b f (MealyT a -> m (a, MealyT m a a) m )=(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a a ->((a, MealyT m a a) -> (b, MealyT m a b)) -> m (a, MealyT m a a) -> m (b, MealyT m a b) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(\(a x ,MealyT m a a y )->(a -> b f a x ,(a -> b) -> MealyT m a a -> MealyT m a b forall a b. (a -> b) -> MealyT m a a -> MealyT m a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapa -> b f MealyT m a a y ))(a -> m (a, MealyT m a a) m a a )instancePointedm =>Pointed(MealyT m a )where{-# INLINEpoint#-}point :: forall a. a -> MealyT m a a pointa b =MealyT m a a forall {a}. MealyT m a a r wherer :: MealyT m a a r =(a -> m (a, MealyT m a a)) -> MealyT m a a forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT (m (a, MealyT m a a) -> a -> m (a, MealyT m a a) forall a b. a -> b -> a const((a, MealyT m a a) -> m (a, MealyT m a a) forall a. a -> m a forall (p :: * -> *) a. Pointed p => a -> p a point(a b ,MealyT m a a r )))instanceApplicativem =>Applicative(MealyT m a )where{-# INLINEpure#-}pure :: forall a. a -> MealyT m a a purea b =MealyT m a a forall {a}. MealyT m a a r wherer :: MealyT m a a r =(a -> m (a, MealyT m a a)) -> MealyT m a a forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT (m (a, MealyT m a a) -> a -> m (a, MealyT m a a) forall a b. a -> b -> a const((a, MealyT m a a) -> m (a, MealyT m a a) forall a. a -> m a forall (f :: * -> *) a. Applicative f => a -> f a pure(a b ,MealyT m a a r )))-- Stolen from PointedMealyT a -> m (a -> b, MealyT m a (a -> b)) m <*> :: forall a b. MealyT m a (a -> b) -> MealyT m a a -> MealyT m a b <*>MealyT a -> m (a, MealyT m a a) n =(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a a ->(\(a -> b mb ,MealyT m a (a -> b) mm )(a nb ,MealyT m a a nm )->(a -> b mb a nb ,MealyT m a (a -> b) mm MealyT m a (a -> b) -> MealyT m a a -> MealyT m a b forall a b. MealyT m a (a -> b) -> MealyT m a a -> MealyT m a b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>MealyT m a a nm ))((a -> b, MealyT m a (a -> b)) -> (a, MealyT m a a) -> (b, MealyT m a b)) -> m (a -> b, MealyT m a (a -> b)) -> m ((a, MealyT m a a) -> (b, MealyT m a b)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>a -> m (a -> b, MealyT m a (a -> b)) m a a m ((a, MealyT m a a) -> (b, MealyT m a b)) -> m (a, MealyT m a a) -> m (b, MealyT m a b) forall a b. m (a -> b) -> m a -> m b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>a -> m (a, MealyT m a a) n a a instanceFunctorm =>Profunctor(MealyT m )wherermap :: forall b c a. (b -> c) -> MealyT m a b -> MealyT m a c rmap =(b -> c) -> MealyT m a b -> MealyT m a c forall a b. (a -> b) -> MealyT m a a -> MealyT m a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap{-# INLINErmap#-}lmap :: forall a b c. (a -> b) -> MealyT m b c -> MealyT m a c lmap a -> b f =MealyT m b c -> MealyT m a c forall {m :: * -> *} {b}. Functor m => MealyT m b b -> MealyT m a b go wherego :: MealyT m b b -> MealyT m a b go (MealyT b -> m (b, MealyT m b b) m )=(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a a ->((b, MealyT m b b) -> (b, MealyT m a b)) -> m (b, MealyT m b b) -> m (b, MealyT m a b) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(\(b b ,MealyT m b b n )->(b b ,MealyT m b b -> MealyT m a b go MealyT m b b n ))(b -> m (b, MealyT m b b) m (a -> b f a a )){-# INLINElmap#-}dimap :: forall a b c d. (a -> b) -> (c -> d) -> MealyT m b c -> MealyT m a d dimap a -> b f c -> d g =MealyT m b c -> MealyT m a d forall {m :: * -> *}. Functor m => MealyT m b c -> MealyT m a d go wherego :: MealyT m b c -> MealyT m a d go (MealyT b -> m (c, MealyT m b c) m )=(a -> m (d, MealyT m a d)) -> MealyT m a d forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (d, MealyT m a d)) -> MealyT m a d) -> (a -> m (d, MealyT m a d)) -> MealyT m a d forall a b. (a -> b) -> a -> b $\a a ->((c, MealyT m b c) -> (d, MealyT m a d)) -> m (c, MealyT m b c) -> m (d, MealyT m a d) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(\(c b ,MealyT m b c n )->(c -> d g c b ,MealyT m b c -> MealyT m a d go MealyT m b c n ))(b -> m (c, MealyT m b c) m (a -> b f a a )){-# INLINEdimap#-}instanceMonadm =>C.Category(MealyT m )where{-# INLINEid#-}id :: forall a. MealyT m a a id=(a -> m (a, MealyT m a a)) -> MealyT m a a forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (a, MealyT m a a)) -> MealyT m a a) -> (a -> m (a, MealyT m a a)) -> MealyT m a a forall a b. (a -> b) -> a -> b $\a a ->(a, MealyT m a a) -> m (a, MealyT m a a) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a a ,MealyT m a a forall a. MealyT m a a forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a C.id)MealyT b -> m (c, MealyT m b c) bc . :: forall b c a. MealyT m b c -> MealyT m a b -> MealyT m a c . MealyT a -> m (b, MealyT m a b) ab =(a -> m (c, MealyT m a c)) -> MealyT m a c forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (c, MealyT m a c)) -> MealyT m a c) -> (a -> m (c, MealyT m a c)) -> MealyT m a c forall a b. (a -> b) -> a -> b $\a a ->do(b b ,MealyT m a b nab )<-a -> m (b, MealyT m a b) ab a a (c c ,MealyT m b c nbc )<-b -> m (c, MealyT m b c) bc b b (c, MealyT m a c) -> m (c, MealyT m a c) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(c c ,MealyT m b c nbc MealyT m b c -> MealyT m a b -> MealyT m a c forall b c a. MealyT m b c -> MealyT m a b -> MealyT m a c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c C..MealyT m a b nab )instanceMonadm =>Arrow(MealyT m )where{-# INLINEarr#-}arr :: forall b c. (b -> c) -> MealyT m b c arrb -> c f =MealyT m b c r wherer :: MealyT m b c r =(b -> m (c, MealyT m b c)) -> MealyT m b c forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT (\b a ->(c, MealyT m b c) -> m (c, MealyT m b c) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(b -> c f b a ,MealyT m b c r ))first :: forall b c d. MealyT m b c -> MealyT m (b, d) (c, d) first(MealyT b -> m (c, MealyT m b c) m )=((b, d) -> m ((c, d), MealyT m (b, d) (c, d))) -> MealyT m (b, d) (c, d) forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT (((b, d) -> m ((c, d), MealyT m (b, d) (c, d))) -> MealyT m (b, d) (c, d)) -> ((b, d) -> m ((c, d), MealyT m (b, d) (c, d))) -> MealyT m (b, d) (c, d) forall a b. (a -> b) -> a -> b $\(b a ,d c )->do(c b ,MealyT m b c n )<-b -> m (c, MealyT m b c) m b a ((c, d), MealyT m (b, d) (c, d)) -> m ((c, d), MealyT m (b, d) (c, d)) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return((c b ,d c ),MealyT m b c -> MealyT m (b, d) (c, d) forall b c d. MealyT m b c -> MealyT m (b, d) (c, d) forall (a :: * -> * -> *) b c d. Arrow a => a b c -> a (b, d) (c, d) firstMealyT m b c n )arrPure ::(a ->b )->MealyT Identitya b arrPure :: forall a b. (a -> b) -> MealyT Identity a b arrPure =(a -> b) -> MealyT Identity a b forall a b. (a -> b) -> MealyT Identity a b forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c arrarrM ::Functorm =>(a ->m b )->MealyT m a b arrM :: forall (m :: * -> *) a b. Functor m => (a -> m b) -> MealyT m a b arrM a -> m b f =MealyT m a b r wherer :: MealyT m a b r =(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a a ->(b -> (b, MealyT m a b)) -> m b -> m (b, MealyT m a b) forall a b. (a -> b) -> m a -> m b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(,MealyT m a b r )(a -> m b f a a )upgrade ::Applicativem =>Mealy a b ->MealyT m a b upgrade :: forall (m :: * -> *) a b. Applicative m => Mealy a b -> MealyT m a b upgrade (Mealy a -> (b, Mealy a b) f )=(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a a ->let(b r ,Mealy a b g )=a -> (b, Mealy a b) f a a in(b, MealyT m a b) -> m (b, MealyT m a b) forall a. a -> m a forall (f :: * -> *) a. Applicative f => a -> f a pure(b r ,Mealy a b -> MealyT m a b forall (m :: * -> *) a b. Applicative m => Mealy a b -> MealyT m a b upgrade Mealy a b g )scanMealyT ::Applicativem =>(a ->b ->a )->a ->MealyT m b a scanMealyT :: forall (m :: * -> *) a b. Applicative m => (a -> b -> a) -> a -> MealyT m b a scanMealyT a -> b -> a f a a =(b -> m (a, MealyT m b a)) -> MealyT m b a forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT (\b b ->(a, MealyT m b a) -> m (a, MealyT m b a) forall a. a -> m a forall (f :: * -> *) a. Applicative f => a -> f a pure(a a ,(a -> b -> a) -> a -> MealyT m b a forall (m :: * -> *) a b. Applicative m => (a -> b -> a) -> a -> MealyT m b a scanMealyT a -> b -> a f (a -> b -> a f a a b b )))scanMealyTM ::Functorm =>(a ->b ->m a )->a ->MealyT m b a scanMealyTM :: forall (m :: * -> *) a b. Functor m => (a -> b -> m a) -> a -> MealyT m b a scanMealyTM a -> b -> m a f a a =(b -> m (a, MealyT m b a)) -> MealyT m b a forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((b -> m (a, MealyT m b a)) -> MealyT m b a) -> (b -> m (a, MealyT m b a)) -> MealyT m b a forall a b. (a -> b) -> a -> b $\b b ->(\a x ->(a a ,(a -> b -> m a) -> a -> MealyT m b a forall (m :: * -> *) a b. Functor m => (a -> b -> m a) -> a -> MealyT m b a scanMealyTM a -> b -> m a f a x ))(a -> (a, MealyT m b a)) -> m a -> m (a, MealyT m b a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>a -> b -> m a f a a b b autoMealyTImpl ::Monadm =>MealyT m a b ->ProcessT m a b autoMealyTImpl :: forall (m :: * -> *) a b. Monad m => MealyT m a b -> ProcessT m a b autoMealyTImpl =PlanT (Is a) b m Any -> MachineT m (Is a) b forall (m :: * -> *) (k :: * -> *) o a. Monad m => PlanT k o m a -> MachineT m k o construct (PlanT (Is a) b m Any -> MachineT m (Is a) b) -> (MealyT m a b -> PlanT (Is a) b m Any) -> MealyT m a b -> MachineT m (Is a) b forall b c a. (b -> c) -> (a -> b) -> a -> c .MealyT m a b -> PlanT (Is a) b m Any forall {k :: * -> * -> *} {m :: * -> *} {a} {o} {b}. (Category k, Monad m) => MealyT m a o -> PlanT (k a) o m b go wherego :: MealyT m a o -> PlanT (k a) o m b go (MealyT a -> m (o, MealyT m a o) f )=doa a <-PlanT (k a) o m a Plan (k a) o a forall (k :: * -> * -> *) i o. Category k => Plan (k i) o i await (o b ,MealyT m a o m )<-m (o, MealyT m a o) -> PlanT (k a) o m (o, MealyT m a o) forall (m :: * -> *) a. Monad m => m a -> PlanT (k a) o m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift(m (o, MealyT m a o) -> PlanT (k a) o m (o, MealyT m a o)) -> m (o, MealyT m a o) -> PlanT (k a) o m (o, MealyT m a o) forall a b. (a -> b) -> a -> b $a -> m (o, MealyT m a o) f a a o -> Plan (k a) o () forall o (k :: * -> *). o -> Plan k o () yield o b MealyT m a o -> PlanT (k a) o m b go MealyT m a o m instanceAutomatonM MealyT whereautoT :: forall (m :: * -> *) a b. Monad m => MealyT m a b -> ProcessT m a b autoT =MealyT m a b -> ProcessT m a b forall (m :: * -> *) a b. Monad m => MealyT m a b -> ProcessT m a b autoMealyTImpl instance(Semigroupb ,Applicativem )=>Semigroup(MealyT m a b )whereMealyT m a b f <> :: MealyT m a b -> MealyT m a b -> MealyT m a b <>MealyT m a b g =(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a x ->(\(b fx ,MealyT m a b f' )(b gx ,MealyT m a b g' )->(b fx b -> b -> b forall a. Semigroup a => a -> a -> a <>b gx ,MealyT m a b f' MealyT m a b -> MealyT m a b -> MealyT m a b forall a. Semigroup a => a -> a -> a <>MealyT m a b g' ))((b, MealyT m a b) -> (b, MealyT m a b) -> (b, MealyT m a b)) -> m (b, MealyT m a b) -> m ((b, MealyT m a b) -> (b, MealyT m a b)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>MealyT m a b -> a -> m (b, MealyT m a b) forall (m :: * -> *) a b. MealyT m a b -> a -> m (b, MealyT m a b) runMealyT MealyT m a b f a x m ((b, MealyT m a b) -> (b, MealyT m a b)) -> m (b, MealyT m a b) -> m (b, MealyT m a b) forall a b. m (a -> b) -> m a -> m b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>MealyT m a b -> a -> m (b, MealyT m a b) forall (m :: * -> *) a b. MealyT m a b -> a -> m (b, MealyT m a b) runMealyT MealyT m a b g a x instance(Semigroupb ,Monoidb ,Applicativem )=>Monoid(MealyT m a b )wheremempty :: MealyT m a b mempty=(a -> m (b, MealyT m a b)) -> MealyT m a b forall (m :: * -> *) a b. (a -> m (b, MealyT m a b)) -> MealyT m a b MealyT ((a -> m (b, MealyT m a b)) -> MealyT m a b) -> (a -> m (b, MealyT m a b)) -> MealyT m a b forall a b. (a -> b) -> a -> b $\a _->(b, MealyT m a b) -> m (b, MealyT m a b) forall a. a -> m a forall (f :: * -> *) a. Applicative f => a -> f a pure(b, MealyT m a b) forall a. Monoid a => a memptymappend :: MealyT m a b -> MealyT m a b -> MealyT m a b mappend=MealyT m a b -> MealyT m a b -> MealyT m a b forall a. Semigroup a => a -> a -> a (<>)