@@ -113,47 +113,77 @@ seqSplitterProperties ::
113 -> String
113 -> String
115seqSplitterProperties sep desc = do
115seqSplitterProperties sep desc = do
116− describe (desc <> " splitOnSeq/intercalate")
116+ describe (desc <> " splitOnSeq")
118 -- Empty seperator
118 -- Empty seperator
119 intercalateSplitEqId 0
119 intercalateSplitEqId 0
120+ intercalateSplitEqIdS 0
120 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 0
121 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 0
122+ concatSplitIntercalateEqConcatS splitOnSeq_ IS.intercalate 0
122 -- Single element seperator
124 -- Single element seperator
123 intercalateSplitEqId 1
125 intercalateSplitEqId 1
126+ intercalateSplitEqIdS 1
124 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 1
127 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 1
128+ concatSplitIntercalateEqConcatS splitOnSeq_ IS.intercalate 1
126 -- Shift Or
130 -- Shift Or
127 intercalateSplitEqId 2
131 intercalateSplitEqId 2
132+ intercalateSplitEqIdS 2
128 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 2
133 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 2
134+ concatSplitIntercalateEqConcatS splitOnSeq_ IS.intercalate 2
130 -- Karp-Rabin
136 -- Karp-Rabin
131 intercalateSplitEqId 4
137 intercalateSplitEqId 4
138+ intercalateSplitEqIdS 4
132 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 4
139 concatSplitIntercalateEqConcat splitOnSeq_ intercalate 4
140+ concatSplitIntercalateEqConcatS splitOnSeq_ IS.intercalate 4
134 -- Exclusive case
142 -- Exclusive case
135 splitIntercalateEqId splitOnSeq_ intercalate
143 splitIntercalateEqId splitOnSeq_ intercalate
144+ splitIntercalateEqIdS splitOnSeq_ IS.intercalate
137− describe (desc <> " splitOnSuffixSeq/intercalate")
146+ describe (desc <> " splitOnSuffixSeq")
139 -- Empty seperator
148 -- Empty seperator
140 intercalateSplitEqIdNoSepEnd 0
149 intercalateSplitEqIdNoSepEnd 0
150+ intercalateSplitEqIdNoSepEndS 0
141 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 0
151 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 0
152+ concatSplitIntercalateEqConcatS
154+ IS.intercalateSuffix
143 -- Single element seperator
157 -- Single element seperator
144 intercalateSplitEqIdNoSepEnd 1
158 intercalateSplitEqIdNoSepEnd 1
159+ intercalateSplitEqIdNoSepEndS 1
145 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 1
160 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 1
161+ concatSplitIntercalateEqConcatS
163+ IS.intercalateSuffix
147 -- Shift Or
166 -- Shift Or
148 intercalateSplitEqIdNoSepEnd 2
167 intercalateSplitEqIdNoSepEnd 2
168+ intercalateSplitEqIdNoSepEndS 2
149 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 2
169 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 2
170+ concatSplitIntercalateEqConcatS
172+ IS.intercalateSuffix
151 -- Karp-Rabin
175 -- Karp-Rabin
152 intercalateSplitEqIdNoSepEnd 4
176 intercalateSplitEqIdNoSepEnd 4
177+ intercalateSplitEqIdNoSepEndS 4
153 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 4
178 concatSplitIntercalateEqConcat splitOnSuffixSeq_ intercalateSuffix 4
179+ concatSplitIntercalateEqConcatS
181+ IS.intercalateSuffix
155 -- Exclusive case
184 -- Exclusive case
156 splitIntercalateEqId splitOnSuffixSeq_ intercalateSuffix
185 splitIntercalateEqId splitOnSuffixSeq_ intercalateSuffix
186+ splitIntercalateEqIdS splitOnSuffixSeq_ IS.intercalateSuffix
@@ -196,6 +226,25 @@ seqSplitterProperties sep desc = do
196 (intercalate (replicate i sep) ys)
226 (intercalate (replicate i sep) ys)
229+ intercalateSplitEqIdS i =
231+ "S.intercalate . splitOnSeq == id ("
232+ <> show i <> " element separator)"
234+ $ forAll listWithSep
236+ withMaxSuccess maxTestCount
239+ ys <- splitOnSeq_ xs (replicate i sep)
246+ listEquals (==) zs xs
199 intercalateSplitEqIdNoSepEnd i =
248 intercalateSplitEqIdNoSepEnd i =
200 let name =
249 let name =
201 "intercalate . splitOnSuffixSeq_ . (++ [x \\= sep]) == id ("
250 "intercalate . splitOnSuffixSeq_ . (++ [x \\= sep]) == id ("
@@ -213,6 +262,26 @@ seqSplitterProperties sep desc = do
213 (intercalate (replicate i sep) ys)
262 (intercalate (replicate i sep) ys)
265+ intercalateSplitEqIdNoSepEndS i =
267+ "S.intercalate . splitOnSuffixSeq_ . (++ [x \\= sep]) == id ("
268+ <> show i <> " element separator)"
270+ $ forAll ((,) <$> listWithSep <*> nonSepElem)
271+ $ \(xs_, nonSep) -> do
272+ let xs = xs_ ++ [nonSep]
273+ withMaxSuccess maxTestCount
276+ ys <- splitOnSuffixSeq_ xs (replicate i sep)
283+ listEquals (==) zs xs
216 concatSplitIntercalateEqConcat splitter intercalater i =
285 concatSplitIntercalateEqConcat splitter intercalater i =
217 let name =
286 let name =
218 "concat . splitter . intercalater == "
287 "concat . splitter . intercalater == "
@@ -228,6 +297,26 @@ seqSplitterProperties sep desc = do
228 ys <- splitter xs (replicate i sep)
297 ys <- splitter xs (replicate i sep)
229 listEquals (==) (concat ys) (concat xss)
298 listEquals (==) (concat ys) (concat xss)
300+ concatSplitIntercalateEqConcatS splitter intercalater i =
302+ "concat . splitter . S.intercalater == "
304+ <> show i <> " element separator/possibly empty list)"
306+ $ forAll listsWithoutSep
308+ withMaxSuccess maxTestCount
317+ ys <- splitter xs (replicate i sep)
318+ listEquals (==) (concat ys) (concat xss)
231 splitIntercalateEqId splitter intercalater =
320 splitIntercalateEqId splitter intercalater =
232 let name =
321 let name =
233 "splitter . intercalater == id"
322 "splitter . intercalater == id"
@@ -242,6 +331,24 @@ seqSplitterProperties sep desc = do
242 ys <- splitter xs [sep]
331 ys <- splitter xs [sep]
243 listEquals (==) ys xss
332 listEquals (==) ys xss
334+ splitIntercalateEqIdS splitter intercalater =
336+ "splitter . intercalater == id"
337+ <> " (exclusive separator/non-empty list)"
339+ $ forAll listsWithoutSep1
341+ withMaxSuccess maxTestCount
346+ $ intercalater [sep] UF.fromList
348+ ys <- splitter xs [sep]
349+ listEquals (==) ys xss
245groupSplitOps :: String -> Spec
352groupSplitOps :: String -> Spec
246groupSplitOps desc = do
353groupSplitOps desc = do
247 -- splitting
354 -- splitting