split 0.2.1.3 → 0.2.2
raw patch · 5 files changed
+50/−23 lines, 5 filesdep ~base
Dependency ranges changed: base
Files
- CHANGES +9/−0
- split.cabal +1/−1
- src/Data/List/Split.hs +1/−0
- src/Data/List/Split/Internals.hs +32/−16
- test/Properties.hs +7/−6
CHANGES view
@@ -1,3 +1,12 @@+* 0.2.2 (14 April 2013)++ - Add 'dropInnerBlanks' combinator for dropping blank chunks between+ consecutive delimiters while still keeping the delimiters separate.++* 0.2.1.3 (28 March 2013)++ - bump upper bound to allow base-4.7+ * 0.2.1.2 (28 January 2013) - Patch from Daniel Wagner to make splitting lazier when using
split.cabal view
@@ -1,5 +1,5 @@ Name: split-Version: 0.2.1.3+Version: 0.2.2 Stability: stable Description: A collection of various methods for splitting
src/Data/List/Split.hs view
@@ -68,6 +68,7 @@ , condense , dropInitBlank , dropFinalBlank+ , dropInnerBlanks -- ** Derived combinators -- $derived
src/Data/List/Split/Internals.hs view
@@ -89,6 +89,10 @@ -- | What to do with multiple consecutive delimiters? data CondensePolicy = Condense -- ^ Condense into a single delimiter.+ | DropBlankFields -- ^ Keep consecutive+ -- delimiters separate, but+ -- don't insert blank chunks in+ -- between them. | KeepBlankFields -- ^ Insert blank chunks -- between consecutive -- delimiters.@@ -160,7 +164,7 @@ . dropInitial (initBlankPolicy s) . doMerge (delimPolicy s) . doDrop (delimPolicy s)- . insertBlanks+ . insertBlanks (condensePolicy s) . doCondense (condensePolicy s) -- | Drop delimiters if the 'DelimPolicy' is 'Drop'.@@ -171,27 +175,30 @@ -- | Condense multiple consecutive delimiters into one if the -- 'CondensePolicy' is 'Condense'. doCondense :: CondensePolicy -> SplitList a -> SplitList a-doCondense KeepBlankFields ls = ls doCondense Condense ls = condense' ls where condense' [] = [] condense' (c@(Text _) : l) = c : condense' l condense' l = (Delim $ concatMap fromElem ds) : condense' rest where (ds,rest) = span isDelim l+doCondense _ ls = ls --- | Insert blank chunks between any remaining consecutive delimiters,--- and at the beginning or end if the first or last element is a--- delimiter.-insertBlanks :: SplitList a -> SplitList a-insertBlanks [] = [Text []]-insertBlanks (d@(Delim _) : l) = Text [] : insertBlanks' (d:l)-insertBlanks l = insertBlanks' l+-- | Insert blank chunks between any remaining consecutive delimiters+-- (unless the condense policy is 'DropBlankFields'), and at the+-- beginning or end if the first or last element is a delimiter.+insertBlanks :: CondensePolicy -> SplitList a -> SplitList a+insertBlanks _ [] = [Text []]+insertBlanks cp (d@(Delim _) : l) = Text [] : insertBlanks' cp (d:l)+insertBlanks cp l = insertBlanks' cp l -- | Insert blank chunks between consecutive delimiters.-insertBlanks' :: SplitList a -> SplitList a-insertBlanks' [] = []-insertBlanks' (d1@(Delim _) : d2@(Delim _) : l) = d1 : Text [] : insertBlanks' (d2:l)-insertBlanks' [d@(Delim _)] = [d, Text []]-insertBlanks' (c : l) = c : insertBlanks' l+insertBlanks' :: CondensePolicy -> SplitList a -> SplitList a+insertBlanks' _ [] = []+insertBlanks' cp@DropBlankFields (d1@(Delim _) : d2@(Delim _) : l)+ = d1 : insertBlanks' cp (d2:l)+insertBlanks' cp (d1@(Delim _) : d2@(Delim _) : l)+ = d1 : Text [] : insertBlanks' cp (d2:l)+insertBlanks' _ [d@(Delim _)] = [d, Text []]+insertBlanks' cp (c : l) = c : insertBlanks' cp l -- | Merge delimiters into adjacent chunks according to the 'DelimPolicy'. doMerge :: DelimPolicy -> SplitList a -> SplitList a@@ -325,10 +332,19 @@ dropFinalBlank :: Splitter a -> Splitter a dropFinalBlank s = s { finalBlankPolicy = DropBlank } +-- | Don't generate blank chunks between consecutive delimiters.+-- For example:+--+-- > split (oneOf ":") "::b:::a" == ["",":","",":","b",":","",":","",":","a"]+-- > split (dropInnerBlanks $ oneOf ":") "::b:::a" == ["", ":",":","b",":",":",":","a"]+dropInnerBlanks :: Splitter a -> Splitter a+dropInnerBlanks s = s { condensePolicy = DropBlankFields }+ -- ** Derived combinators --- | Drop all blank chunks from the output. Equivalent to--- @'dropInitBlank' . 'dropFinalBlank' . 'condense'@. For example:+-- | Drop all blank chunks from the output, and condense consecutive+-- delimiters into one. Equivalent to @'dropInitBlank'+-- . 'dropFinalBlank' . 'condense'@. For example: -- -- > split (oneOf ":") "::b:::a" == ["",":","",":","b",":","",":","",":","a"] -- > split (dropBlanks $ oneOf ":") "::b:::a" == ["::","b",":::","a"]
test/Properties.hs view
@@ -12,8 +12,9 @@ import Data.Char import Data.Functor-import Data.List (genericTake, group, intercalate, isInfixOf, isPrefixOf,- isSuffixOf, tails)+import Data.List (genericTake, group, intercalate,+ isInfixOf, isPrefixOf, isSuffixOf,+ tails) import Data.Maybe (isJust) newtype Elt = Elt { unElt :: Char }@@ -159,19 +160,19 @@ prop_doCondense_no_consec_delims l = noConsecDelims $ doCondense Condense l prop_insBlanks_no_consec_delims :: SplitList Elt -> Bool-prop_insBlanks_no_consec_delims l = noConsecDelims $ insertBlanks l+prop_insBlanks_no_consec_delims l = noConsecDelims $ insertBlanks Condense l prop_insBlanks_fl_not_delim :: SplitList Elt -> Bool prop_insBlanks_fl_not_delim l =- case insertBlanks l of+ case insertBlanks Condense l of [] -> True xs -> (not . isDelim $ head xs) && (not . isDelim $ last xs) prop_mergeL_no_delims :: SplitList Elt -> Bool-prop_mergeL_no_delims = all (not . isDelim) . mergeLeft . insertBlanks+prop_mergeL_no_delims = all (not . isDelim) . mergeLeft . insertBlanks Condense prop_mergeR_no_delims :: SplitList Elt -> Bool-prop_mergeR_no_delims = all (not . isDelim) . mergeRight . insertBlanks+prop_mergeR_no_delims = all (not . isDelim) . mergeRight . insertBlanks Condense getDelims :: Splitter Elt -> [Elt] -> [[Elt]] getDelims s l = [ d | Delim d <- splitInternal (delimiter s) l ]