Split the list before each occurence of a leading character. Keep
these characters. There is always a list for the part before the first
leading character. It may be empty. See package
non-empty for
more precise result type.
>>> segmentBefore isUpper "AbcdXyz"
["","Abcd","Xyz"]
>>> segmentBefore isUpper "kAbcdXYZ"
["k","Abcd","X","Y","Z"]
forAllPredicates $ \p xs -> concat (segmentBefore p xs) == xs
forAllPredicates $ \p xs -> length (filter p xs) == length (tail (segmentBefore p xs))
forAllPredicates $ \p -> all (p . head) . tail . segmentBefore p
forAllPredicates $ \p -> all (all (not . p) . tail) . tail . segmentBefore p
forAllPredicates $ \p x -> flip seq True . (!!100) . concat . segmentBefore p . cycle . (x:)