{-# LANGUAGE CPP #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE MultiParamTypeClasses #-}------------------------------------------------------------------------------- |-- Module : Data.Machine.Moore-- Copyright : (C) 2012 Edward Kmett-- License : BSD-style (see the file LICENSE)---- Maintainer : Edward Kmett <ekmett@gmail.com>-- Stability : provisional-- Portability : portable---- <http://en.wikipedia.org/wiki/Moore_machine>----------------------------------------------------------------------------moduleData.Machine.Moore(Moore (..),logMoore ,unfoldMoore )whereimportControl.ApplicativeimportControl.ComonadimportControl.Monad.FiximportControl.Monad.Reader.ClassimportControl.Monad.ZipimportData.CopointedimportData.DistributiveimportData.Functor.RepasFunctorimportData.Machine.Plan importData.Machine.Type importData.Machine.Process importData.SemigroupimportData.PointedimportData.Profunctor.ClosedimportData.ProfunctorimportData.Profunctor.SieveimportData.Profunctor.RepasProfunctorimportPrelude-- | 'Moore' machinesdataMoore a b =Moore b (a ->Moore a b )-- | Accumulate the input as a sequence.logMoore ::Monoidm =>Moore m m logMoore :: forall m. Monoid m => Moore m m logMoore =m -> Moore m m forall {t}. Monoid t => t -> Moore t t h m forall a. Monoid a => a memptywhereh :: t -> Moore t t h t m =t -> (t -> Moore t t) -> Moore t t forall a b. b -> (a -> Moore a b) -> Moore a b Moore t m (\t a ->t -> Moore t t h (t m t -> t -> t forall a. Monoid a => a -> a -> a `mappend`t a )){-# INLINElogMoore #-}-- | Construct a Moore machine from a state valuation and transition functionunfoldMoore ::(s ->(b ,a ->s ))->s ->Moore a b unfoldMoore :: forall s b a. (s -> (b, a -> s)) -> s -> Moore a b unfoldMoore s -> (b, a -> s) f =s -> Moore a b go wherego :: s -> Moore a b go s s =cases -> (b, a -> s) f s s of(b b ,a -> s g )->b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore b b (s -> Moore a b go (s -> Moore a b) -> (a -> s) -> a -> Moore a b forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> s g ){-# INLINEunfoldMoore #-}instanceAutomaton Moore whereauto :: forall a b. Moore a b -> Process a b auto Moore a b x =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) -> PlanT (Is a) b m Any -> MachineT m (Is a) b forall a b. (a -> b) -> a -> b $Moore a b -> PlanT (Is a) b m Any forall {k :: * -> * -> *} {a} {o} {m :: * -> *} {b}. Category k => Moore a o -> PlanT (k a) o m b go Moore a b x wherego :: Moore a o -> PlanT (k a) o m b go (Moore o b a -> Moore a o f )=doo -> Plan (k a) o () forall o (k :: * -> *). o -> Plan k o () yield o b PlanT (k a) o m a Plan (k a) o a forall (k :: * -> * -> *) i o. Category k => Plan (k i) o i await PlanT (k a) o m a -> (a -> PlanT (k a) o m b) -> PlanT (k a) o m b forall a b. PlanT (k a) o m a -> (a -> PlanT (k a) o m b) -> PlanT (k a) o m b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=Moore a o -> PlanT (k a) o m b go (Moore a o -> PlanT (k a) o m b) -> (a -> Moore a o) -> a -> PlanT (k a) o m b forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Moore a o f {-# INLINEauto #-}instanceFunctor(Moore a )wherefmap :: forall a b. (a -> b) -> Moore a a -> Moore a b fmapa -> b f (Moore a b a -> Moore a a g )=b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (a -> b f a b )((a -> b) -> Moore a a -> Moore a b forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapa -> b f (Moore a a -> Moore a b) -> (a -> Moore a a) -> a -> Moore a b forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Moore a a g ){-# INLINEfmap#-}a a <$ :: forall a b. a -> Moore a b -> Moore a a <$ Moore a b _=a -> Moore a a forall a. a -> Moore a a forall (m :: * -> *) a. Monad m => a -> m a returna a {-# INLINE(<$)#-}instanceProfunctorMoore wherermap :: forall b c a. (b -> c) -> Moore a b -> Moore a c rmap =(b -> c) -> Moore a b -> Moore a c forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap{-# INLINErmap#-}lmap :: forall a b c. (a -> b) -> Moore b c -> Moore a c lmap a -> b f =Moore b c -> Moore a c go wherego :: Moore b c -> Moore a c go (Moore c b b -> Moore b c g )=c -> (a -> Moore a c) -> Moore a c forall a b. b -> (a -> Moore a b) -> Moore a b Moore c b (Moore b c -> Moore a c go (Moore b c -> Moore a c) -> (a -> Moore b c) -> a -> Moore a c forall b c a. (b -> c) -> (a -> b) -> a -> c .b -> Moore b c g (b -> Moore b c) -> (a -> b) -> a -> Moore b c forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> b f ){-# INLINElmap#-}dimap :: forall a b c d. (a -> b) -> (c -> d) -> Moore b c -> Moore a d dimap a -> b f c -> d g =Moore b c -> Moore a d go wherego :: Moore b c -> Moore a d go (Moore c b b -> Moore b c h )=d -> (a -> Moore a d) -> Moore a d forall a b. b -> (a -> Moore a b) -> Moore a b Moore (c -> d g c b )(Moore b c -> Moore a d go (Moore b c -> Moore a d) -> (a -> Moore b c) -> a -> Moore a d forall b c a. (b -> c) -> (a -> b) -> a -> c .b -> Moore b c h (b -> Moore b c) -> (a -> b) -> a -> Moore b c forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> b f ){-# INLINEdimap#-}instanceApplicative(Moore a )wherepure :: forall a. a -> Moore a a purea a =Moore a a r wherer :: Moore a a r =a -> (a -> Moore a a) -> Moore a a forall a b. b -> (a -> Moore a b) -> Moore a b Moore a a (Moore a a -> a -> Moore a a forall a b. a -> b -> a constMoore a a r ){-# INLINEpure#-}Moore a -> b f a -> Moore a (a -> b) ff <*> :: forall a b. Moore a (a -> b) -> Moore a a -> Moore a b <*>Moore a a a -> Moore a a fa =b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (a -> b f a a )(\a i ->a -> Moore a (a -> b) ff a i Moore a (a -> b) -> Moore a a -> Moore a b forall a b. Moore a (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>a -> Moore a a fa a i )Moore a a m <* :: forall a b. Moore a a -> Moore a b -> Moore a a <* Moore a b _=Moore a a m {-# INLINE(<*)#-}Moore a a _*> :: forall a b. Moore a a -> Moore a b -> Moore a b *>Moore a b n =Moore a b n {-# INLINE(*>)#-}instancePointed(Moore a )wherepoint :: forall a. a -> Moore a a point a a =Moore a a r wherer :: Moore a a r =a -> (a -> Moore a a) -> Moore a a forall a b. b -> (a -> Moore a b) -> Moore a b Moore a a (Moore a a -> a -> Moore a a forall a b. a -> b -> a constMoore a a r ){-# INLINEpoint#-}-- | slow diagonalizationinstanceMonad(Moore a )wherereturn :: forall a. a -> Moore a a return=a -> Moore a a forall a. a -> Moore a a forall (f :: * -> *) a. Applicative f => a -> f a pure{-# INLINEreturn#-}Moore a a k >>= :: forall a b. Moore a a -> (a -> Moore a b) -> Moore a b >>=a -> Moore a b f =Moore a (Moore a b) -> Moore a b forall {a} {b}. Moore a (Moore a b) -> Moore a b j ((a -> Moore a b) -> Moore a a -> Moore a (Moore a b) forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapa -> Moore a b f Moore a a k )wherej :: Moore a (Moore a b) -> Moore a b j (Moore Moore a b a a -> Moore a (Moore a b) g )=b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (Moore a b -> b forall a. Moore a a -> a forall (w :: * -> *) a. Comonad w => w a -> a extractMoore a b a )(\a x ->Moore a (Moore a b) -> Moore a b j (Moore a (Moore a b) -> Moore a b) -> Moore a (Moore a b) -> Moore a b forall a b. (a -> b) -> a -> b $(Moore a b -> Moore a b) -> Moore a (Moore a b) -> Moore a (Moore a b) forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(\(Moore b _a -> Moore a b h )->a -> Moore a b h a x )(a -> Moore a (Moore a b) g a x ))>> :: forall a b. Moore a a -> Moore a b -> Moore a b (>>)=Moore a a -> Moore a b -> Moore a b forall a b. Moore a a -> Moore a b -> Moore a b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b (*>)instanceCopointed(Moore a )wherecopoint :: forall a. Moore a a -> a copoint (Moore a b a -> Moore a a _)=a b {-# INLINEcopoint#-}instanceComonad(Moore a )whereextract :: forall a. Moore a a -> a extract(Moore a b a -> Moore a a _)=a b {-# INLINEextract#-}extend :: forall a b. (Moore a a -> b) -> Moore a a -> Moore a b extend Moore a a -> b f w :: Moore a a w @(Moore a _a -> Moore a a g )=b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (Moore a a -> b f Moore a a w )((Moore a a -> b) -> Moore a a -> Moore a b forall a b. (Moore a a -> b) -> Moore a a -> Moore a b forall (w :: * -> *) a b. Comonad w => (w a -> b) -> w a -> w b extendMoore a a -> b f (Moore a a -> Moore a b) -> (a -> Moore a a) -> a -> Moore a b forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Moore a a g )instanceComonadApply(Moore a )whereMoore a -> b f a -> Moore a (a -> b) ff <@> :: forall a b. Moore a (a -> b) -> Moore a a -> Moore a b <@> Moore a a a -> Moore a a fa =b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (a -> b f a a )(\a i ->a -> Moore a (a -> b) ff a i Moore a (a -> b) -> Moore a a -> Moore a b forall a b. Moore a (a -> b) -> Moore a a -> Moore a b forall (w :: * -> *) a b. ComonadApply w => w (a -> b) -> w a -> w b <@>a -> Moore a a fa a i )Moore a a m <@ :: forall a b. Moore a a -> Moore a b -> Moore a a <@ Moore a b _=Moore a a m {-# INLINE(<@)#-}Moore a a _@> :: forall a b. Moore a a -> Moore a b -> Moore a b @> Moore a b n =Moore a b n {-# INLINE(@>)#-}instanceDistributive(Moore a )wheredistribute :: forall (f :: * -> *) a. Functor f => f (Moore a a) -> Moore a (f a) distribute f (Moore a a) m =f a -> (a -> Moore a (f a)) -> Moore a (f a) forall a b. b -> (a -> Moore a b) -> Moore a b Moore ((Moore a a -> a) -> f (Moore a a) -> f a forall a b. (a -> b) -> f a -> f b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapMoore a a -> a forall a. Moore a a -> a forall (w :: * -> *) a. Comonad w => w a -> a extractf (Moore a a) m )(f (Moore a a) -> Moore a (f a) forall (g :: * -> *) (f :: * -> *) a. (Distributive g, Functor f) => f (g a) -> g (f a) forall (f :: * -> *) a. Functor f => f (Moore a a) -> Moore a (f a) distribute(f (Moore a a) -> Moore a (f a)) -> (a -> f (Moore a a)) -> a -> Moore a (f a) forall b c a. (b -> c) -> (a -> b) -> a -> c .(Moore a a -> a -> Moore a a) -> f (Moore a a) -> a -> f (Moore a a) forall (g :: * -> *) (f :: * -> *) a b. (Distributive g, Functor f) => (a -> g b) -> f a -> g (f b) forall (f :: * -> *) a b. Functor f => (a -> a -> b) -> f a -> a -> f b collect(\(Moore a _a -> Moore a a k )->a -> Moore a a k )f (Moore a a) m )instanceFunctor.Representable(Moore a )wheretypeRep(Moore a )=[a ]index :: forall a. Moore a a -> Rep (Moore a) -> a index =Moore a a -> [a] -> a Moore a a -> Rep (Moore a) -> a forall a b. Moore a b -> [a] -> b forall (p :: * -> * -> *) (f :: * -> *) a b. Cosieve p f => p a b -> f a -> b cosievetabulate :: forall a. (Rep (Moore a) -> a) -> Moore a a tabulate =(Rep (Moore a) -> a) -> Moore a a (Corep Moore a -> a) -> Moore a a forall d c. (Corep Moore d -> c) -> Moore d c forall (p :: * -> * -> *) d c. Corepresentable p => (Corep p d -> c) -> p d c cotabulate{-# INLINEtabulate#-}instanceCosieveMoore []wherecosieve :: forall a b. Moore a b -> [a] -> b cosieve(Moore b b a -> Moore a b _)[]=b b cosieve(Moore b _a -> Moore a b k )(a a :[a] as )=Moore a b -> [a] -> b forall a b. Moore a b -> [a] -> b forall (p :: * -> * -> *) (f :: * -> *) a b. Cosieve p f => p a b -> f a -> b cosieve(a -> Moore a b k a a )[a] as instanceCostrongMoore whereunfirst :: forall a d b. Moore (a, d) (b, d) -> Moore a b unfirst =Moore (a, d) (b, d) -> Moore a b forall (p :: * -> * -> *) a d b. Corepresentable p => p (a, d) (b, d) -> p a b unfirstCorepunsecond :: forall d a b. Moore (d, a) (d, b) -> Moore a b unsecond =Moore (d, a) (d, b) -> Moore a b forall (p :: * -> * -> *) d a b. Corepresentable p => p (d, a) (d, b) -> p a b unsecondCorepinstanceProfunctor.CorepresentableMoore wheretypeCorepMoore =[]cotabulate :: forall d c. (Corep Moore d -> c) -> Moore d c cotabulateCorep Moore d -> c f =c -> (d -> Moore d c) -> Moore d c forall a b. b -> (a -> Moore a b) -> Moore a b Moore (Corep Moore d -> c f [])((d -> Moore d c) -> Moore d c) -> (d -> Moore d c) -> Moore d c forall a b. (a -> b) -> a -> b $\d a ->(Corep Moore d -> c) -> Moore d c forall d c. (Corep Moore d -> c) -> Moore d c forall (p :: * -> * -> *) d c. Corepresentable p => (Corep p d -> c) -> p d c cotabulate([d] -> c Corep Moore d -> c f ([d] -> c) -> ([d] -> [d]) -> [d] -> c forall b c a. (b -> c) -> (a -> b) -> a -> c .(d a d -> [d] -> [d] forall a. a -> [a] -> [a] :))instanceMonadFix(Moore a )wheremfix :: forall a. (a -> Moore a a) -> Moore a a mfix=(a -> Moore a a) -> Moore a a forall (f :: * -> *) a. Representable f => (a -> f a) -> f a mfixRepinstanceMonadZip(Moore a )wheremzipWith :: forall a b c. (a -> b -> c) -> Moore a a -> Moore a b -> Moore a c mzipWith =(a -> b -> c) -> Moore a a -> Moore a b -> Moore a c forall (f :: * -> *) a b c. Representable f => (a -> b -> c) -> f a -> f b -> f c mzipWithRepmunzip :: forall a b. Moore a (a, b) -> (Moore a a, Moore a b) munzip Moore a (a, b) m =(((a, b) -> a) -> Moore a (a, b) -> Moore a a forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(a, b) -> a forall a b. (a, b) -> a fstMoore a (a, b) m ,((a, b) -> b) -> Moore a (a, b) -> Moore a b forall a b. (a -> b) -> Moore a a -> Moore a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(a, b) -> b forall a b. (a, b) -> b sndMoore a (a, b) m )instanceMonadReader[a ](Moore a )whereask :: Moore a [a] ask =Moore a [a] Moore a (Rep (Moore a)) forall (f :: * -> *). Representable f => f (Rep f) askReplocal :: forall a. ([a] -> [a]) -> Moore a a -> Moore a a local =([a] -> [a]) -> Moore a a -> Moore a a (Rep (Moore a) -> Rep (Moore a)) -> Moore a a -> Moore a a forall (f :: * -> *) a. Representable f => (Rep f -> Rep f) -> f a -> f a localRepinstanceClosedMoore whereclosed :: forall a b x. Moore a b -> Moore (x -> a) (x -> b) closed Moore a b m =(Corep Moore (x -> a) -> x -> b) -> Moore (x -> a) (x -> b) forall d c. (Corep Moore d -> c) -> Moore d c forall (p :: * -> * -> *) d c. Corepresentable p => (Corep p d -> c) -> p d c cotabulate((Corep Moore (x -> a) -> x -> b) -> Moore (x -> a) (x -> b)) -> (Corep Moore (x -> a) -> x -> b) -> Moore (x -> a) (x -> b) forall a b. (a -> b) -> a -> b $\Corep Moore (x -> a) fs x x ->Moore a b -> [a] -> b forall a b. Moore a b -> [a] -> b forall (p :: * -> * -> *) (f :: * -> *) a b. Cosieve p f => p a b -> f a -> b cosieveMoore a b m (((x -> a) -> a) -> [x -> a] -> [a] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap((x -> a) -> x -> a forall a b. (a -> b) -> a -> b $x x )[x -> a] Corep Moore (x -> a) fs )instanceSemigroupb =>Semigroup(Moore a b )whereMoore b x a -> Moore a b f <> :: Moore a b -> Moore a b -> Moore a b <>Moore b y a -> Moore a b g =b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore (b x b -> b -> b forall a. Semigroup a => a -> a -> a <>b y )(a -> Moore a b f (a -> Moore a b) -> (a -> Moore a b) -> a -> Moore a b forall a. Semigroup a => a -> a -> a <>a -> Moore a b g )instanceMonoidb =>Monoid(Moore a b )wheremempty :: Moore a b mempty=b -> (a -> Moore a b) -> Moore a b forall a b. b -> (a -> Moore a b) -> Moore a b Moore b forall a. Monoid a => a memptya -> Moore a b forall a. Monoid a => a mempty #if !(MIN_VERSION_base(4,11,0)) Moorexf`mappend`Mooreyg=Moore(x`mappend`y)(f`mappend`g) #endif