úÎ;@8J&      !"#$%portable experimentalconal@conal.net&HDisambuating hack for a function argument. Wrap parens around a string  if it contains a space. ')Extract the type constructor as a string ('% with disambiguating optional parens )'( with leading space and optional parens &Pairing for binary type constructors. %Pairing for unary type constructors. portable experimentalconal@conal.net,Apply a wrapped function to a wrapped value %Convert between an arrow value and a "wrapped function". The "arrow"  doesn' t really have to be an arrow. I'd appreciate ideas for names &  uses.  Convert a w$-wrapped function to an arrow value Apply an arrow to a w-wrapped value   portable experimentalconal@conal.net BPromote a function extractor into one that reaches into the first  element of a pair. CPromote a function extractor into one that reaches into the second  element of a pair. CPromote a function extractor into one that reaches into the result  element of a function. -Extract the first component of a pair input. .Extract the second component of a pair input. Flip argument order Like * but for  arrows instead of lists. Compose wrapped functions EArrows for deep application. Most of these methods could be defined using +, but ++ is not definable for some types. If your  instance has +, you might want to use these implementations     = + ,   = + -    = + (\ x -> (x,x))   = + .    = + (\ (f,b) -> \ c -> (f c, b))   = + (\ (a,f) -> \ c -> (a, f c))   = + /   = + 0    = + 1    = + (\ (a,b) -> (b,a))    = + (\ (a,(b,c)) -> ((a,b),c))  ! = + (\ ((a,b),c) -> (a,(b,c))) If your  instance does not have +, you'll have to come up @with other definitions. In any case, I recommend the following definitions, which mirror 2 defaults while avoiding + . Be sure also to define + or 3( to yield an error message (rather than -ping-ponging infinitely between them via the 2 default definitions).    4 f =  5 6 f 5   f 7 g =  5 f 8 g @In a few cases, there are default methods, as noted below. The defaults do not use +. Apply arrow in a function's result. Analogous to 6 and  4.  Identity.  Duplicate. Extract first. Extract second. %Extract function from first element. &Extract function from second element. Extract function from result.  Curry arrow. Uncurry arrow. Swap elements. Has default. Left-associate. Has default. !Right-associate. Has default.   ! ! portable experimentalconal@conal.net"Given a value of type (a -> (f,b -> (c,g)),e), apply a function to  just the c! part and leave the rest intact. deep = 6 .  . 4 .  . 6#)Given a way to extract a function from a d value, create a way to  extract a function from a (e -> (a,d), f) value. extF =   .   .  9=To make an extractor, simply apply the extractor-transformer #  to the identity arrow. 9 = # $ Extract a b input from a  ((a,(b,e)),c) argument. extI = ( . )  %BTypically, we will have to combine function and input extractors.  For instance, combine # and $. extFI = # $"#$%"#$%:       !"#$%&'()*+,-./01234 5 67 8 9:;<=>?@AB DeepArrow-0.0 Data.Tupler Data.FunArrControl.Arrow.DeepArrow Control.Arrow.DeepArrow.ExamplesbaseGHC.List Control.ArrowGHC.Base Data.TuplePair2unPair2Pair1unPair1waplFunArrtoArr$$funFirst funSecond funResultinpFinpSinpFirst inpSecondflipAunzipA->| DeepArrowresultidAdupAfstAsndAfunFfunSfunRcurryAuncurryAswapAlAssocArAssocAdeepextFextIextFI parensIfSpacetcString tcStringP tcStringSPunziparridfstsndflipcurryuncurryArrowpuresecond>>>first&&&***extFF