{-# LANGUAGE CPP #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE MultiParamTypeClasses #-}------------------------------------------------------------------------------- |-- Module : Data.Machine.Mealy-- 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/Mealy_machine>----------------------------------------------------------------------------moduleData.Machine.Mealy(Mealy (..),unfoldMealy ,logMealy )whereimportControl.ApplicativeimportControl.ArrowimportControl.CategoryimportData.DistributiveimportData.Functor.ExtendimportData.Functor.RepasFunctorimportData.List.NonEmptyasNonEmptyimportData.Machine.Plan importData.Machine.Type importData.Machine.Process importData.Profunctor.ClosedimportData.ProfunctorimportData.Profunctor.SieveimportData.Profunctor.RepasProfunctorimportData.PointedimportData.SemigroupimportData.SequenceasSeqimportPreludehiding((.),id)-- $setup-- >>> import Data.Machine-- | 'Mealy' machines---- ==== Examples---- We can enumerate inputs:---- >>> let countingMealy = unfoldMealy (\i x -> ((i, x), i + 1)) 0-- >>> run (auto countingMealy <~ source "word")-- [(0,'w'),(1,'o'),(2,'r'),(3,'d')]--newtypeMealy a b =Mealy {forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy ::a ->(b ,Mealy a b )}instanceFunctor(Mealy a )wherefmap :: forall a b. (a -> b) -> Mealy a a -> Mealy a b fmapa -> b f (Mealy a -> (a, Mealy a a) m )=(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (b, Mealy a b)) -> Mealy a b) -> (a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> b) -> a -> b $\a a ->casea -> (a, Mealy a a) m a a of(a b ,Mealy a a n )->(a -> b f a b ,(a -> b) -> Mealy a a -> Mealy a b forall a b. (a -> b) -> Mealy a a -> Mealy a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmapa -> b f Mealy a a n ){-# INLINEfmap#-}a b <$ :: forall a b. a -> Mealy a b -> Mealy a a <$ Mealy a b _=a -> Mealy a a forall a. a -> Mealy a a forall (f :: * -> *) a. Applicative f => a -> f a purea b {-# INLINE(<$)#-}instanceApplicative(Mealy a )wherepure :: forall a. a -> Mealy a a purea b =Mealy a a r wherer :: Mealy a a r =(a -> (a, Mealy a a)) -> Mealy a a forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a, Mealy a a) -> a -> (a, Mealy a a) forall a b. a -> b -> a const(a b ,Mealy a a r )){-# INLINEpure#-}Mealy a -> (a -> b, Mealy a (a -> b)) m <*> :: forall a b. Mealy a (a -> b) -> Mealy a a -> Mealy a b <*>Mealy a -> (a, Mealy a a) n =(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (b, Mealy a b)) -> Mealy a b) -> (a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> b) -> a -> b $\a a ->casea -> (a -> b, Mealy a (a -> b)) m a a of(a -> b f ,Mealy a (a -> b) m' )->casea -> (a, Mealy a a) n a a of(a b ,Mealy a a n' )->(a -> b f a b ,Mealy a (a -> b) m' Mealy a (a -> b) -> Mealy a a -> Mealy a b forall a b. Mealy a (a -> b) -> Mealy a a -> Mealy a b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>Mealy a a n' )Mealy a a m <* :: forall a b. Mealy a a -> Mealy a b -> Mealy a a <* Mealy a b _=Mealy a a m {-# INLINE(<*)#-}Mealy a a _*> :: forall a b. Mealy a a -> Mealy a b -> Mealy a b *>Mealy a b n =Mealy a b n {-# INLINE(*>)#-}instancePointed(Mealy a )wherepoint :: forall a. a -> Mealy a a point a b =Mealy a a r wherer :: Mealy a a r =(a -> (a, Mealy a a)) -> Mealy a a forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a, Mealy a a) -> a -> (a, Mealy a a) forall a b. a -> b -> a const(a b ,Mealy a a r )){-# INLINEpoint#-}instanceExtend(Mealy a )whereduplicated :: forall a. Mealy a a -> Mealy a (Mealy a a) duplicated (Mealy a -> (a, Mealy a a) m )=(a -> (Mealy a a, Mealy a (Mealy a a))) -> Mealy a (Mealy a a) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (Mealy a a, Mealy a (Mealy a a))) -> Mealy a (Mealy a a)) -> (a -> (Mealy a a, Mealy a (Mealy a a))) -> Mealy a (Mealy a a) forall a b. (a -> b) -> a -> b $\a a ->casea -> (a, Mealy a a) m a a of(a _,Mealy a a b )->(Mealy a a b ,Mealy a a -> Mealy a (Mealy a a) forall a. Mealy a a -> Mealy a (Mealy a a) forall (w :: * -> *) a. Extend w => w a -> w (w a) duplicatedMealy a a b )-- | A 'Mealy' machine modeled with explicit state.unfoldMealy ::(s ->a ->(b ,s ))->s ->Mealy a b unfoldMealy :: forall s a b. (s -> a -> (b, s)) -> s -> Mealy a b unfoldMealy s -> a -> (b, s) f =s -> Mealy a b go wherego :: s -> Mealy a b go s s =(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (b, Mealy a b)) -> Mealy a b) -> (a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> b) -> a -> b $\a a ->cases -> a -> (b, s) f s s a a of(b b ,s t )->(b b ,s -> Mealy a b go s t ){-# INLINEunfoldMealy #-}instanceProfunctorMealy wherermap :: forall b c a. (b -> c) -> Mealy a b -> Mealy a c rmap =(b -> c) -> Mealy a b -> Mealy a c forall a b. (a -> b) -> Mealy a a -> Mealy a b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap{-# INLINErmap#-}lmap :: forall a b c. (a -> b) -> Mealy b c -> Mealy a c lmap a -> b f =Mealy b c -> Mealy a c go wherego :: Mealy b c -> Mealy a c go (Mealy b -> (c, Mealy b c) m )=(a -> (c, Mealy a c)) -> Mealy a c forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (c, Mealy a c)) -> Mealy a c) -> (a -> (c, Mealy a c)) -> Mealy a c forall a b. (a -> b) -> a -> b $\a a ->caseb -> (c, Mealy b c) m (a -> b f a a )of(c b ,Mealy b c n )->(c b ,Mealy b c -> Mealy a c go Mealy b c n ){-# INLINElmap#-}dimap :: forall a b c d. (a -> b) -> (c -> d) -> Mealy b c -> Mealy a d dimap a -> b f c -> d g =Mealy b c -> Mealy a d go wherego :: Mealy b c -> Mealy a d go (Mealy b -> (c, Mealy b c) m )=(a -> (d, Mealy a d)) -> Mealy a d forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (d, Mealy a d)) -> Mealy a d) -> (a -> (d, Mealy a d)) -> Mealy a d forall a b. (a -> b) -> a -> b $\a a ->caseb -> (c, Mealy b c) m (a -> b f a a )of(c b ,Mealy b c n )->(c -> d g c b ,Mealy b c -> Mealy a d go Mealy b c n ){-# INLINEdimap#-}instanceAutomaton Mealy whereauto :: forall a b. Mealy a b -> Process a b auto Mealy 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 $Mealy a b -> PlanT (Is a) b m Any forall {k :: * -> * -> *} {a} {o} {m :: * -> *} {b}. Category k => Mealy a o -> PlanT (k a) o m b go Mealy a b x wherego :: Mealy a o -> PlanT (k a) o m b go (Mealy a -> (o, Mealy a o) f )=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 >>=\a a ->casea -> (o, Mealy a o) f a a of(o b ,Mealy a o m )->doo -> Plan (k a) o () forall o (k :: * -> *). o -> Plan k o () yield o b Mealy a o -> PlanT (k a) o m b go Mealy a o m {-# INLINEauto #-}instanceCategoryMealy whereid :: forall a. Mealy a a id =(a -> (a, Mealy a a)) -> Mealy a a forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy (\a a ->(a a ,Mealy a a forall a. Mealy a a forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a id))Mealy b -> (c, Mealy b c) bc . :: forall b c a. Mealy b c -> Mealy a b -> Mealy a c . Mealy a -> (b, Mealy a b) ab =(a -> (c, Mealy a c)) -> Mealy a c forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (c, Mealy a c)) -> Mealy a c) -> (a -> (c, Mealy a c)) -> Mealy a c forall a b. (a -> b) -> a -> b $\a a ->casea -> (b, Mealy a b) ab a a of(b b ,Mealy a b nab )->caseb -> (c, Mealy b c) bc b b of(c c ,Mealy b c nbc )->(c c ,Mealy b c nbc Mealy b c -> Mealy a b -> Mealy a c forall b c a. Mealy b c -> Mealy a b -> Mealy a c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c .Mealy a b nab )instanceArrowMealy wherearr :: forall b c. (b -> c) -> Mealy b c arrb -> c f =Mealy b c r wherer :: Mealy b c r =(b -> (c, Mealy b c)) -> Mealy b c forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy (\b a ->(b -> c f b a ,Mealy b c r )){-# INLINEarr#-}first :: forall b c d. Mealy b c -> Mealy (b, d) (c, d) first(Mealy b -> (c, Mealy b c) m )=((b, d) -> ((c, d), Mealy (b, d) (c, d))) -> Mealy (b, d) (c, d) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy (((b, d) -> ((c, d), Mealy (b, d) (c, d))) -> Mealy (b, d) (c, d)) -> ((b, d) -> ((c, d), Mealy (b, d) (c, d))) -> Mealy (b, d) (c, d) forall a b. (a -> b) -> a -> b $\(b a ,d c )->caseb -> (c, Mealy b c) m b a of(c b ,Mealy b c n )->((c b ,d c ),Mealy b c -> Mealy (b, d) (c, d) forall b c d. Mealy b c -> Mealy (b, d) (c, d) forall (a :: * -> * -> *) b c d. Arrow a => a b c -> a (b, d) (c, d) firstMealy b c n )instanceArrowChoiceMealy whereleft :: forall b c d. Mealy b c -> Mealy (Either b d) (Either c d) left Mealy b c m =(Either b d -> (Either c d, Mealy (Either b d) (Either c d))) -> Mealy (Either b d) (Either c d) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((Either b d -> (Either c d, Mealy (Either b d) (Either c d))) -> Mealy (Either b d) (Either c d)) -> (Either b d -> (Either c d, Mealy (Either b d) (Either c d))) -> Mealy (Either b d) (Either c d) forall a b. (a -> b) -> a -> b $\Either b d a ->caseEither b d a ofLeftb l ->caseMealy b c -> b -> (c, Mealy b c) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy b c m b l of(c b ,Mealy b c m' )->(c -> Either c d forall a b. a -> Either a b Leftc b ,Mealy b c -> Mealy (Either b d) (Either c d) forall b c d. Mealy b c -> Mealy (Either b d) (Either c d) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either b d) (Either c d) leftMealy b c m' )Rightd r ->(d -> Either c d forall a b. b -> Either a b Rightd r ,Mealy b c -> Mealy (Either b d) (Either c d) forall b c d. Mealy b c -> Mealy (Either b d) (Either c d) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either b d) (Either c d) leftMealy b c m )right :: forall b c d. Mealy b c -> Mealy (Either d b) (Either d c) right Mealy b c m =(Either d b -> (Either d c, Mealy (Either d b) (Either d c))) -> Mealy (Either d b) (Either d c) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((Either d b -> (Either d c, Mealy (Either d b) (Either d c))) -> Mealy (Either d b) (Either d c)) -> (Either d b -> (Either d c, Mealy (Either d b) (Either d c))) -> Mealy (Either d b) (Either d c) forall a b. (a -> b) -> a -> b $\Either d b a ->caseEither d b a ofLeftd l ->(d -> Either d c forall a b. a -> Either a b Leftd l ,Mealy b c -> Mealy (Either d b) (Either d c) forall b c d. Mealy b c -> Mealy (Either d b) (Either d c) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either d b) (Either d c) rightMealy b c m )Rightb r ->caseMealy b c -> b -> (c, Mealy b c) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy b c m b r of(c b ,Mealy b c m' )->(c -> Either d c forall a b. b -> Either a b Rightc b ,Mealy b c -> Mealy (Either d b) (Either d c) forall b c d. Mealy b c -> Mealy (Either d b) (Either d c) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either d b) (Either d c) rightMealy b c m' )Mealy b c m +++ :: forall b c b' c'. Mealy b c -> Mealy b' c' -> Mealy (Either b b') (Either c c') +++ Mealy b' c' n =(Either b b' -> (Either c c', Mealy (Either b b') (Either c c'))) -> Mealy (Either b b') (Either c c') forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((Either b b' -> (Either c c', Mealy (Either b b') (Either c c'))) -> Mealy (Either b b') (Either c c')) -> (Either b b' -> (Either c c', Mealy (Either b b') (Either c c'))) -> Mealy (Either b b') (Either c c') forall a b. (a -> b) -> a -> b $\Either b b' a ->caseEither b b' a ofLeftb b ->caseMealy b c -> b -> (c, Mealy b c) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy b c m b b of(c c ,Mealy b c m' )->(c -> Either c c' forall a b. a -> Either a b Leftc c ,Mealy b c m' Mealy b c -> Mealy b' c' -> Mealy (Either b b') (Either c c') forall b c b' c'. Mealy b c -> Mealy b' c' -> Mealy (Either b b') (Either c c') forall (a :: * -> * -> *) b c b' c'. ArrowChoice a => a b c -> a b' c' -> a (Either b b') (Either c c') +++Mealy b' c' n )Rightb' b ->caseMealy b' c' -> b' -> (c', Mealy b' c') forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy b' c' n b' b of(c' c ,Mealy b' c' n' )->(c' -> Either c c' forall a b. b -> Either a b Rightc' c ,Mealy b c m Mealy b c -> Mealy b' c' -> Mealy (Either b b') (Either c c') forall b c b' c'. Mealy b c -> Mealy b' c' -> Mealy (Either b b') (Either c c') forall (a :: * -> * -> *) b c b' c'. ArrowChoice a => a b c -> a b' c' -> a (Either b b') (Either c c') +++Mealy b' c' n' )Mealy b d m ||| :: forall b d c. Mealy b d -> Mealy c d -> Mealy (Either b c) d |||Mealy c d n =(Either b c -> (d, Mealy (Either b c) d)) -> Mealy (Either b c) d forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((Either b c -> (d, Mealy (Either b c) d)) -> Mealy (Either b c) d) -> (Either b c -> (d, Mealy (Either b c) d)) -> Mealy (Either b c) d forall a b. (a -> b) -> a -> b $\Either b c a ->caseEither b c a ofLeftb b ->caseMealy b d -> b -> (d, Mealy b d) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy b d m b b of(d d ,Mealy b d m' )->(d d ,Mealy b d m' Mealy b d -> Mealy c d -> Mealy (Either b c) d forall b d c. Mealy b d -> Mealy c d -> Mealy (Either b c) d forall (a :: * -> * -> *) b d c. ArrowChoice a => a b d -> a c d -> a (Either b c) d |||Mealy c d n )Rightc b ->caseMealy c d -> c -> (d, Mealy c d) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy c d n c b of(d d ,Mealy c d n' )->(d d ,Mealy b d m Mealy b d -> Mealy c d -> Mealy (Either b c) d forall b d c. Mealy b d -> Mealy c d -> Mealy (Either b c) d forall (a :: * -> * -> *) b d c. ArrowChoice a => a b d -> a c d -> a (Either b c) d |||Mealy c d n' )instanceStrongMealy wherefirst' :: forall b c d. Mealy b c -> Mealy (b, d) (c, d) first' =Mealy a b -> Mealy (a, c) (b, c) forall b c d. Mealy b c -> Mealy (b, d) (c, d) forall (a :: * -> * -> *) b c d. Arrow a => a b c -> a (b, d) (c, d) firstinstanceChoiceMealy whereleft' :: forall b c d. Mealy b c -> Mealy (Either b d) (Either c d) left' =Mealy a b -> Mealy (Either a c) (Either b c) forall b c d. Mealy b c -> Mealy (Either b d) (Either c d) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either b d) (Either c d) leftright' :: forall b c d. Mealy b c -> Mealy (Either d b) (Either d c) right' =Mealy a b -> Mealy (Either c a) (Either c b) forall b c d. Mealy b c -> Mealy (Either d b) (Either d c) forall (a :: * -> * -> *) b c d. ArrowChoice a => a b c -> a (Either d b) (Either d c) right-- | Fast forward a mealy machine forwarddriveMealy ::Mealy a b ->Seqa ->a ->(b ,Mealy a b )driveMealy :: forall a b. Mealy a b -> Seq a -> a -> (b, Mealy a b) driveMealy Mealy a b m Seq a xs a z =caseSeq a -> ViewL a forall a. Seq a -> ViewL a viewlSeq a xs ofa y :<Seq a ys ->caseMealy a b -> a -> (b, Mealy a b) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy a b m a y of(b _,Mealy a b n )->Mealy a b -> Seq a -> a -> (b, Mealy a b) forall a b. Mealy a b -> Seq a -> a -> (b, Mealy a b) driveMealy Mealy a b n Seq a ys a z ViewL a EmptyL->Mealy a b -> a -> (b, Mealy a b) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy a b m a z -- | Accumulate history.logMealy ::Semigroupa =>Mealy a a logMealy :: forall a. Semigroup a => Mealy a a logMealy =(a -> (a, Mealy a a)) -> Mealy a a forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (a, Mealy a a)) -> Mealy a a) -> (a -> (a, Mealy a a)) -> Mealy a a forall a b. (a -> b) -> a -> b $\a a ->(a a ,a -> Mealy a a forall {t}. Semigroup t => t -> Mealy t t h a a )whereh :: t -> Mealy t t h t a =(t -> (t, Mealy t t)) -> Mealy t t forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((t -> (t, Mealy t t)) -> Mealy t t) -> (t -> (t, Mealy t t)) -> Mealy t t forall a b. (a -> b) -> a -> b $\t b ->letc :: t c =t a t -> t -> t forall a. Semigroup a => a -> a -> a <>t b in(t c ,t -> Mealy t t h t c ){-# INLINElogMealy #-}instanceArrowApplyMealy whereapp :: forall b c. Mealy (Mealy b c, b) c app=Seq b -> Mealy (Mealy b c, b) c forall {a} {b}. Seq a -> Mealy (Mealy a b, a) b go Seq b forall a. Seq a Seq.emptywherego :: Seq a -> Mealy (Mealy a b, a) b go Seq a xs =((Mealy a b, a) -> (b, Mealy (Mealy a b, a) b)) -> Mealy (Mealy a b, a) b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy (((Mealy a b, a) -> (b, Mealy (Mealy a b, a) b)) -> Mealy (Mealy a b, a) b) -> ((Mealy a b, a) -> (b, Mealy (Mealy a b, a) b)) -> Mealy (Mealy a b, a) b forall a b. (a -> b) -> a -> b $\(Mealy a b m ,a x )->caseMealy a b -> Seq a -> a -> (b, Mealy a b) forall a b. Mealy a b -> Seq a -> a -> (b, Mealy a b) driveMealy Mealy a b m Seq a xs a x of(b c ,Mealy a b _)->(b c ,Seq a -> Mealy (Mealy a b, a) b go (Seq a xs Seq a -> a -> Seq a forall a. Seq a -> a -> Seq a |>a x )){-# INLINEapp#-}instanceDistributive(Mealy a )wheredistribute :: forall (f :: * -> *) a. Functor f => f (Mealy a a) -> Mealy a (f a) distribute f (Mealy a a) fm =(a -> (f a, Mealy a (f a))) -> Mealy a (f a) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (f a, Mealy a (f a))) -> Mealy a (f a)) -> (a -> (f a, Mealy a (f a))) -> Mealy a (f a) forall a b. (a -> b) -> a -> b $\a a ->letfp :: f (a, Mealy a a) fp =(Mealy a a -> (a, Mealy a a)) -> f (Mealy a a) -> f (a, Mealy a a) forall a b. (a -> b) -> f a -> f b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(Mealy a a -> a -> (a, Mealy a a) forall a b. Mealy a b -> a -> (b, Mealy a b) `runMealy` a a )f (Mealy a a) fm in(((a, Mealy a a) -> a) -> f (a, Mealy 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 fmap(a, Mealy a a) -> a forall a b. (a, b) -> a fstf (a, Mealy a a) fp ,((a, Mealy a a) -> Mealy a a) -> f (a, Mealy a a) -> Mealy a (f 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 -> Mealy a b) -> f a -> Mealy a (f b) collect(a, Mealy a a) -> Mealy a a forall a b. (a, b) -> b sndf (a, Mealy a a) fp )collect :: forall (f :: * -> *) a b. Functor f => (a -> Mealy a b) -> f a -> Mealy a (f b) collecta -> Mealy a b k f a fa =(a -> (f b, Mealy a (f b))) -> Mealy a (f b) forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (f b, Mealy a (f b))) -> Mealy a (f b)) -> (a -> (f b, Mealy a (f b))) -> Mealy a (f b) forall a b. (a -> b) -> a -> b $\a a ->letfp :: f (b, Mealy a b) fp =(a -> (b, Mealy a b)) -> f a -> f (b, Mealy a b) forall a b. (a -> b) -> f a -> f b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(\a x ->Mealy a b -> a -> (b, Mealy a b) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy (a -> Mealy a b k a x )a a )f a fa in(((b, Mealy a b) -> b) -> f (b, Mealy a b) -> f b forall a b. (a -> b) -> f a -> f b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(b, Mealy a b) -> b forall a b. (a, b) -> a fstf (b, Mealy a b) fp ,((b, Mealy a b) -> Mealy a b) -> f (b, Mealy a b) -> Mealy a (f b) forall (g :: * -> *) (f :: * -> *) a b. (Distributive g, Functor f) => (a -> g b) -> f a -> g (f b) forall (f :: * -> *) a b. Functor f => (a -> Mealy a b) -> f a -> Mealy a (f b) collect(b, Mealy a b) -> Mealy a b forall a b. (a, b) -> b sndf (b, Mealy a b) fp )instanceFunctor.Representable(Mealy a )wheretypeRep(Mealy a )=NonEmptya index :: forall a. Mealy a a -> Rep (Mealy a) -> a index =Mealy a a -> NonEmpty a -> a Mealy a a -> Rep (Mealy a) -> a forall a b. Mealy a b -> NonEmpty a -> b forall (p :: * -> * -> *) (f :: * -> *) a b. Cosieve p f => p a b -> f a -> b cosievetabulate :: forall a. (Rep (Mealy a) -> a) -> Mealy a a tabulate =(Rep (Mealy a) -> a) -> Mealy a a (Corep Mealy a -> a) -> Mealy a a forall d c. (Corep Mealy d -> c) -> Mealy d c forall (p :: * -> * -> *) d c. Corepresentable p => (Corep p d -> c) -> p d c cotabulateinstanceCosieveMealy NonEmptywherecosieve :: forall a b. Mealy a b -> NonEmpty a -> b cosieveMealy a b m0 (a a0 :|[a] as0 )=Mealy a b -> a -> [a] -> b forall {t} {b}. Mealy t b -> t -> [t] -> b go Mealy a b m0 a a0 [a] as0 wherego :: Mealy t b -> t -> [t] -> b go (Mealy t -> (b, Mealy t b) m )t a [t] as =caset -> (b, Mealy t b) m t a of(b b ,Mealy t b m' )->case[t] as of[]->b b t a' :[t] as' ->Mealy t b -> t -> [t] -> b go Mealy t b m' t a' [t] as' instanceCostrongMealy whereunfirst :: forall a d b. Mealy (a, d) (b, d) -> Mealy a b unfirst =Mealy (a, d) (b, d) -> Mealy a b forall (p :: * -> * -> *) a d b. Corepresentable p => p (a, d) (b, d) -> p a b unfirstCorepunsecond :: forall d a b. Mealy (d, a) (d, b) -> Mealy a b unsecond =Mealy (d, a) (d, b) -> Mealy a b forall (p :: * -> * -> *) d a b. Corepresentable p => p (d, a) (d, b) -> p a b unsecondCorepinstanceProfunctor.CorepresentableMealy wheretypeCorepMealy =NonEmptycotabulate :: forall d c. (Corep Mealy d -> c) -> Mealy d c cotabulateCorep Mealy d -> c f0 =(d -> (c, Mealy d c)) -> Mealy d c forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((d -> (c, Mealy d c)) -> Mealy d c) -> (d -> (c, Mealy d c)) -> Mealy d c forall a b. (a -> b) -> a -> b $\d a ->[d] -> (NonEmpty d -> c) -> (c, Mealy d c) forall {a} {b}. [a] -> (NonEmpty a -> b) -> (b, Mealy a b) go [d a ]NonEmpty d -> c Corep Mealy d -> c f0 wherego :: [a] -> (NonEmpty a -> b) -> (b, Mealy a b) go [a] as NonEmpty a -> b f =(NonEmpty a -> b f ([a] -> NonEmpty a forall a. HasCallStack => [a] -> NonEmpty a NonEmpty.fromList([a] -> [a] forall a. [a] -> [a] Prelude.reverse[a] as )),(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (b, Mealy a b)) -> Mealy a b) -> (a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> b) -> a -> b $\a b ->[a] -> (NonEmpty a -> b) -> (b, Mealy a b) go (a b a -> [a] -> [a] forall a. a -> [a] -> [a] :[a] as )NonEmpty a -> b f )instanceClosedMealy whereclosed :: forall a b x. Mealy a b -> Mealy (x -> a) (x -> b) closed Mealy a b m =(Corep Mealy (x -> a) -> x -> b) -> Mealy (x -> a) (x -> b) forall d c. (Corep Mealy d -> c) -> Mealy d c forall (p :: * -> * -> *) d c. Corepresentable p => (Corep p d -> c) -> p d c cotabulate((Corep Mealy (x -> a) -> x -> b) -> Mealy (x -> a) (x -> b)) -> (Corep Mealy (x -> a) -> x -> b) -> Mealy (x -> a) (x -> b) forall a b. (a -> b) -> a -> b $\Corep Mealy (x -> a) fs x x ->Mealy a b -> NonEmpty a -> b forall a b. Mealy a b -> NonEmpty a -> b forall (p :: * -> * -> *) (f :: * -> *) a b. Cosieve p f => p a b -> f a -> b cosieveMealy a b m (((x -> a) -> a) -> NonEmpty (x -> a) -> NonEmpty a forall a b. (a -> b) -> NonEmpty a -> NonEmpty 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 )NonEmpty (x -> a) Corep Mealy (x -> a) fs )instanceSemigroupb =>Semigroup(Mealy a b )whereMealy a b f <> :: Mealy a b -> Mealy a b -> Mealy a b <>Mealy a b g =(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy ((a -> (b, Mealy a b)) -> Mealy a b) -> (a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> b) -> a -> b $\a x ->Mealy a b -> a -> (b, Mealy a b) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy a b f a x (b, Mealy a b) -> (b, Mealy a b) -> (b, Mealy a b) forall a. Semigroup a => a -> a -> a <>Mealy a b -> a -> (b, Mealy a b) forall a b. Mealy a b -> a -> (b, Mealy a b) runMealy Mealy a b g a x instanceMonoidb =>Monoid(Mealy a b )wheremempty :: Mealy a b mempty=(a -> (b, Mealy a b)) -> Mealy a b forall a b. (a -> (b, Mealy a b)) -> Mealy a b Mealy a -> (b, Mealy a b) forall a. Monoid a => a mempty #if !(MIN_VERSION_base(4,11,0)) mappendfg=Mealy$\x->runMealyfx`mappend`runMealygx #endif