packages feed

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 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 ]