úÎu#rC!      SafeIN!A  is a constructor of kind  (* -> *) -> * operating on ! functors having functions  and % that satisfy the following two laws:     =  where  =  (\_ -> ")   ( p1 p2) =  ( p1) ( p2) where  p1 p2 =  (\proj a -> (# (proj p1 `$` proj p2 a))) 5Note: By parametricity, it suffices for (1) to prove  ( (\_ -> %)) =  (\_ -> %) hThis is the heart of the Multiplate library. Given a plate of functions over some applicative functor fb, create a new plate that applies these functions to the children of each data type in the plate.ÿThis process essentially defines the semantics what the children of these data types are. They don't have to literally be the syntactic children. For example, if a language supports quoted syntax, that quoted syntax behaves more like a literal than as a sub-expression. Therefore, although quoted expressions may syntactically be subexpressions, the user may chose to implement = so that they are not semantically considered subexpressions.$Given a generic builder creating an a -> f a8, use the builder to construct each field of the plate p fD. The builder may need a little help to construct a field of type a -> f aX, so to help out the builder pass it the projection function for the field being built.e.g. Given a plate of type ždata ABCPlate f = ABCPlate { { fieldA :: A -> f B , fieldB :: B -> f B , fieldC :: C -> f C } the instance of  for ABCPlate should be  G builder = ABCPlate (builder fieldA) (builder fieldB) (builder fieldC)  A plate over f$ consists of several fields of type A -> f A for various As. 4 is the type of the projection functions of plates. 5Given a natural transformation between two functors, f and g, and a plate over fB, compose the natural transformation with each field of the plate. Given an ! f,  builds a plate over f whose fields are all ". Generally H is used as the base of a record update. One constructs the expression   { fieldOfInterest" = \a -> case a of | constructorOfInterest -> expr( | _ -> " a } Qand this is a typical parameter that is passed to most functions in this library. Given an & f,  builds a plate over f whose fields are all ' (. Generally H is used as the base of a record update. One constructs the expression   { fieldOfInterest# = \a -> case a of | constructorOfInterest -> expr) | _ -> ( } 2and this is a typical parameter that is passed to  and .Given two plates over a monad m4, the fields of the plate can be Kleisli composed () ) fieldwise.PGiven two plates, they can be composed fieldwise yielding the composite functor. #Given two plates with one over the %4 functor, the two plates can be composed fieldwise. #Given two plates with one over the %4 functor, the two plates can be composed fieldwise. #Given two plates with one over the * o applicative functor for a + o:, each field of the plate can be pointwise appended with ,. (Given a plate whose fields all return a + o,  # produces a plate that returns the -# of all the children of the input. (Given a plate whose fields all return a + o,  # produces a plate that returns the -á of the family of the input. The input itself produces the leftmost element of the concatenation, then this is followed by the family of the first child, then it is followed by the family of the second child, and so forth.(Given a plate whose fields all return a + o,  # produces a plate that returns the -ÿÿ of the family of the input. The concatenation sequence begins with the family of the first child, then it is followed by the family of the second child, and so forth until finally the input itself produces the rightmost element of the concatenation.0Given a plate whose fields transform each type, C returns a plate whose fields transform the children of the input.0Given a plate whose fields transform each type, Ä returns a plate whose fields transform the family of the input. The traversal proceeds bottom up, first transforming the families of the children, before finally transforming the value itself.0Given a plate whose fields transform each type, ˆ returns a plate whose fields transform the children of the input. The processing is sequenced from the first child to the last child.0Given a plate whose fields transform each type,  returns a plate whose fields transform the family of the input. The sequencing is done in a depth-first postorder traversal.7Given a plate whose fields maybe transforms each type, × returns a plate whose fields exhaustively transform the family of the input. The traversal proceeds bottom up, first transforming the families of the children. If a transformation succeeds then the result is re-ed.5A post-condition is that the input transform returns .7 on all family members of the output, or more formally   ( t f) `` ( f) "‘  where t :: forall a. / a -> * 0 a t = * 1 0 1 2 7Given a plate whose fields maybe transforms each type, Æ returns a plate whose fields exhaustively transform the family of the input. The sequencing is done in a depth-first postorder traversal, but if a transformation succeeds then the result is re-ed.Given a plate used for , replace returning .A with returning the input. This transforms plates suitable for  into plates suitable form .Given a plate used for , replace returning .A with returning the input. This transforms plates suitable for  into plates suitable form .1Given a projection function for a plate over the %D functor, upgrade the projection function to strip off the wrapper.-Instantiate a projection function at a monad.1Given a projection function for a plate over the * oD functor, upgrade the projection function to strip off the wrapper.1Given a projection function for a plate over the * o" functor, and a continuation for oV, upgrade the projection function to strip off the wrapper and run the continuation.;Typically the continuation simply strips off a wrapper for o.1Given a projection function for a plate over the * (3 n)E functor, upgrade the projection function to strip off the wrappers.1Given a projection function for a plate over the * (4 n)E functor, upgrade the projection function to strip off the wrappers.1Given a projection function for a plate over the * 0E functor, upgrade the projection function to strip off the wrappers.1Given a projection function for a plate over the * 5E functor, upgrade the projection function to strip off the wrappers.1Given a projection function for a plate over the * (6 n)E functor, upgrade the projection function to strip off the wrappers. 1Given a projection function for a plate over the * (7 n)E functor, upgrade the projection function to strip off the wrappers.!  !  !    8      !"#$%#$&'()#$*#+,#$-#$.#$/#01'23#$4#$5#$6#$7#$8#9:#$;#<=#9>#9?#9@#9A#9BCmulti_8ORTvGjK7qJL6ov2Iceb4CData.Generics.Multiplate Multiplate multiplatemkPlate ProjectorapplyNaturalTransform purePlate emptyPlatekleisliComposePlate composePlatecomposePlateRightIdcomposePlateLeftId appendPlate mChildren preorderFold postorderFold mapChildren mapFamily mapChildrenM mapFamilyM evalFamily evalFamilyMalwaysalwaysM traverseFor traverseMForfoldFor unwrapForsumFor productForallForanyForfirstForlastForbaseGHC.Base Applicativepuretrans_3eG64VdP2vzGjP6wJiCp5XData.Functor.ComposeComposefmapData.Functor.IdentityIdentity Alternativeconstempty Control.Monad<=<Data.Functor.ConstantConstantMonoidmappendmconcatNothingMaybe Data.MonoidAll. Data.Maybe isNothingSumProductAnyFirstLast