>>> splitOn ":" "12:35:07" ["12","35","07"]
>>> splitOn "x" "axbxc" ["a","b","c"]
>>> splitOn "x" "axbxcx" ["a","b","c",""]
>>> 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 intercalate function from Data.List, that is,
intercalate x . splitOn x === idsplitOn x . intercalate x 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 x does not occur in any elements of the input list. Working out why is left as an exercise for the reader.)
>>> splitOneOf ";.," "foo,bar;baz.glurk" ["foo","bar","baz","glurk"]
>>> 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]]
>>> splitPlaces [4,9,3] [1..10] [[1,2,3,4],[5,6,7,8,9,10]]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 result may contain fewer chunks than requested, and the last chunk may be shorter than requested.
>>> 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]]
>>> 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 splitPlaces.
>>> splitWhen (<0) [1,3,-4,5,7,-9,0,2] [[1,3],[5,7],[0,2]]
>>> splitWhen (<0) [1,-2,3,4,-5,-6,7,8,-9] [[1],[3,4],[],[7,8],[]]
concatMap fromElem (splitInternal d l) == l.
>>> split (mapSplitter snd $ oneOf "-_") $ zip [0..] "a-bc_d" [[(0,'a')],[(1,'-')],[(2,'b'),(3,'c')],[(4,'_')],[(5,'d')]]
>>> import Data.Char (toLower) >>> split (mapSplitter toLower $ dropDelims $ whenElt (== 'x')) "abXcxd" ["ab","c","d"]