@@ -1795,8 +1795,8 @@ data SplitOnSeqState rb rh ck w fs s b x =
17951795 | SplitOnSeqEmpty s
17961796 | SplitOnSeqSingle !fs s x
17971797
1798− | SplitOnSeqWordInit Int s !w
1799− | SplitOnSeqWordLoop !fs s !w
1798+ | SplitOnSeqWordInit s
1799+ | SplitOnSeqWordLoop !w s !fs
18001800 | SplitOnSeqWordDone Int !fs !w
18011801
18021802 | SplitOnSeqKRInit Int s rb !rh
@@ -1856,7 +1856,7 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
18561856 return $ Skip $ SplitOnSeqSingle acc state pat
18571857 else if sizeOf (undefined :: a) * patLen
18581858 <= sizeOf (undefined :: Word)
1859− then return $ Skip $ SplitOnSeqWordInit 0 state (0 :: Word)
1859+ then return $ Skip $ SplitOnSeqWordInit state
18601860 else do
18611861 (rb, rhead) <- liftIO $ RB.new patLen
18621862 skip $ SplitOnSeqKRInit 0 state rb rhead
@@ -1917,45 +1917,58 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
19171917 fs1 <- fstep fs (toEnum $ fromIntegral old)
19181918 skip $ SplitOnSeqWordDone (n - 1) fs1 wrd
19191919
1920− stepOuter gst (SplitOnSeqWordInit idx st wrd) = do
1921− res <- step (adaptState gst) st
1922− case res of
1923− Yield x s -> do
1924− let wrd1 = addToWord wrd x
1925− if idx /= maxIndex
1926− then skip $ SplitOnSeqWordInit (idx + 1) s wrd1
1927− else do
1920+ stepOuter gst (SplitOnSeqWordInit st0) =
1921+ go SPEC 0 0 st0
1922+
1923+ where
1924+
1925+ {-# INLINE go #-}
1926+ go !_ !idx !wrd !st = do
1927+ res <- step (adaptState gst) st
1928+ case res of
1929+ Yield x s -> do
1930+ let wrd1 = addToWord wrd x
1931+ if idx == maxIndex
1932+ then do
1933+ fs <- initial
1934+ if wrd1 .&. wordMask == wordPat
1935+ then do
1936+ r <- done fs
1937+ let next = SplitOnSeqWordInit s
1938+ skip $ SplitOnSeqYield r next
1939+ else skip $ SplitOnSeqWordLoop wrd1 s fs
1940+ else go SPEC (idx + 1) wrd1 s
1941+ Skip s -> go SPEC idx wrd s
1942+ Stop -> do
19281943 fs <- initial
1944+ if idx /= 0
1945+ then skip $ SplitOnSeqWordDone idx fs wrd
1946+ else do
1947+ r <- done fs
1948+ skip $ SplitOnSeqYield r SplitOnSeqDone
1949+
1950+ stepOuter gst (SplitOnSeqWordLoop wrd0 st0 fs0) =
1951+ go SPEC wrd0 st0 fs0
1952+
1953+ where
1954+
1955+ {-# INLINE go #-}
1956+ go !_ !wrd !st !fs = do
1957+ res <- step (adaptState gst) st
1958+ case res of
1959+ Yield x s -> do
1960+ let wrd1 = addToWord wrd x
1961+ old = (wordMask .&. wrd)
1962+ `shiftR` (elemBits * (patLen - 1))
1963+ fs1 <- fstep fs (toEnum $ fromIntegral old)
19291964 if wrd1 .&. wordMask == wordPat
19301965 then do
1931− r <- done fs
1932− let next = SplitOnSeqWordInit 0 s (0 :: Word)
1966+ r <- done fs1
1967+ let next = SplitOnSeqWordInit s
19331968 skip $ SplitOnSeqYield r next
1934− else skip $ SplitOnSeqWordLoop fs s wrd1
1935− Skip s -> skip $ SplitOnSeqWordInit idx s wrd
1936− Stop -> do
1937− fs <- initial
1938− if idx /= 0
1939− then skip $ SplitOnSeqWordDone idx fs wrd
1940− else do
1941− r <- done fs
1942− skip $ SplitOnSeqYield r SplitOnSeqDone
1943−
1944− stepOuter gst (SplitOnSeqWordLoop fs st wrd) = do
1945− res <- step (adaptState gst) st
1946− case res of
1947− Yield x s -> do
1948− let wrd1 = wordMask .&. addToWord wrd x
1949− old = wrd `shiftR` (elemBits * (patLen - 1))
1950− fs1 <- fstep fs (toEnum $ fromIntegral old)
1951− if wrd1 .&. wordMask == wordPat
1952− then do
1953− r <- done fs1
1954− let next = SplitOnSeqWordInit 0 s (0 :: Word)
1955− skip $ SplitOnSeqYield r next
1956− else skip $ SplitOnSeqWordLoop fs1 s wrd1
1957− Skip s -> skip $ SplitOnSeqWordLoop fs s wrd
1958− Stop -> skip $ SplitOnSeqWordDone patLen fs wrd
1969+ else go SPEC wrd1 s fs1
1970+ Skip s -> go SPEC wrd s fs
1971+ Stop -> skip $ SplitOnSeqWordDone patLen fs wrd
19591972
19601973 -------------------------------
19611974 -- General Pattern - Karp Rabin
@@ -2029,7 +2042,7 @@ splitOnSeq patArr (Fold fstep initial done) (Stream step state) =
20292042 stepOuter gst (SplitOnSeqKRLoop fs st rb rh cksum) = do
20302043 res <- step (adaptState gst) st
20312044 case res of
2032− Yield x s -> do -- skip $ SplitOnSeqKRYield fs s rb rh cksum x
2045+ Yield x s -> do
20332046 old <- liftIO $ peek rh
20342047 let cksum1 = deltaCksum cksum old x
20352048 fs1 <- fstep fs old