Îõ³h"‹1ï      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnNone-./09<>?ÀÁÂÉÎÔÖ×Ùàçìö 2   !$#"%)('&*+,-./012+*,-%)('&!$#"   ./01None./05<>ÀÁÂÈÉÖ×Ùìö  G idiomaticÅThe applicative functor that gets the second component of a product. 1idiom :: Product f g ~> g idiom (Pair _ bs) = bs H idiomaticÄThe applicative functor that gets the first component of a product. 1idiom :: Product f g ~> f idiom (Pair as _) = as I idiomatic2An applicative functor for constructing a product. Àidiom :: f ~> Product g h idiom as = Pair (idiom as) (idiom as) L idiomaticÃThis applicative morphism duplicates a functor any number of times. “idiom :: f ~> f idiom = id idiom :: f ~> Product f f idiom as = Pair as as idiom :: f ~> Product f (Product f f) idiom as = Pair as (Pair as as) N idiomatic>This applicative morphism composes a functor on the _outside_. 5idiom :: f ~> Compose outer f idiom = Compose . pure O idiomatic=This applicative morphism composes a functor on the _inside_. :idiom :: f ~> Compose f inner idiom = Compose . fmap pure P idiomatic"The terminal applicative morphism.It turns any applicative into o m, or p Òidiom :: f ~> Const m idiom _ = Const mempty idiom :: f ~> Proxy idiom _ = Proxy Q idiomatic!The initial applicative morphism. It turns q into any r functor. 3idiom :: Identity ~> f idiom (Identity a) = pure a R idiomatic7The left-to-right composition of applicative morphisms.S idiomatic"The identity applicative morphism. idiom :: f ~> f idiom = id T idiomaticAn TÐ captures an "applicative homomorphism" between two applicatives, indexed by a tag.êAn appliative homomorphism is a polymorphic function between two applicative functors that preserves the r structure. Õidiom (pure a) = pure a idiom (liftA2 (·) as bs) = liftA2 (·) (idiom as) (idiom bs)  Based on:  Ìhttp://ekmett.github.io/reader/2012/abstracting-with-applicatives/index.htmlAbstracting with Applicatives.GHIJKLMNOPQRSTUTUSRQPONMLJKIHGNone./028<=>ÀÁÂÈÉÎÖ×Ùìö c idiomatic.A modifier that is used to generically derive r for sum types. +Types with a single constructor can derive r using  Generically1 from  GHC.Generics: %Generically1 f = Idiomatically f '[] åA datatype with multiple constructors requires more input from the user: what constructor should be sÉ and how to map between two different constructors in a law-abiding way.This is done by specifying the appliative morphisms (T) between each constructor.r for t can be derived via the Terminal- applicative morphism, biased to the right. RightBias Terminal means that when we lift over Nothing and Just it will result in Nothing. ’data Maybe a = Nothing | Just a deriving stock Generic1 deriving (Functor, Applicative) via Idiomatically Maybe '[RightBias Terminal] The same description derives r for ZipList: ¶type ZipList :: Type -> Type data ZipList a = ZNil | a ::: ZipList deriving stock Generic1 deriving (Functor, Applicative) via Idiomatically ZipList '[RightBias Terminal] d idiomaticAn applicative instance of u biased to the right. It injects s into the v constructor:  pure = LeftBias . InR . pure h idiomaticAn applicative instance of u biased to the left. It injects s into the w constructor:  pure = LeftBias . InL . pure GHIJKLMNOPQRSTUcdefg fgdecø      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeffgghijklmnopqorsotuovwovxoyzo{|o{}o{~ÿ(idiomatic-0.1.0.0-IePr8FFVGvH5SjsT7GipVtGeneric.Applicative.InternalGeneric.Applicative.IdiomGeneric.Applicative Generically1NewSumsreduce ReplaceSumsFlattenConvBæProduct_ BæProduct_convBæProductconvHæProductConvBæProduct BæProduct CheckProduct ProductTagRightOne NormalProduct NotProduct ConvBæSum_BæSum_ convBæSum convHæSum ConvBæSumBæSumCheckSumSumTag RightZero NormalSumNotSum ConvFieldToField convToField convFromField ConvProduct ToProduct convToProductconvFromProductConvSumToSum convToSum convToSumSkip convFromSum~>SumKind absurdZeroabsurdV1flattennest replaceSums placeSums $fConvSumkM1 $fConvSumkV1 $fConvSumk:+:$fConvProductkU1$fConvProductk:*: $fConvSumkM10$fConvFieldk:.:$fConvFieldTYPEPar1$fConvFieldkRec1$fConvFieldkK1$fConvProductkM1$fConvBæSum_kNotSumrep1 $fConvBæProduct_kNotProductrep1!$fConvBæProduct_kRightOneProduct&$fConvBæProduct_kNormalProductProduct$fConvBæSum_kNormalSumSum$fConvBæSum_kRightZeroSum$fGeneric1kNewSums$fApplicativeGenerically1$fFunctorGenerically1$fGeneric1kGenerically1SndFst&&&IdiomDupidiomDupDup CheckIdiomDupOuterInnerTerminalInitialCompIdIdiomidiom$fIdiomTYPEIdfg$fIdiomTYPECompfh$fIdiomTYPEInitialidf$fIdiomTYPETerminalfProxy$fIdiomTYPETerminalfConst$fIdiomTYPEInnerfcomp$fIdiomTYPEOuterfcomp$fIdiomDupTruefProduct$fIdiomDupFalseff'$fIdiomTYPEDupfg$fIdiomTYPE&&&fProduct$fIdiomTYPEFstProductf$fIdiomTYPESndProductg Idiomatically RightBiasLeftBias$fApplicativeLeftBias$fApplicativeRightBias$fIdiomTYPEServeRightBiasr$fIdiomTYPEServelRightBias$fIdiomTYPEServelLeftBias$fFunctorRightBias$fFunctorLeftBiasbaseData.Functor.ConstConst Data.ProxyProxyData.Functor.IdentityIdentityGHC.Base Applicativepure GHC.MaybeMaybeData.Functor.SumSumInRInL