úÎÏXËMK      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ Haskell 2010stable Brent Yorgey <byorgey@gmail.com> Safe-Inferred?AInternal representation of a split list that tracks which pieces  are delimiters and which aren't. "Tag chunks as delimiters or text. 8What to do with a blank chunk at either end of the list  (i.e.1 when the list begins or ends with a delimiter). 1What to do with multiple consecutive delimiters? Insert blank chunks  between consecutive  delimiters. Keep consecutive  delimiters separate, but  don't insert blank chunks in  between them. "Condense into a single delimiter. What to do with delimiters? Keep delimiters in the output, ) appending them to the previous chunk. Keep delimiters in the output, $ prepending them to the following  chunk. #Keep delimiters as separate chunks  of the output. !Drop delimiters from the output. AA delimiter is a list of predicates on elements, matched by some % contiguous subsequence of a list. A splitting strategy. What delimiter to split on !What to do with delimiters (drop ! from output, keep as separate % elements in output, or merge with ! previous or following chunks) What to do with multiple  consecutive delimiters Drop an initial blank? Drop a final blank? >The default splitting strategy: keep delimiters in the output  as separate chunks, don' t condense multiple consecutive = delimiters into one, keep initial and final blank chunks. 8 Default delimiter is the constantly false predicate.  Note that " should normally not be used; use  +, ,, or - instead, which are the same as  the % with just the delimiter overridden. The % strategy with any delimiter gives a E maximally information-preserving splitting strategy, in the sense  that (a) taking the K# of the output yields the original B list, and (b) given only the output list, we can reconstruct a  6 which would produce the same output list again given E the original input list. This default strategy can be overridden 5 to allow discarding various sorts of information. @Try to match a delimiter at the start of a list, either failing H or decomposing the list into the portion which matched the delimiter  and the remainder. Untag a . Test whether a  is a delimiter. Test whether a  is text. 8Given a delimiter to use, split a list into an internal B representation with chunks tagged as delimiters or text. This . transformation is lossless; in particular,   L  ( d l) == l.  BGiven a split list in the internal tagged representation, produce C a new internal tagged representation corresponding to the final : output, according to the strategy defined by the given  . !Drop delimiters if the   is . "9Condense multiple consecutive delimiters into one if the   is  . #AInsert blank chunks between any remaining consecutive delimiters " (unless the condense policy is  ), and at the A beginning or end if the first or last element is a delimiter. $4Insert blank chunks between consecutive delimiters. %7Merge delimiters into adjacent chunks according to the  . &=Merge delimiters with adjacent chunks to the right (yes, that's ? not a typo: the delimiters should end up on the left of the ; chunks, so they are merged with chunks to their right). '3Merge delimiters with adjacent chunks to the left. (3Drop an initial blank chunk according to the given . )0Drop a final blank chunk according to the given . *ASplit a list according to the given splitting strategy. This is  how to "run" a % that has been built using the other  combinators. +9A splitting strategy that splits on any one of the given  elements. For example: R split (oneOf "xyz") "aazbxyzcxd" == ["aa","z","b","x","","y","","z","c","x","d"] ,?A splitting strategy that splits on the given list, when it is 6 encountered as an exact subsequence. For example:  > split (onSublist "xyz") "aazbxyzcxd" == ["aazb","xyz","cxd"] ?Note that splitting on the empty list is a special case, which K splits just before every element of the list being split. For example:  9 split (onSublist "") "abc" == ["","","a","","b","","c"] G split (dropDelims . dropBlanks $ onSublist "") "abc" == ["a","b","c"] BHowever, if you want to break a list into singleton elements like " this, you are better off using E 1, or better yet,  M (:[]). -BA splitting strategy that splits on any elements that satisfy the " given predicate. For example: C split (whenElt (<0)) [2,4,-3,6,-9,1] == [[2,4],[-3],[6],[-9],[1]] .8Drop delimiters from the output (the default is to keep  them). For example, 8 split (oneOf ":") "a:b:c" == ["a", ":", "b", ":", "c"] ; split (dropDelims $ oneOf ":") "a:b:c" == ["a", "b", "c"] /=Keep delimiters in the output by prepending them to adjacent  chunks. For example: Q split (keepDelimsL $ oneOf "xyz") "aazbxyzcxd" == ["aa","zb","x","y","zc","xd"] 0<Keep delimiters in the output by appending them to adjacent  chunks. For example: Q split (keepDelimsR $ oneOf "xyz") "aazbxyzcxd" == ["aaz","bx","y","z","cx","d"] 1ACondense multiple consecutive delimiters into one. For example: Q split (condense $ oneOf "xyz") "aazbxyzcxd" == ["aa","z","b","xyz","c","x","d"] K split (dropDelims $ oneOf "xyz") "aazbxyzcxd" == ["aa","b","","","c","d"] P split (condense . dropDelims $ oneOf "xyz") "aazbxyzcxd" == ["aa","b","c","d"] 2Don'8t generate a blank chunk if there is a delimiter at the  beginning. For example: 2 split (oneOf ":") ":a:b" == ["",":","a",":","b"] ? split (dropInitBlank $ oneOf ":") ":a:b" == [":","a",":","b"] 3Don'=t generate a blank chunk if there is a delimiter at the end.  For example: 2 split (oneOf ":") "a:b:" == ["a",":","b",":",""] @ split (dropFinalBlank $ oneOf ":") "a:b:" == ["a",":","b",":"] 4Don'8t generate blank chunks between consecutive delimiters.  For example: J split (oneOf ":") "::b:::a" == ["",":","",":","b",":","",":","",":","a"] T split (dropInnerBlanks $ oneOf ":") "::b:::a" == ["", ":",":","b",":",":",":","a"] 5@Drop all blank chunks from the output, and condense consecutive ' delimiters into one. Equivalent to 2  . 3 . 1. For example: J split (oneOf ":") "::b:::a" == ["",":","",":","b",":","",":","",":","a"] B split (dropBlanks $ oneOf ":") "::b:::a" == ["::","b",":::","a"] 6>Make a strategy that splits a list into chunks that all start ; with the given subsequence (except possibly the first).  Equivalent to 2 . / . ,.  For example: y split (startsWith "app") "applyapplicativeapplaudapproachapple" == ["apply","applicative","applaud","approach","apple"] 7>Make a strategy that splits a list into chunks that all start ? with one of the given elements (except possibly the first).  Equivalent to 2 . / . +. For  example: ` split (startsWithOneOf ['A'..'Z']) "ACamelCaseIdentifier" == ["A","Camel","Case","Identifier"] 8AMake a strategy that splits a list into chunks that all end with C the given subsequence, except possibly the last. Equivalent to  3 . 0 . ,. For example: Y split (endsWith "ly") "happilyslowlygnarlylily" == ["happily","slowly","gnarly","lily"] 9AMake a strategy that splits a list into chunks that all end with D one of the given elements, except possibly the last. Equivalent  to 3 . 0 . +. For example: q split (condense $ endsWithOneOf ".,?! ") "Hi, there! How are you?" == ["Hi, ","there! ","How ","are ","you?"] :3Split on any of the given elements. Equivalent to *  . . . +. For example: E splitOneOf ";.," "foo,bar;baz.glurk" == ["foo","bar","baz","glurk"] ;+Split on the given sublist. Equivalent to *  . . . ,. For example:  < splitOn ".." "a..b...c....d.." == ["a","b",".c","","d",""] <In some parsing combinator frameworks this is also known as  sepBy. +Note that this is the right inverse of the  function  from  Data.List , that is,  " intercalate x . splitOn x === id ; x .  x is the identity on C certain lists, but it is tricky to state the precise conditions B under which this holds. (For example, it is not enough to say  that x3 does not occur in any elements of the input list. ; Working out why is left as an exercise for the reader.) <ASplit on elements satisfying the given predicate. Equivalent to  * . . . -. For example: ; splitWhen (<0) [1,3,-4,5,7,-9,0,2] == [[1,3],[5,7],[0,2]] ?7Split into chunks terminated by the given subsequence.  Equivalent to * . 3 . .  . ,. For example:  1 endBy ";" "foo;bar;baz;" == ["foo","bar","baz"] Note also that the N function from  Data.List is equivalent  to ? "\n". @;Split into chunks terminated by one of the given elements.  Equivalent to * . 3 . .  . +. For example: 7 endByOneOf ";," "foo;bar,baz;" == ["foo","bar","baz"] B Split into "words"., with word boundaries indicated by the given  predicate. Satisfies  === wordsBy  ; equivalent to * . 5  . . . -. For example: < wordsBy (=='x') "dogxxxcatxbirdxx" == ["dog","cat","bird"] C Split into "lines"., with line boundaries indicated by the given  predicate. Satisfies N === linesBy (=='\n'); equivalent to  * . 3 . . . -. For example: E linesBy (=='x') "dogxxxcatxbirdxx" == ["dog","","","cat","bird",""] D8Standard build function, specialized to building lists. 'Usually build is given the rank-2 type  5 build :: (forall b. (a -> b -> b) -> b -> b) -> [a] but since we only use it when (b ~ [a]), we give it the more 9 restricted type signature in order to avoid needing a  non-Haskell2010 extension. >Note that the 0.1.4.3 release of this package did away with a  custom build/ implementation in favor of importing one from  GHC.Exts7, which was (reportedly) faster for some applications. C However, in the interest of simplicity and complete Haskell2010  compliance as split+ is being included in the Haskel Platform, - version 0.2.1.0 has gone back to defining build manually. This  is in line with split')s design philosophy of having efficiency  as a non-goal. EE n/ splits a list into length-n pieces. The last  piece will be shorter if n& does not evenly divide the length of  the list. If n <= 0, E n l returns an infinite list ! of empty lists. For example:  Note that E n [] is [], not [[]] . This is A intentional, and is consistent with a recursive definition of  E!; it satisfies the property that  7chunksOf n xs ++ chunksOf n ys == chunksOf n (xs ++ ys) whenever n evenly divides the length of xs. H<Split a list into chunks of the given lengths. For example:  : splitPlaces [2,3,4] [1..20] == [[1,2],[3,4,5],[6,7,8,9]] 9 splitPlaces [4,9] [1..10] == [[1,2,3,4],[5,6,7,8,9,10]] ; splitPlaces [4,9,3] [1..10] == [[1,2,3,4],[5,6,7,8,9,10]] AIf the input list is longer than the total of the given lengths, C then the remaining elements are dropped. If the list is shorter D than the total of the given lengths, then the result may contain B fewer chunks than requested, and the last chunk may be shorter  than requested. I6Split a list into chunks of the given lengths. Unlike  H4, the output list will always be the same length as B the first input argument. If the input list is longer than the ? total of the given lengths, then the remaining elements are ? dropped. If the list is shorter than the total of the given > lengths, then the last several chunks will be shorter than $ requested or empty. For example:  @ splitPlacesBlanks [2,3,4] [1..20] == [[1,2],[3,4,5],[6,7,8,9]] ? splitPlacesBlanks [4,9] [1..10] == [[1,2,3,4],[5,6,7,8,9,10]] D splitPlacesBlanks [4,9,3] [1..10] == [[1,2,3,4],[5,6,7,8,9,10],[]] @Notice the empty list in the output of the third example, which  differs from the behavior of H. JBA useful recursion pattern for processing a list to produce a new  list, often used for "chopping" up the input list. Typically B chop is called with some function that will consume an initial D prefix of the list and produce a value and the rest of the list. AFor example, many common Prelude functions can be implemented in  terms of chop: ! group :: (Eq a) => [a] -> [[a]] , group = chop (\ xs@(x:_) -> span (==x) xs)   words :: String -> [String] O words = filter (not . null) . chop (span (not . isSpace) . dropWhile isSpace) K  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ9    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ Haskell 2010stable Brent Yorgey <byorgey@gmail.com> Safe-Inferred"*+,-./0123456789:;<=>?@ABCEFGHIJ";:<?@BCEHIJ*+,-./0123456789=>AGFO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSQRTQUVQWX split-0.2.2Data.List.Split.Internals Data.List intercalatewords Data.CharisSpaceData.List.Split SplitListChunkTextDelim EndPolicy KeepBlank DropBlankCondensePolicyKeepBlankFieldsDropBlankFieldsCondense DelimPolicy KeepRightKeepLeftKeepDrop DelimiterSplitter delimiter delimPolicycondensePolicyinitBlankPolicyfinalBlankPolicydefaultSplitter matchDelimfromElemisDelimisText splitInternal breakDelim postProcessdoDrop doCondense insertBlanks insertBlanks'doMerge mergeLeft mergeRight dropInitial dropFinalsplitoneOf onSublistwhenElt dropDelims keepDelimsL keepDelimsRcondense dropInitBlankdropFinalBlankdropInnerBlanks dropBlanks startsWithstartsWithOneOfendsWith endsWithOneOf splitOneOfsplitOn splitWhensepBy sepByOneOfendBy endByOneOf unintercalatewordsBylinesBybuildchunksOfchunk splitEvery splitPlacessplitPlacesBlankschopbaseGHC.Listconcat concatMapGHC.Basemaplines