<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Data.List.Split.Internals</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[ window.onload = function () {pageLoad();setSynopsis("mini_Data-List-Split-Internals.html");}; //]]> </script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="src/Data-List-Split-Internals.html">Source</a></li><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">split-0.1.3: Combinator library for splitting lists.</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Portability</th><td>unportable (GADTs, Rank2Types)</td></tr><tr><th>Stability</th><td>experimental</td></tr><tr><th>Maintainer</th><td>byorgey@gmail.com</td></tr></table><p class="caption">Data.List.Split.Internals</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Types and utilities </a></li><li><a href="#g:2">Implementation </a></li><li><a href="#g:3">Combinators </a><ul><li><a href="#g:4">Basic strategies </a></li><li><a href="#g:5">Strategy transformers </a></li><li><a href="#g:6">Derived combinators </a></li><li><a href="#g:7">Convenience functions </a></li></ul></li><li><a href="#g:8">Other splitting methods </a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>Implementation module for <a href="Data-List-Split.html">Data.List.Split</a>, a combinator library for splitting lists. See the <a href="Data-List-Split.html">Data.List.Split</a> documentation for more description and examples. </p></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">data</span> <a href="#t:Splitter">Splitter</a> a = <a href="#v:Splitter">Splitter</a> {<ul class="subs"><li><a href="#v:delimiter">delimiter</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a</li><li><a href="#v:delimPolicy">delimPolicy</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></li><li><a href="#v:condensePolicy">condensePolicy</a> :: <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a></li><li><a href="#v:initBlankPolicy">initBlankPolicy</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></li><li><a href="#v:finalBlankPolicy">finalBlankPolicy</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></li></ul>}</li><li class="src short"><a href="#v:defaultSplitter">defaultSplitter</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><span class="keyword">data</span> <a href="#t:Delimiter">Delimiter</a> a <span class="keyword">where</span><ul class="subs"><li><a href="#v:DelimEltPred">DelimEltPred</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a </li><li><a href="#v:DelimSublist">DelimSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a </li></ul></li><li class="src short"><a href="#v:matchDelim">matchDelim</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([a], [a])</li><li class="src short"><span class="keyword">data</span> <a href="#t:DelimPolicy">DelimPolicy</a> <ul class="subs"><li>= <a href="#v:Drop">Drop</a> </li><li>| <a href="#v:Keep">Keep</a> </li><li>| <a href="#v:KeepLeft">KeepLeft</a> </li><li>| <a href="#v:KeepRight">KeepRight</a> </li></ul></li><li class="src short"><span class="keyword">data</span> <a href="#t:CondensePolicy">CondensePolicy</a> <ul class="subs"><li>= <a href="#v:Condense">Condense</a> </li><li>| <a href="#v:KeepBlankFields">KeepBlankFields</a> </li></ul></li><li class="src short"><span class="keyword">data</span> <a href="#t:EndPolicy">EndPolicy</a> <ul class="subs"><li>= <a href="#v:DropBlank">DropBlank</a> </li><li>| <a href="#v:KeepBlank">KeepBlank</a> </li></ul></li><li class="src short"><span class="keyword">data</span> <a href="#t:Chunk">Chunk</a> a<ul class="subs"><li>= <a href="#v:Delim">Delim</a> [a] </li><li>| <a href="#v:Text">Text</a> [a] </li></ul></li><li class="src short"><span class="keyword">type</span> <a href="#t:SplitList">SplitList</a> a = [<a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a]</li><li class="src short"><a href="#v:fromElem">fromElem</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> [a]</li><li class="src short"><a href="#v:isDelim">isDelim</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:isText">isText</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a></li><li class="src short"><a href="#v:build">build</a> :: (<span class="keyword">forall</span> b. (a -> b -> b) -> b -> b) -> [a]</li><li class="src short"><a href="#v:splitInternal">splitInternal</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:breakDelim">breakDelim</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> ([a], <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([a], [a]))</li><li class="src short"><a href="#v:matchSublist">matchSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> [a]</li><li class="src short"><a href="#v:postProcess">postProcess</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:doDrop">doDrop</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:doCondense">doCondense</a> :: <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:insertBlanks">insertBlanks</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:insertBlanks-39-">insertBlanks'</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:doMerge">doMerge</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:mergeLeft">mergeLeft</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:mergeRight">mergeRight</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:dropInitial">dropInitial</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:dropFinal">dropFinal</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a</li><li class="src short"><a href="#v:split">split</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> [a] -> [[a]]</li><li class="src short"><a href="#v:oneOf">oneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:onSublist">onSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:whenElt">whenElt</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:dropDelims">dropDelims</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:keepDelimsL">keepDelimsL</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:keepDelimsR">keepDelimsR</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:condense">condense</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:dropInitBlank">dropInitBlank</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:dropFinalBlank">dropFinalBlank</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:dropBlanks">dropBlanks</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:startsWith">startsWith</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:startsWithOneOf">startsWithOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:endsWith">endsWith</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:endsWithOneOf">endsWithOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a</li><li class="src short"><a href="#v:splitOneOf">splitOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:splitOn">splitOn</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:splitWhen">splitWhen</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]</li><li class="src short"><a href="#v:sepBy">sepBy</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:sepByOneOf">sepByOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:endBy">endBy</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:endByOneOf">endByOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:unintercalate">unintercalate</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]</li><li class="src short"><a href="#v:wordsBy">wordsBy</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]</li><li class="src short"><a href="#v:linesBy">linesBy</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]</li><li class="src short"><a href="#v:splitEvery">splitEvery</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Int.html#t:Int">Int</a> -> [e] -> [[e]]</li><li class="src short"><a href="#v:chunk">chunk</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Int.html#t:Int">Int</a> -> [e] -> [[e]]</li><li class="src short"><a href="#v:splitPlaces">splitPlaces</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integral">Integral</a> a => [a] -> [e] -> [[e]]</li><li class="src short"><a href="#v:chop">chop</a> :: ([a] -> (b, [a])) -> [a] -> [b]</li></ul></div><div id="interface"><h1 id="g:1">Types and utilities </h1><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Splitter" class="def">Splitter</a> a <a href="src/Data-List-Split-Internals.html#Splitter" class="link">Source</a></p><div class="doc"><p>A splitting strategy. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Splitter" class="def">Splitter</a></td><td class="doc empty"> </td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:delimiter" class="def">delimiter</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a</dt><dd class="doc"><p>What delimiter to split on </p></dd><dt class="src"><a name="v:delimPolicy" class="def">delimPolicy</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></dt><dd class="doc"><p>What to do with delimiters (drop from output, keep as separate elements in output, or merge with previous or following chunks) </p></dd><dt class="src"><a name="v:condensePolicy" class="def">condensePolicy</a> :: <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a></dt><dd class="doc"><p>What to do with multiple consecutive delimiters </p></dd><dt class="src"><a name="v:initBlankPolicy" class="def">initBlankPolicy</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></dt><dd class="doc"><p>Drop an initial blank? </p></dd><dt class="src"><a name="v:finalBlankPolicy" class="def">finalBlankPolicy</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></dt><dd class="doc"><p>Drop a final blank? </p></dd></dl><div class="clear"></div></div></td></tr></table></div></div><div class="top"><p class="src"><a name="v:defaultSplitter" class="def">defaultSplitter</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#defaultSplitter" class="link">Source</a></p><div class="doc"><p>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. Default delimiter is the constantly false predicate. </p><p>Note that <code><a href="Data-List-Split-Internals.html#v:defaultSplitter">defaultSplitter</a></code> should normally not be used; use <code><a href="Data-List-Split-Internals.html#v:oneOf">oneOf</a></code>, <code><a href="Data-List-Split-Internals.html#v:onSublist">onSublist</a></code>, or <code><a href="Data-List-Split-Internals.html#v:whenElt">whenElt</a></code> instead, which are the same as the <code><a href="Data-List-Split-Internals.html#v:defaultSplitter">defaultSplitter</a></code> with just the delimiter overridden. </p><p>The <code><a href="Data-List-Split-Internals.html#v:defaultSplitter">defaultSplitter</a></code> strategy with any delimiter gives a maximally information-preserving splitting strategy, in the sense that (a) taking the <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:concat">concat</a></code> of the output yields the original list, and (b) given only the output list, we can reconstruct a <code><a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a></code> which would produce the same output list again given the original input list. This default strategy can be overridden to allow discarding various sorts of information. </p></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Delimiter" class="def">Delimiter</a> a <span class="keyword">where</span><a href="src/Data-List-Split-Internals.html#Delimiter" class="link">Source</a></p><div class="doc"><p>A delimiter can either be a predicate on elements, or a list of elements to be matched as a subsequence. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:DelimEltPred" class="def">DelimEltPred</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a</td><td class="doc empty"> </td></tr><tr><td class="src"><a name="v:DelimSublist" class="def">DelimSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a</td><td class="doc empty"> </td></tr></table></div></div><div class="top"><p class="src"><a name="v:matchDelim" class="def">matchDelim</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([a], [a])<a href="src/Data-List-Split-Internals.html#matchDelim" class="link">Source</a></p><div class="doc"><p>Try to match a delimiter at the start of a list, either failing or decomposing the list into the portion which matched the delimiter and the remainder. </p></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:DelimPolicy" class="def">DelimPolicy</a> <a href="src/Data-List-Split-Internals.html#DelimPolicy" class="link">Source</a></p><div class="doc"><p>What to do with delimiters? </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Drop" class="def">Drop</a></td><td class="doc"><p>Drop delimiters from the output. </p></td></tr><tr><td class="src"><a name="v:Keep" class="def">Keep</a></td><td class="doc"><p>Keep delimiters as separate chunks of the output. </p></td></tr><tr><td class="src"><a name="v:KeepLeft" class="def">KeepLeft</a></td><td class="doc"><p>Keep delimiters in the output, prepending them to the following chunk. </p></td></tr><tr><td class="src"><a name="v:KeepRight" class="def">KeepRight</a></td><td class="doc"><p>Keep delimiters in the output, appending them to the previous chunk. </p></td></tr></table></div><div class="subs instances"><p id="control.i:DelimPolicy" class="caption collapser" onclick="toggleSection('i:DelimPolicy')">Instances</p><div id="section.i:DelimPolicy" class="show"><table><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Text-Show.html#t:Show">Show</a> <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:CondensePolicy" class="def">CondensePolicy</a> <a href="src/Data-List-Split-Internals.html#CondensePolicy" class="link">Source</a></p><div class="doc"><p>What to do with multiple consecutive delimiters? </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Condense" class="def">Condense</a></td><td class="doc"><p>Condense into a single delimiter. </p></td></tr><tr><td class="src"><a name="v:KeepBlankFields" class="def">KeepBlankFields</a></td><td class="doc"><p>Insert blank chunks between consecutive delimiters. </p></td></tr></table></div><div class="subs instances"><p id="control.i:CondensePolicy" class="caption collapser" onclick="toggleSection('i:CondensePolicy')">Instances</p><div id="section.i:CondensePolicy" class="show"><table><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Text-Show.html#t:Show">Show</a> <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:EndPolicy" class="def">EndPolicy</a> <a href="src/Data-List-Split-Internals.html#EndPolicy" class="link">Source</a></p><div class="doc"><p>What to do with a blank chunk at either end of the list (i.e. when the list begins or ends with a delimiter). </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:DropBlank" class="def">DropBlank</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a name="v:KeepBlank" class="def">KeepBlank</a></td><td class="doc empty"> </td></tr></table></div><div class="subs instances"><p id="control.i:EndPolicy" class="caption collapser" onclick="toggleSection('i:EndPolicy')">Instances</p><div id="section.i:EndPolicy" class="show"><table><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Text-Show.html#t:Show">Show</a> <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Chunk" class="def">Chunk</a> a <a href="src/Data-List-Split-Internals.html#Chunk" class="link">Source</a></p><div class="doc"><p>Tag chunks as delimiters or text. </p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Delim" class="def">Delim</a> [a]</td><td class="doc empty"> </td></tr><tr><td class="src"><a name="v:Text" class="def">Text</a> [a]</td><td class="doc empty"> </td></tr></table></div><div class="subs instances"><p id="control.i:Chunk" class="caption collapser" onclick="toggleSection('i:Chunk')">Instances</p><div id="section.i:Chunk" class="show"><table><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> (<a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a)</td><td class="doc empty"> </td></tr><tr><td class="src"><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Text-Show.html#t:Show">Show</a> a => <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Text-Show.html#t:Show">Show</a> (<a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a)</td><td class="doc empty"> </td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:SplitList" class="def">SplitList</a> a = [<a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a]<a href="src/Data-List-Split-Internals.html#SplitList" class="link">Source</a></p><div class="doc"><p>Internal representation of a split list that tracks which pieces are delimiters and which aren't. </p></div></div><div class="top"><p class="src"><a name="v:fromElem" class="def">fromElem</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> [a]<a href="src/Data-List-Split-Internals.html#fromElem" class="link">Source</a></p><div class="doc"><p>Untag a <code><a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:isDelim" class="def">isDelim</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a><a href="src/Data-List-Split-Internals.html#isDelim" class="link">Source</a></p><div class="doc"><p>Test whether a <code><a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a></code> is a delimiter. </p></div></div><div class="top"><p class="src"><a name="v:isText" class="def">isText</a> :: <a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a> a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a><a href="src/Data-List-Split-Internals.html#isText" class="link">Source</a></p><div class="doc"><p>Test whether a <code><a href="Data-List-Split-Internals.html#t:Chunk">Chunk</a></code> is text. </p></div></div><div class="top"><p class="src"><a name="v:build" class="def">build</a> :: (<span class="keyword">forall</span> b. (a -> b -> b) -> b -> b) -> [a]<a href="src/Data-List-Split-Internals.html#build" class="link">Source</a></p><div class="doc"><p>Standard build function. </p></div></div><h1 id="g:2">Implementation </h1><div class="top"><p class="src"><a name="v:splitInternal" class="def">splitInternal</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#splitInternal" class="link">Source</a></p><div class="doc"><p>Given a delimiter to use, split a list into an internal representation with chunks tagged as delimiters or text. This transformation is lossless; in particular, <code><code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:concatMap">concatMap</a></code> <code><a href="Data-List-Split-Internals.html#v:fromElem">fromElem</a></code> (<code><a href="Data-List-Split-Internals.html#v:splitInternal">splitInternal</a></code> d l) == l</code>. </p></div></div><div class="top"><p class="src"><a name="v:breakDelim" class="def">breakDelim</a> :: <a href="Data-List-Split-Internals.html#t:Delimiter">Delimiter</a> a -> [a] -> ([a], <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> ([a], [a]))<a href="src/Data-List-Split-Internals.html#breakDelim" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:matchSublist" class="def">matchSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Maybe.html#t:Maybe">Maybe</a> [a]<a href="src/Data-List-Split-Internals.html#matchSublist" class="link">Source</a></p></div><div class="top"><p class="src"><a name="v:postProcess" class="def">postProcess</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#postProcess" class="link">Source</a></p><div class="doc"><p>Given a split list in the internal tagged representation, produce a new internal tagged representation corresponding to the final output, according to the strategy defined by the given <code><a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:doDrop" class="def">doDrop</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#doDrop" class="link">Source</a></p><div class="doc"><p>Drop delimiters if the <code><a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></code> is <code><a href="Data-List-Split-Internals.html#v:Drop">Drop</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:doCondense" class="def">doCondense</a> :: <a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#doCondense" class="link">Source</a></p><div class="doc"><p>Condense multiple consecutive delimiters into one if the <code><a href="Data-List-Split-Internals.html#t:CondensePolicy">CondensePolicy</a></code> is <code><a href="Data-List-Split-Internals.html#v:Condense">Condense</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:insertBlanks" class="def">insertBlanks</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#insertBlanks" class="link">Source</a></p><div class="doc"><p>Insert blank chunks between any remaining consecutive delimiters, and at the beginning or end if the first or last element is a delimiter. </p></div></div><div class="top"><p class="src"><a name="v:insertBlanks-39-" class="def">insertBlanks'</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#insertBlanks%27" class="link">Source</a></p><div class="doc"><p>Insert blank chunks between consecutive delimiters. </p></div></div><div class="top"><p class="src"><a name="v:doMerge" class="def">doMerge</a> :: <a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#doMerge" class="link">Source</a></p><div class="doc"><p>Merge delimiters into adjacent chunks according to the <code><a href="Data-List-Split-Internals.html#t:DelimPolicy">DelimPolicy</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:mergeLeft" class="def">mergeLeft</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#mergeLeft" class="link">Source</a></p><div class="doc"><p>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). </p></div></div><div class="top"><p class="src"><a name="v:mergeRight" class="def">mergeRight</a> :: <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#mergeRight" class="link">Source</a></p><div class="doc"><p>Merge delimiters with adjacent chunks to the left. </p></div></div><div class="top"><p class="src"><a name="v:dropInitial" class="def">dropInitial</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#dropInitial" class="link">Source</a></p><div class="doc"><p>Drop an initial blank chunk according to the given <code><a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:dropFinal" class="def">dropFinal</a> :: <a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a> -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a -> <a href="Data-List-Split-Internals.html#t:SplitList">SplitList</a> a<a href="src/Data-List-Split-Internals.html#dropFinal" class="link">Source</a></p><div class="doc"><p>Drop a final blank chunk according to the given <code><a href="Data-List-Split-Internals.html#t:EndPolicy">EndPolicy</a></code>. </p></div></div><h1 id="g:3">Combinators </h1><div class="top"><p class="src"><a name="v:split" class="def">split</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#split" class="link">Source</a></p><div class="doc"><p>Split a list according to the given splitting strategy. This is how to "run" a <code><a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a></code> that has been built using the other combinators. </p></div></div><h2 id="g:4">Basic strategies </h2><div class="doc"><p>All these basic strategies have the same parameters as the <code><a href="Data-List-Split-Internals.html#v:defaultSplitter">defaultSplitter</a></code> except for the delimiters. </p></div><div class="top"><p class="src"><a name="v:oneOf" class="def">oneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#oneOf" class="link">Source</a></p><div class="doc"><p>A splitting strategy that splits on any one of the given elements. For example: </p><pre> split (oneOf "xyz") "aazbxyzcxd" == ["aa","z","b","x","","y","","z","c","x","d"] </pre></div></div><div class="top"><p class="src"><a name="v:onSublist" class="def">onSublist</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#onSublist" class="link">Source</a></p><div class="doc"><p>A splitting strategy that splits on the given list, when it is encountered as an exact subsequence. For example: </p><pre> split (onSublist "xyz") "aazbxyzcxd" == ["aazb","xyz","cxd"] </pre><p>Note that splitting on the empty list is a special case, which splits just before every element of the list being split. For example: </p><pre> split (onSublist "") "abc" == ["","","a","","b","","c"] split (dropDelims . dropBlanks $ onSublist "") "abc" == ["a","b","c"] </pre><p>However, if you want to break a list into singleton elements like this, you are better off using <code><code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code> 1</code>, or better yet, <code><code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:map">map</a></code> (:[])</code>. </p></div></div><div class="top"><p class="src"><a name="v:whenElt" class="def">whenElt</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#whenElt" class="link">Source</a></p><div class="doc"><p>A splitting strategy that splits on any elements that satisfy the given predicate. For example: </p><pre> split (whenElt (<0)) [2,4,-3,6,-9,1] == [[2,4],[-3],[6],[-9],[1]] </pre></div></div><h2 id="g:5">Strategy transformers </h2><div class="top"><p class="src"><a name="v:dropDelims" class="def">dropDelims</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#dropDelims" class="link">Source</a></p><div class="doc"><p>Drop delimiters from the output (the default is to keep them). For example, </p><pre> split (oneOf ":") "a:b:c" == ["a", ":", "b", ":", "c"] split (dropDelims $ oneOf ":") "a:b:c" == ["a", "b", "c"] </pre></div></div><div class="top"><p class="src"><a name="v:keepDelimsL" class="def">keepDelimsL</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#keepDelimsL" class="link">Source</a></p><div class="doc"><p>Keep delimiters in the output by prepending them to adjacent chunks. For example: </p><pre> split (keepDelimsL $ oneOf "xyz") "aazbxyzcxd" == ["aa","zb","x","y","zc","xd"] </pre></div></div><div class="top"><p class="src"><a name="v:keepDelimsR" class="def">keepDelimsR</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#keepDelimsR" class="link">Source</a></p><div class="doc"><p>Keep delimiters in the output by appending them to adjacent chunks. For example: </p><pre> split (keepDelimsR $ oneOf "xyz") "aazbxyzcxd" == ["aaz","bx","y","z","cx","d"] </pre></div></div><div class="top"><p class="src"><a name="v:condense" class="def">condense</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#condense" class="link">Source</a></p><div class="doc"><p>Condense multiple consecutive delimiters into one. For example: </p><pre> split (condense $ oneOf "xyz") "aazbxyzcxd" == ["aa","z","b","xyz","c","x","d"] split (dropDelims $ oneOf "xyz") "aazbxyzcxd" == ["aa","b","","","c","d"] split (condense . dropDelims $ oneOf "xyz") "aazbxyzcxd" == ["aa","b","c","d"] </pre></div></div><div class="top"><p class="src"><a name="v:dropInitBlank" class="def">dropInitBlank</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#dropInitBlank" class="link">Source</a></p><div class="doc"><p>Don't generate a blank chunk if there is a delimiter at the beginning. For example: </p><pre> split (oneOf ":") ":a:b" == ["",":","a",":","b"] split (dropInitBlank $ oneOf ":") ":a:b" == [":","a",":","b"] </pre></div></div><div class="top"><p class="src"><a name="v:dropFinalBlank" class="def">dropFinalBlank</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#dropFinalBlank" class="link">Source</a></p><div class="doc"><p>Don't generate a blank chunk if there is a delimiter at the end. For example: </p><pre> split (oneOf ":") "a:b:" == ["a",":","b",":",""] split (dropFinalBlank $ oneOf ":") "a:b:" == ["a",":","b",":"] </pre></div></div><h2 id="g:6">Derived combinators </h2><div class="top"><p class="src"><a name="v:dropBlanks" class="def">dropBlanks</a> :: <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#dropBlanks" class="link">Source</a></p><div class="doc"><p>Drop all blank chunks from the output. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:dropInitBlank">dropInitBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropFinalBlank">dropFinalBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:condense">condense</a></code></code>. For example: </p><pre> split (oneOf ":") "::b:::a" == ["",":","",":","b",":","",":","",":","a"] split (dropBlanks $ oneOf ":") "::b:::a" == ["::","b",":::","a"] </pre></div></div><div class="top"><p class="src"><a name="v:startsWith" class="def">startsWith</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#startsWith" class="link">Source</a></p><div class="doc"><p>Make a strategy that splits a list into chunks that all start with the given subsequence (except possibly the first). Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:dropInitBlank">dropInitBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:keepDelimsL">keepDelimsL</a></code> . <code><a href="Data-List-Split-Internals.html#v:onSublist">onSublist</a></code></code>. For example: </p><pre> split (startsWith "app") "applyapplicativeapplaudapproachapple" == ["apply","applicative","applaud","approach","apple"] </pre></div></div><div class="top"><p class="src"><a name="v:startsWithOneOf" class="def">startsWithOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#startsWithOneOf" class="link">Source</a></p><div class="doc"><p>Make a strategy that splits a list into chunks that all start with one of the given elements (except possibly the first). Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:dropInitBlank">dropInitBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:keepDelimsL">keepDelimsL</a></code> . <code><a href="Data-List-Split-Internals.html#v:oneOf">oneOf</a></code></code>. For example: </p><pre> split (startsWithOneOf ['A'..'Z']) "ACamelCaseIdentifier" == ["A","Camel","Case","Identifier"] </pre></div></div><div class="top"><p class="src"><a name="v:endsWith" class="def">endsWith</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#endsWith" class="link">Source</a></p><div class="doc"><p>Make a strategy that splits a list into chunks that all end with the given subsequence, except possibly the last. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:dropFinalBlank">dropFinalBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:keepDelimsR">keepDelimsR</a></code> . <code><a href="Data-List-Split-Internals.html#v:onSublist">onSublist</a></code></code>. For example: </p><pre> split (endsWith "ly") "happilyslowlygnarlylily" == ["happily","slowly","gnarly","lily"] </pre></div></div><div class="top"><p class="src"><a name="v:endsWithOneOf" class="def">endsWithOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> <a href="Data-List-Split-Internals.html#t:Splitter">Splitter</a> a<a href="src/Data-List-Split-Internals.html#endsWithOneOf" class="link">Source</a></p><div class="doc"><p>Make a strategy that splits a list into chunks that all end with one of the given elements, except possibly the last. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:dropFinalBlank">dropFinalBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:keepDelimsR">keepDelimsR</a></code> . <code><a href="Data-List-Split-Internals.html#v:oneOf">oneOf</a></code></code>. For example: </p><pre> split (condense $ endsWithOneOf ".,?! ") "Hi, there! How are you?" == ["Hi, ","there! ","How ","are ","you?"] </pre></div></div><h2 id="g:7">Convenience functions </h2><div class="top"><p class="src"><a name="v:splitOneOf" class="def">splitOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#splitOneOf" class="link">Source</a></p><div class="doc"><p>Split on any of the given elements. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:split">split</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropDelims">dropDelims</a></code> . <code><a href="Data-List-Split-Internals.html#v:oneOf">oneOf</a></code></code>. For example: </p><pre> splitOneOf ";.," "foo,bar;baz.glurk" == ["foo","bar","baz","glurk"] </pre></div></div><div class="top"><p class="src"><a name="v:splitOn" class="def">splitOn</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#splitOn" class="link">Source</a></p><div class="doc"><p>Split on the given sublist. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:split">split</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropDelims">dropDelims</a></code> . <code><a href="Data-List-Split-Internals.html#v:onSublist">onSublist</a></code></code>. For example: </p><pre> splitOn ".." "a..b...c....d.." == ["a","b",".c","","d",""] </pre></div></div><div class="top"><p class="src"><a name="v:splitWhen" class="def">splitWhen</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#splitWhen" class="link">Source</a></p><div class="doc"><p>Split on elements satisfying the given predicate. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:split">split</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropDelims">dropDelims</a></code> . <code><a href="Data-List-Split-Internals.html#v:whenElt">whenElt</a></code></code>. For example: </p><pre> splitWhen (<0) [1,3,-4,5,7,-9,0,2] == [[1,3],[5,7],[0,2]] </pre></div></div><div class="top"><p class="src"><a name="v:sepBy" class="def">sepBy</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#sepBy" class="link">Source</a></p><div class="doc"><p>A synonym for <code><a href="Data-List-Split-Internals.html#v:splitOn">splitOn</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:sepByOneOf" class="def">sepByOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#sepByOneOf" class="link">Source</a></p><div class="doc"><p>A synonym for <code><a href="Data-List-Split-Internals.html#v:splitOneOf">splitOneOf</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:endBy" class="def">endBy</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#endBy" class="link">Source</a></p><div class="doc"><p>Split into chunks terminated by the given subsequence. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:split">split</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropFinalBlank">dropFinalBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropDelims">dropDelims</a></code> . <code><a href="Data-List-Split-Internals.html#v:onSublist">onSublist</a></code></code>. For example: </p><pre> endBy ";" "foo;bar;baz;" == ["foo","bar","baz"] </pre><p>Note also that the <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:lines">lines</a></code> function from <a href="Data-List.html">Data.List</a> is equivalent to <code><code><a href="Data-List-Split-Internals.html#v:endBy">endBy</a></code> "\n"</code>. </p></div></div><div class="top"><p class="src"><a name="v:endByOneOf" class="def">endByOneOf</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#endByOneOf" class="link">Source</a></p><div class="doc"><p>Split into chunks terminated by one of the given elements. Equivalent to <code><code><a href="Data-List-Split-Internals.html#v:split">split</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropFinalBlank">dropFinalBlank</a></code> . <code><a href="Data-List-Split-Internals.html#v:dropDelims">dropDelims</a></code> . <code><a href="Data-List-Split-Internals.html#v:oneOf">oneOf</a></code></code>. </p></div></div><div class="top"><p class="src"><a name="v:unintercalate" class="def">unintercalate</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Eq.html#t:Eq">Eq</a> a => [a] -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#unintercalate" class="link">Source</a></p><div class="doc"><p>A synonym for <code><a href="Data-List-Split-Internals.html#v:sepBy">sepBy</a></code> / <code><a href="Data-List-Split-Internals.html#v:splitOn">splitOn</a></code>. </p><p>Note that this is the right inverse of the <code>intercalate</code> function from <a href="Data-List.html">Data.List</a>, that is, <code><code>intercalate</code> x . <code><a href="Data-List-Split-Internals.html#v:unintercalate">unintercalate</a></code> x == <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#v:id">id</a></code></code>. It is also the case that <code><code><a href="Data-List-Split-Internals.html#v:unintercalate">unintercalate</a></code> x . <code>intercalate</code> x</code> is idempotent. <code><code><a href="Data-List-Split-Internals.html#v:unintercalate">unintercalate</a></code> x . <code>intercalate</code> x</code> is the identity on certain lists, but it is tricky to state the precise conditions under which this holds. (For example, it is not enough to say that <code>x</code> does not occur in any elements of the input list. Working out why is left as an exercise for the reader.) </p></div></div><div class="top"><p class="src"><a name="v:wordsBy" class="def">wordsBy</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#wordsBy" class="link">Source</a></p><div class="doc"><p>Split into words, with word boundaries indicated by the given predicate. Satisfies <code>words === wordsBy isSpace</code>; equivalent to <code>split . dropBlanks . dropDelims . whenElt</code>. For example: </p><pre> wordsBy (=='x') "dogxxxcatxbirdxx" == ["dog","cat","bird"] </pre></div></div><div class="top"><p class="src"><a name="v:linesBy" class="def">linesBy</a> :: (a -> <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Bool.html#t:Bool">Bool</a>) -> [a] -> [[a]]<a href="src/Data-List-Split-Internals.html#linesBy" class="link">Source</a></p><div class="doc"><p>Split into lines, with line boundaries indicated by the given predicate. Satisfies <code>lines === linesBy (=='\n')</code>; equivalent to <code>split . dropFinalBlank . dropDelims . whenElt</code>. For example: </p><pre> linesBy (=='x') "dogxxxcatxbirdxx" == ["dog","","","cat","bird",""] </pre></div></div><h1 id="g:8">Other splitting methods </h1><div class="top"><p class="src"><a name="v:splitEvery" class="def">splitEvery</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Int.html#t:Int">Int</a> -> [e] -> [[e]]<a href="src/Data-List-Split-Internals.html#splitEvery" class="link">Source</a></p><div class="doc"><p><code><code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code> n</code> splits a list into length-n pieces. The last piece will be shorter if <code>n</code> does not evenly divide the length of the list. If <code>n <= 0</code>, <code><code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code> n l</code> returns an infinite list of empty lists. </p><p>Note that <code><code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code> n []</code> is <code>[]</code>, not <code>[[]]</code>. This is intentional, and is consistent with a recursive definition of <code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code>; it satisfies the property that </p><pre>splitEvery n xs ++ splitEvery n ys == splitEvery n (xs ++ ys)</pre><p>whenever <code>n</code> evenly divides the length of <code>xs</code>. </p></div></div><div class="top"><p class="src"><a name="v:chunk" class="def">chunk</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-Int.html#t:Int">Int</a> -> [e] -> [[e]]<a href="src/Data-List-Split-Internals.html#chunk" class="link">Source</a></p><div class="doc"><p>A common synonym for <code><a href="Data-List-Split-Internals.html#v:splitEvery">splitEvery</a></code>. </p></div></div><div class="top"><p class="src"><a name="v:splitPlaces" class="def">splitPlaces</a> :: <a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Prelude.html#t:Integral">Integral</a> a => [a] -> [e] -> [[e]]<a href="src/Data-List-Split-Internals.html#splitPlaces" class="link">Source</a></p><div class="doc"><p>Split a list into chunks of the given lengths. For example: </p><pre> splitPlaces [2,3,4] [1..20] == [[1,2],[3,4,5],[6,7,8,9]] splitPlaces [4,9] [1..10] == [[1,2,3,4],[5,6,7,8,9,10]] </pre><p>The behavior of <code><code><a href="Data-List-Split-Internals.html#v:splitPlaces">splitPlaces</a></code> ls xs</code> when <code><code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:sum">sum</a></code> ls /= <code><a href="/usr/share/doc/ghc/html/libraries/base-4.3.1.0/Data-List.html#v:length">length</a></code> xs</code> can be inferred from the above examples and the fact that <code><a href="Data-List-Split-Internals.html#v:splitPlaces">splitPlaces</a></code> is total. </p></div></div><div class="top"><p class="src"><a name="v:chop" class="def">chop</a> :: ([a] -> (b, [a])) -> [a] -> [b]<a href="src/Data-List-Split-Internals.html#chop" class="link">Source</a></p><div class="doc"><p>A useful recursion pattern for processing a list to produce a new list, often used for "chopping" up the input list. Typically chop is called with some function that will consume an initial prefix of the list and produce a value and the rest of the list. </p><p>For example, many common Prelude functions can be implemented in terms of <code>chop</code>: </p><pre> group :: (Eq a) => [a] -> [[a]] group = chop (\ xs@(x:_) -> span (==x) xs) words :: String -> [String] words = filter (not . null) . chop (span (not . isSpace) . dropWhile isSpace) </pre></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.9.2</p></div></body></html>