@@ -1793,7 +1793,6 @@ data SplitOnSeqState rb rh ck w fs s b x =
17931793
17941794 | SplitOnSeqEmpty s
17951795
1796− | SplitOnSeqSingleInit s x
17971796 | SplitOnSeqSingle !fs s x
17981797
17991798 | SplitOnSeqWordInit s
@@ -1890,9 +1889,6 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
18901889 -- Single Pattern
18911890 -----------------
18921891
1893− stepOuter _ (SplitOnSeqSingleInit _ _) =
1894− error "This branch should not have hit"
1895−
18961892 stepOuter gst (SplitOnSeqSingle fs st pat) = do
18971893 res <- step (adaptState gst) st
18981894 case res of
@@ -2063,6 +2059,27 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
20632059 fs1 <- fstep fs old
20642060 skip $ SplitOnSeqKRDone (n - 1) fs1 rb rh1
20652061
2062+{-# ANN type SplitOnSuffixSeqState Fuse #-}
2063+data SplitOnSuffixSeqState rb rh ck w fs s b x =
2064+ SplitOnSuffixSeqInit
2065+ | SplitOnSuffixSeqYield b (SplitOnSuffixSeqState rb rh ck w fs s b x)
2066+ | SplitOnSuffixSeqDone
2067+
2068+ | SplitOnSuffixSeqEmpty s
2069+
2070+ | SplitOnSuffixSeqSingleInit s x
2071+ | SplitOnSuffixSeqSingle !fs s x
2072+
2073+ | SplitOnSuffixSeqWordInit s
2074+ | SplitOnSuffixSeqWordLoop !w s !fs
2075+ | SplitOnSuffixSeqWordDone Int !fs !w
2076+
2077+ | SplitOnSuffixSeqKRInit Int s rb !rh
2078+ | SplitOnSuffixSeqKRInit1 !fs s rb !rh
2079+ | SplitOnSuffixSeqKRLoop fs s rb !rh !ck
2080+ | SplitOnSuffixSeqKRCheck fs s rb !rh
2081+ | SplitOnSuffixSeqKRDone Int !fs rb !rh
2082+
20662083{-# INLINE_NORMAL splitSuffixOn #-}
20672084splitSuffixOn
20682085 :: forall m a b. (MonadIO m, Storable a, Enum a, Eq a)
@@ -2072,7 +2089,7 @@ splitSuffixOn
20722089 -> Stream m a
20732090 -> Stream m b
20742091splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
2075− Stream stepOuter SplitOnSeqInit
2092+ Stream stepOuter SplitOnSuffixSeqInit
20762093
20772094 where
20782095
@@ -2107,48 +2124,48 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
21072124 skip = return . Skip
21082125
21092126 {-# INLINE_LATE stepOuter #-}
2110− stepOuter _ SplitOnSeqInit =
2127+ stepOuter _ SplitOnSuffixSeqInit =
21112128 if patLen == 0
2112− then return $ Skip $ SplitOnSeqEmpty state
2129+ then return $ Skip $ SplitOnSuffixSeqEmpty state
21132130 else if patLen == 1
21142131 then do
21152132 let !pat = A.unsafeIndex patArr 0
2116− return $ Skip $ SplitOnSeqSingleInit state pat
2133+ return $ Skip $ SplitOnSuffixSeqSingleInit state pat
21172134 else if sizeOf (undefined :: a) * patLen
21182135 <= sizeOf (undefined :: Word)
2119− then return $ Skip $ SplitOnSeqWordInit state
2136+ then return $ Skip $ SplitOnSuffixSeqWordInit state
21202137 else do
21212138 (rb, rhead) <- liftIO $ RB.new patLen
2122− skip $ SplitOnSeqKRInit 0 state rb rhead
2139+ skip $ SplitOnSuffixSeqKRInit 0 state rb rhead
21232140
2124− stepOuter _ (SplitOnSeqYield x next) = return $ Yield x next
2141+ stepOuter _ (SplitOnSuffixSeqYield x next) = return $ Yield x next
21252142
21262143 ---------------------------
21272144 -- Empty pattern
21282145 ---------------------------
21292146
2130− stepOuter gst (SplitOnSeqEmpty st) = do
2147+ stepOuter gst (SplitOnSuffixSeqEmpty st) = do
21312148 res <- step (adaptState gst) st
21322149 case res of
21332150 Yield x s -> do
21342151 acc <- initial
21352152 acc1 <- fstep acc x
21362153 r <- done acc1
2137− skip $ SplitOnSeqYield r (SplitOnSeqEmpty s)
2138− Skip s -> return $ Skip (SplitOnSeqEmpty s)
2154+ skip $ SplitOnSuffixSeqYield r (SplitOnSuffixSeqEmpty s)
2155+ Skip s -> return $ Skip (SplitOnSuffixSeqEmpty s)
21392156 Stop -> return Stop
21402157
21412158 -----------------
21422159 -- Done
21432160 -----------------
21442161
2145− stepOuter _ SplitOnSeqDone = return Stop
2162+ stepOuter _ SplitOnSuffixSeqDone = return Stop
21462163
21472164 -----------------
21482165 -- Single Pattern
21492166 -----------------
21502167
2151− stepOuter gst (SplitOnSeqSingleInit st pat) = do
2168+ stepOuter gst (SplitOnSuffixSeqSingleInit st pat) = do
21522169 res <- step (adaptState gst) st
21532170 case res of
21542171 Yield x s -> do
@@ -2159,19 +2176,19 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
21592176 then do
21602177 fs1 <- fstep fs x
21612178 r <- done fs1
2162− let next = SplitOnSeqSingleInit s pat
2163− skip $ SplitOnSeqYield r next
2179+ let next = SplitOnSuffixSeqSingleInit s pat
2180+ skip $ SplitOnSuffixSeqYield r next
21642181 else do
21652182 r <- done fs
2166− let next = SplitOnSeqSingleInit s pat
2167− skip $ SplitOnSeqYield r next
2183+ let next = SplitOnSuffixSeqSingleInit s pat
2184+ skip $ SplitOnSuffixSeqYield r next
21682185 else do
21692186 fs1 <- fstep fs x
2170− skip $ SplitOnSeqSingle fs1 s pat
2171− Skip s -> return $ Skip $ (SplitOnSeqSingleInit s pat)
2187+ skip $ SplitOnSuffixSeqSingle fs1 s pat
2188+ Skip s -> return $ Skip $ (SplitOnSuffixSeqSingleInit s pat)
21722189 Stop -> return Stop
21732190
2174− stepOuter gst (SplitOnSeqSingle fs st pat) = do
2191+ stepOuter gst (SplitOnSuffixSeqSingle fs st pat) = do
21752192 res <- step (adaptState gst) st
21762193 case res of
21772194 Yield x s -> do
@@ -2181,33 +2198,33 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
21812198 then do
21822199 fs1 <- fstep fs x
21832200 r <- done fs1
2184− let next = SplitOnSeqSingleInit s pat
2185− skip $ SplitOnSeqYield r next
2201+ let next = SplitOnSuffixSeqSingleInit s pat
2202+ skip $ SplitOnSuffixSeqYield r next
21862203 else do
21872204 r <- done fs
2188− let next = SplitOnSeqSingleInit s pat
2189− skip $ SplitOnSeqYield r next
2205+ let next = SplitOnSuffixSeqSingleInit s pat
2206+ skip $ SplitOnSuffixSeqYield r next
21902207 else do
21912208 fs1 <- fstep fs x
2192− return $ Skip $ (SplitOnSeqSingle fs1 s pat)
2193− Skip s -> return $ Skip $ SplitOnSeqSingle fs s pat
2209+ return $ Skip $ (SplitOnSuffixSeqSingle fs1 s pat)
2210+ Skip s -> return $ Skip $ SplitOnSuffixSeqSingle fs s pat
21942211 Stop -> do
21952212 r <- done fs
2196− return $ Skip $ SplitOnSeqYield r SplitOnSeqDone
2213+ return $ Skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
21972214
21982215 ---------------------------
21992216 -- Short Pattern - Shift Or
22002217 ---------------------------
22012218
2202− stepOuter _ (SplitOnSeqWordDone 0 fs _) = do
2219+ stepOuter _ (SplitOnSuffixSeqWordDone 0 fs _) = do
22032220 r <- done fs
2204− skip $ SplitOnSeqYield r SplitOnSeqDone
2205− stepOuter _ (SplitOnSeqWordDone n fs wrd) = do
2221+ skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
2222+ stepOuter _ (SplitOnSuffixSeqWordDone n fs wrd) = do
22062223 let old = elemMask .&. (wrd `shiftR` (elemBits * (n - 1)))
22072224 fs1 <- fstep fs (toEnum $ fromIntegral old)
2208− skip $ SplitOnSeqWordDone (n - 1) fs1 wrd
2225+ skip $ SplitOnSuffixSeqWordDone (n - 1) fs1 wrd
22092226
2210− stepOuter gst (SplitOnSeqWordInit st0) = do
2227+ stepOuter gst (SplitOnSuffixSeqWordInit st0) = do
22112228 res <- step (adaptState gst) st0
22122229 case res of
22132230 Yield x s -> do
@@ -2218,7 +2235,7 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
22182235 fs1 <- fstep fs x
22192236 go SPEC 1 wrd s fs1
22202237 else go SPEC 1 wrd s fs
2221− Skip s -> return $ Skip (SplitOnSeqWordInit s)
2238+ Skip s -> return $ Skip (SplitOnSuffixSeqWordInit s)
22222239 Stop -> return Stop
22232240
22242241 where
@@ -2237,9 +2254,9 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
22372254 if wrd1 .&. wordMask == wordPat
22382255 then do
22392256 r <- done fs
2240− let next = SplitOnSeqWordInit s
2241− skip $ SplitOnSeqYield r next
2242− else skip $ SplitOnSeqWordLoop wrd1 s fs1
2257+ let next = SplitOnSuffixSeqWordInit s
2258+ skip $ SplitOnSuffixSeqYield r next
2259+ else skip $ SplitOnSuffixSeqWordLoop wrd1 s fs1
22432260 else go SPEC (idx + 1) wrd1 s fs1
22442261 else do
22452262 if idx == maxIndex
@@ -2247,14 +2264,14 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
22472264 if wrd1 .&. wordMask == wordPat
22482265 then do
22492266 r <- done fs
2250− let next = SplitOnSeqWordInit s
2251− skip $ SplitOnSeqYield r next
2252− else skip $ SplitOnSeqWordLoop wrd1 s fs
2267+ let next = SplitOnSuffixSeqWordInit s
2268+ skip $ SplitOnSuffixSeqYield r next
2269+ else skip $ SplitOnSuffixSeqWordLoop wrd1 s fs
22532270 else go SPEC (idx + 1) wrd1 s fs
22542271 Skip s -> go SPEC idx wrd s fs
2255− Stop -> skip $ SplitOnSeqWordDone idx fs wrd
2272+ Stop -> skip $ SplitOnSuffixSeqWordDone idx fs wrd
22562273
2257− stepOuter gst (SplitOnSeqWordLoop wrd0 st0 fs0) =
2274+ stepOuter gst (SplitOnSuffixSeqWordLoop wrd0 st0 fs0) =
22582275 go SPEC wrd0 st0 fs0
22592276
22602277 where
@@ -2273,16 +2290,16 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
22732290 if wrd1 .&. wordMask == wordPat
22742291 then do
22752292 r <- done fs1
2276− let next = SplitOnSeqWordInit s
2277− skip $ SplitOnSeqYield r next
2293+ let next = SplitOnSuffixSeqWordInit s
2294+ skip $ SplitOnSuffixSeqYield r next
22782295 else go SPEC wrd1 s fs1
22792296 else do
22802297 fs1 <- fstep fs (toEnum $ fromIntegral old)
22812298 if wrd1 .&. wordMask == wordPat
22822299 then do
22832300 r <- done fs1
2284− let next = SplitOnSeqWordInit s
2285− skip $ SplitOnSeqYield r next
2301+ let next = SplitOnSuffixSeqWordInit s
2302+ skip $ SplitOnSuffixSeqYield r next
22862303 else go SPEC wrd1 s fs1
22872304 Skip s -> go SPEC wrd s fs
22882305 Stop ->
@@ -2292,14 +2309,14 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
22922309 if withSep
22932310 then do
22942311 r <- done fs
2295− skip $ SplitOnSeqYield r SplitOnSeqDone
2296− else skip $ SplitOnSeqWordDone patLen fs wrd
2312+ skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
2313+ else skip $ SplitOnSuffixSeqWordDone patLen fs wrd
22972314
22982315 -------------------------------
22992316 -- General Pattern - Karp Rabin
23002317 -------------------------------
23012318
2302− stepOuter gst (SplitOnSeqKRInit idx0 st0 rb rh0) = do
2319+ stepOuter gst (SplitOnSuffixSeqKRInit idx0 st0 rb rh0) = do
23032320 res <- step (adaptState gst) st0
23042321 case res of
23052322 Yield x s -> do
@@ -2308,11 +2325,14 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23082325 if withSep
23092326 then do
23102327 fs1 <- fstep fs x
2311− go SPEC 1 rh1 s fs1
2312− else go SPEC 1 rh1 s fs
2313− Skip s -> skip $ SplitOnSeqKRInit idx0 s rb rh0
2328+ skip $ SplitOnSuffixSeqKRInit1 fs1 s rb rh1
2329+ else skip $ SplitOnSuffixSeqKRInit1 fs s rb rh1
2330+ Skip s -> skip $ SplitOnSuffixSeqKRInit idx0 s rb rh0
23142331 Stop -> return Stop
23152332
2333+ stepOuter gst (SplitOnSuffixSeqKRInit1 fs0 st0 rb rh0) = do
2334+ go SPEC (1 :: Int) rh0 st0 fs0
2335+
23162336 where
23172337
23182338 go !_ !idx !rh st !fs = do
@@ -2328,8 +2348,9 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23282348 let fold = RB.unsafeFoldRing (RB.ringBound rb)
23292349 let !ringHash = fold addCksum 0 rb
23302350 if ringHash == patHash
2331− then skip $ SplitOnSeqKRCheck fs1 s rb rh1
2332− else skip $ SplitOnSeqKRLoop fs1 s rb rh1 ringHash
2351+ then skip $ SplitOnSuffixSeqKRCheck fs1 s rb rh1
2352+ else skip $ SplitOnSuffixSeqKRLoop
2353+ fs1 s rb rh1 ringHash
23332354 else go SPEC (idx + 1) rh1 s fs1
23342355 else
23352356 if idx == maxIndex
@@ -2337,8 +2358,9 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23372358 let fold = RB.unsafeFoldRing (RB.ringBound rb)
23382359 let !ringHash = fold addCksum 0 rb
23392360 if ringHash == patHash
2340− then skip $ SplitOnSeqKRCheck fs s rb rh1
2341− else skip $ SplitOnSeqKRLoop fs s rb rh1 ringHash
2361+ then skip $ SplitOnSuffixSeqKRCheck fs s rb rh1
2362+ else skip $ SplitOnSuffixSeqKRLoop
2363+ fs s rb rh1 ringHash
23422364 else go SPEC (idx + 1) rh1 s fs
23432365 Skip s -> go SPEC idx rh s fs
23442366 Stop -> do
@@ -2349,14 +2371,15 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23492371 if withSep
23502372 then do
23512373 r <- done fs
2352− skip $ SplitOnSeqYield r SplitOnSeqDone
2353− else skip $ SplitOnSeqKRDone idx fs rb (RB.startOf rb)
2374+ skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
2375+ else skip $ SplitOnSuffixSeqKRDone
2376+ idx fs rb (RB.startOf rb)
23542377
23552378 -- XXX The recursive "go" is more efficient than the state based recursion
23562379 -- code commented out below. Perhaps its more efficient because of
23572380 -- factoring out "rb" outside the loop.
23582381 --
2359− stepOuter gst (SplitOnSeqKRLoop fs0 st0 rb rh0 cksum0) =
2382+ stepOuter gst (SplitOnSuffixSeqKRLoop fs0 st0 rb rh0 cksum0) =
23602383 go SPEC fs0 st0 rh0 cksum0
23612384
23622385 where
@@ -2372,12 +2395,12 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23722395 then do
23732396 fs1 <- fstep fs x
23742397 if (cksum1 == patHash)
2375− then skip $ SplitOnSeqKRCheck fs1 s rb rh1
2398+ then skip $ SplitOnSuffixSeqKRCheck fs1 s rb rh1
23762399 else go SPEC fs1 s rh1 cksum1
23772400 else do
23782401 fs1 <- fstep fs old
23792402 if (cksum1 == patHash)
2380− then skip $ SplitOnSeqKRCheck fs1 s rb rh1
2403+ then skip $ SplitOnSuffixSeqKRCheck fs1 s rb rh1
23812404 else go SPEC fs1 s rh1 cksum1
23822405 Skip s -> go SPEC fs s rh cksum
23832406 Stop ->
@@ -2387,25 +2410,25 @@ splitSuffixOn withSep patArr (Fold fstep initial done) (Stream step state) =
23872410 if withSep
23882411 then do
23892412 r <- done fs
2390− skip $ SplitOnSeqYield r SplitOnSeqDone
2391− else skip $ SplitOnSeqKRDone patLen fs rb rh
2413+ skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
2414+ else skip $ SplitOnSuffixSeqKRDone patLen fs rb rh
23922415
2393− stepOuter _ (SplitOnSeqKRCheck fs st rb rh) = do
2416+ stepOuter _ (SplitOnSuffixSeqKRCheck fs st rb rh) = do
23942417 if RB.unsafeEqArray rb rh patArr
23952418 then do
23962419 r <- done fs
2397− let next = SplitOnSeqKRInit 0 st rb (RB.startOf rb)
2398− skip $ SplitOnSeqYield r next
2399− else skip $ SplitOnSeqKRLoop fs st rb rh patHash
2420+ let next = SplitOnSuffixSeqKRInit 0 st rb (RB.startOf rb)
2421+ skip $ SplitOnSuffixSeqYield r next
2422+ else skip $ SplitOnSuffixSeqKRLoop fs st rb rh patHash
24002423
2401− stepOuter _ (SplitOnSeqKRDone 0 fs _ _) = do
2424+ stepOuter _ (SplitOnSuffixSeqKRDone 0 fs _ _) = do
24022425 r <- done fs
2403− skip $ SplitOnSeqYield r SplitOnSeqDone
2404− stepOuter _ (SplitOnSeqKRDone n fs rb rh) = do
2426+ skip $ SplitOnSuffixSeqYield r SplitOnSuffixSeqDone
2427+ stepOuter _ (SplitOnSuffixSeqKRDone n fs rb rh) = do
24052428 old <- liftIO $ peek rh
24062429 let rh1 = RB.advance rb rh
24072430 fs1 <- fstep fs old
2408− skip $ SplitOnSeqKRDone (n - 1) fs1 rb rh1
2431+ skip $ SplitOnSuffixSeqKRDone (n - 1) fs1 rb rh1
24092432
24102433data SplitState s arr
24112434 = SplitInitial s