úÎ;h8r'      !"#$%&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    = , 2    = , (\ (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 3 defaults while avoiding , . Be sure also to define , or 4( to yield an error message (rather than -ping-ponging infinitely between them via the 3 default definitions).    5 f =  6 7 f 6   f 8 g =  6 f 9 g @In a few cases, there are default methods, as noted below. The defaults do not use ,. Direct arrow into a function's result. Analogous to 7 and  5.  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 = 7 .  . 5 .  . 7#)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 =   .   .  $=To make an extractor, simply apply the extractor-transformer #  to the identity arrow. $ = # % 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 = # %"#$%&"#$%&:       !"#$%&'()*+,-./012345 6 78 9 :;<=>?@ABDeepArrow-0.0.1 Data.Tupler Data.FunArrControl.Arrow.DeepArrow Control.Arrow.DeepArrow.ExamplesbaseGHC.List Control.ArrowGHC.Base Data.TuplePair2unPair2Pair1unPair1waplFunArrtoArr$$funFirst funSecond funResultinpFinpSinpFirst inpSecondflipAunzipA->| DeepArrowresultidAdupAfstAsndAfunFfunSfunRcurryAuncurryAswapAlAssocArAssocAdeepextFextFFextIextFI parensIfSpacetcString tcStringP tcStringSPunziparridfstsndflipcurryuncurryArrowpuresecond>>>first&&&***