-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Combinator library for splitting vectors. -- -- This package aims to be a vector-based drop-in replacement for the -- list-based split package. For more information see the haddocs or -- checkout the source on github. @package vector-split @version 1.0.0.2 module Data.Vector.Split.Internal split :: Vector v a => Splitter v a -> v a -> [v a] type Splitter v a = v a -> SplitList v a -- | Split on the given sublist. Equivalent to split . dropDelims . -- onSublist. For example: -- --
--   >>> splitOn (BV.fromList "..") (BV.fromList "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, -- --
--   > \xs -> (intercalate xs . splitOn xs) === id
--   
-- -- splitOn 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.) splitOn :: (Vector v a, Eq a) => v a -> v a -> [v a] -- | Split on any of the given elements. Equivalent to split . dropDelims . -- oneOf. For example: -- --
--   >>> splitOneOf (BV.fromList ";.,") (BV.fromList "foo,bar;baz.glurk")
--   ["foo","bar","baz","glurk"]
--   
splitOneOf :: (Vector v a, Eq a) => v a -> v a -> [v a] -- | Split on elements satisfying the given predicate. Equivalent to split -- . dropDelims . whenElt. For example: -- --
--   >>> splitWhen (<0) (BV.fromList [1,3,-4,5,7,-9,0,2])
--   [[1,3],[5,7],[0,2]]
--   
splitWhen :: (Vector v a) => (a -> Bool) -> v a -> [v a] -- | Split into chunks terminated by the given subsequence. Equivalent to -- split . dropFinalBlank . dropDelims . onSublist. For example: -- --
--   >>> endBy (BV.fromList ";") (BV.fromList "foo;bar;baz;")
--   ["foo","bar","baz"]
--   
-- -- Note also that the lines function from Data.List is equivalent to -- endBy "n". endBy :: (Vector v a, Eq a) => v a -> v a -> [v a] -- | A splitting strategy that splits on any one of the given elements. For -- example: >>> split (oneOf (BV.fromList "xyz")) (BV.fromList -- "aazbxyzcxd") ["aa","z","b","x","","y","","z","c","x","d"] oneOf :: (Vector v a, Eq a) => v a -> Splitter v a -- | Split into chunks terminated by one of the given elements. Equivalent -- to split . dropFinalBlank . dropDelims . oneOf. For example: -- --
--   >>> endByOneOf (BV.fromList ";,") (BV.fromList "foo;bar,baz;")
--   ["foo","bar","baz"]
--   
endByOneOf :: (Vector v a, Eq a) => v a -> v a -> [v a] -- | Split into "words", with word boundaries indicated by the given -- predicate. Satisfies words === wordsBy isSpace; equivalent to split . -- dropBlanks . dropDelims . whenElt. For example: -- --
--   >>> wordsBy (=='x') (BV.fromList "dogxxxcatxbirdxx")
--   ["dog","cat","bird"]
--   
wordsBy :: Vector v a => (a -> Bool) -> v a -> [v a] -- | Split into "lines", with line boundaries indicated by the given -- predicate. Satisfies lines === linesBy (=='\n'); equivalent to split . -- dropFinalBlank . dropDelims . whenElt. For example: -- --
--   >>> linesBy (=='x') (BV.fromList "dogxxxcatxbirdxx")
--   ["dog","","","cat","bird",""]
--   
linesBy :: Vector v a => (a -> Bool) -> v a -> [v a] -- | A splitting strategy that splits on the given list, when it is -- encountered as an exact subsequence. For example: -- --
--   >>> split (onSublist (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aazb","xyz","cxd"]
--   
-- -- Note that splitting on the empty list is not allowed in -- `vector-split`. This is a major difference between split and -- `vector-split`. In any case nobody should use `vector-split` to do -- this anyway. onSublist :: (Vector v a, Eq a) => v a -> Splitter v a -- | A splitting strategy that splits on any elements that satisfy the -- given predicate. For example: -- --
--   >>> split (whenElt (<0)) (BV.fromList [2,4,-3,6,-9,1])
--   [[2,4],[-3],[6],[-9],[1]]
--   
whenElt :: (Vector v a) => (a -> Bool) -> Splitter v a -- | Drop delimiters from the output (the default is to keep them). For -- example, -- --
--   >>> split (oneOf (BV.fromList ":")) (BV.fromList "a:b:c")
--   ["a",":","b",":","c"]
--   
--   >>> split (dropDelims . oneOf (BV.fromList ":")) (BV.fromList "a:b:c")
--   ["a","b","c"]
--   
dropDelims :: Vector v a => SplitList v a -> SplitList v a -- | Keep delimiters in the output by prepending them to adjacent chunks. -- For example: -- --
--   >>> split (keepDelimsL . oneOf (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aa","zb","x","y","zc","xd"]
--   
keepDelimsL :: Vector v a => SplitList v a -> SplitList v a -- | Keep delimiters in the output by appending them to adjacent chunks. -- For example: -- --
--   >>> split (keepDelimsR . oneOf (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aaz","bx","y","z","cx","d"]
--   
keepDelimsR :: Vector v a => SplitList v a -> SplitList v a -- | Condense multiple consecutive delimiters into one. For example: -- --
--   >>> split (condense . oneOf (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aa","z","b","xyz","c","x","d"]
--   
--   >>> split (dropDelims . oneOf (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aa","b","","","c","d"]
--   
--   >>> split (condense . dropDelims . oneOf (BV.fromList "xyz")) (BV.fromList "aazbxyzcxd")
--   ["aa","b","c","d"]
--   
-- -- FIXME this function is not fully compatible with the Data.List.Split -- version. condense :: Vector v a => SplitList v a -> SplitList v a -- | Don't generate a blank chunk if there is a delimiter at the beginning. -- For example: -- --
--   >>> split (oneOf (BV.fromList ":")) (BV.fromList ":a:b")
--   ["",":","a",":","b"]
--   
--   >>> split (dropInitBlank . oneOf (BV.fromList ":")) (BV.fromList ":a:b")
--   [":","a",":","b"]
--   
dropInitBlank :: Vector v a => SplitList v a -> SplitList v a -- | Don't generate blank chunks between consecutive delimiters. For -- example: -- --
--   >>> split (oneOf (BV.fromList ":")) (BV.fromList "::b:::a")
--   ["",":","",":","b",":","",":","",":","a"]
--   
--   >>> split (dropInnerBlanks . oneOf (BV.fromList ":")) (BV.fromList "::b:::a")
--   ["",":",":","b",":",":",":","a"]
--   
dropInnerBlanks :: Vector v a => SplitList v a -> SplitList v a -- | Don't generate a blank chunk if there is a delimiter at the end. For -- example: -- -- split (oneOf (BV.fromList ":")) (BV.fromList "a:b:") -- ["a",":","b",":",""] split (dropFinalBlank . oneOf (BV.fromList ":")) -- (BV.fromList "a:b:") ["a",":","b",":"] dropFinalBlank :: Vector v a => SplitList v a -> SplitList v a -- | Drop all blank chunks from the output, and condense consecutive -- delimiters into one. Equivalent to dropInitBlank . dropFinalBlank . -- condense. For example: -- --
--   >>> split (oneOf (BV.fromList ":")) (BV.fromList "::b:::a")
--   ["",":","",":","b",":","",":","",":","a"]
--   
--   >>> split (dropBlanks . oneOf (BV.fromList ":")) (BV.fromList "::b:::a")
--   ["::","b",":::","a"]
--   
dropBlanks :: Vector v a => SplitList v a -> SplitList v a -- | Make a strategy that splits a list into chunks that all start with the -- given subsequence (except possibly the first). Equivalent to -- dropInitBlank . keepDelimsL . onSublist. For example: -- --
--   >>> split (startsWith (BV.fromList "app")) (BV.fromList "applyapplicativeapplaudapproachapple")
--   ["apply","applicative","applaud","approach","apple"]
--   
startsWith :: (Vector v a, Eq a) => v a -> Splitter v a -- | Make a strategy that splits a list into chunks that all start with one -- of the given elements (except possibly the first). Equivalent to -- dropInitBlank . keepDelimsL . oneOf. For example: -- --
--   >>> split (startsWithOneOf (BV.fromList ['A'..'Z'])) (BV.fromList "ACamelCaseIdentifier")
--   ["A","Camel","Case","Identifier"]
--   
startsWithOneOf :: (Vector v a, Eq a) => v a -> Splitter v a -- | Make a strategy that splits a list into chunks that all end with the -- given subsequence, except possibly the last. Equivalent to -- dropFinalBlank . keepDelimsR . onSublist. For example: -- --
--   >>> split (endsWith (BV.fromList "ly")) (BV.fromList "happilyslowlygnarlylily")
--   ["happily","slowly","gnarly","lily"]
--   
endsWith :: (Vector v a, Eq a) => v a -> Splitter v a -- | Make a strategy that splits a list into chunks that all end with one -- of the given elements, except possibly the last. Equivalent to -- dropFinalBlank . keepDelimsR . oneOf. For example: -- --
--   >>> split (condense . endsWithOneOf (BV.fromList ".,?! ")) (BV.fromList "Hi, there!  How are you?")
--   ["Hi, ","there!  ","How ","are ","you?"]
--   
endsWithOneOf :: (Vector v a, Eq a) => v a -> Splitter v a instance GHC.Classes.Eq (v a) => GHC.Classes.Eq (Data.Vector.Split.Internal.Chunk v a) instance GHC.Show.Show (v a) => GHC.Show.Show (Data.Vector.Split.Internal.Chunk v a) module Data.Vector.Split -- | chunksOf n splits a vector into length-n pieces. The -- last piece will be shorter if n does not evenly divide the -- length of the vector. If n <= 0, chunksOf n -- l returns an infinite list of empty vectors. For example: -- -- Note that chunksOf n [] is [], not -- [[]]. This is intentional, and is consistent with a recursive -- definition of chunksOf; it satisfies the property that -- --
--   chunksOf n xs ++ chunksOf n ys == chunksOf n (xs ++ ys)
--   
-- -- whenever n evenly divides the length of xs. chunksOf :: Vector v a => Int -> v a -> [v a] -- | Split a vector into chunks of the given lengths. For example: -- --
--   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 vector is longer than the total of the given lengths, -- then the remaining elements are dropped. If the vector 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. splitPlaces :: Vector v a => [Int] -> v a -> [v a] -- | Split a vector into chunks of the given lengths. Unlike -- splitPlaces, the output list will always be the same length as -- the first input argument. If the input vector is longer than the total -- of the given lengths, then the remaining elements are dropped. If the -- vector is shorter than the total of the given lengths, then the last -- several chunks will be shorter than requested or empty. For example: -- --
--   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. splitPlacesBlanks :: Vector v a => [Int] -> v a -> [v a] -- | 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. -- -- For example, many common Prelude functions can be implemented in terms -- of chop: -- --
--   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)
--   
chop :: Vector v a => (v a -> (b, v a)) -> v a -> [b] -- | Divides up an input vector into a set of subvectors, according to -- n and m input specifications you provide. Each -- subvector will have n items, and the start of each subvector -- will be offset by m items from the previous one. -- --
--   divvy 5 5 [1..20] == [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]
--   
-- -- In the case where a source vector's trailing elements do no fill an -- entire subvector, those trailing elements will be dropped. -- --
--   divvy 5 2 [1..10] == [[1,2,3,4,5],[3,4,5,6,7],[5,6,7,8,9]]
--   
-- -- As an example, you can generate a moving average over a vector of -- prices: -- --
--   type Prices = [Float]
--   type AveragePrices = [Float]
--   
--   average :: [Float] -> Float
--   average xs = sum xs / (fromIntegral $ length xs)
--   
--   simpleMovingAverage :: Prices -> AveragePrices
--   simpleMovingAverage priceList =
--     map average divvyedPrices
--       where divvyedPrices = divvy 20 1 priceList
--   
divvy :: Vector v a => Int -> Int -> v a -> [v a]