on master help sign in
Move the definition of buildTable inline, to save repeated work.

--HG-- extra : convert_revision : ca11e7060f32e64f49c6db0ae66d793982a9b083

commite7364e1d1e296e256be65b31ab830e7f4f28e11d authorBryan O'Sullivan <bos@serpentine.com> dateWed 7 Oct 2009, 03:01 (17 years ago) parent2e4c79c
1 file changed+16−23
Data/Text/Lazy/Search.hs+16−23
Data/Text/Lazy/Search.hs+16−23
@@ -81,7 +81,19 @@ indices needle@(Chunk n ns) haystack@(Chunk k ks)
8181 nindex = index n ns
8282 z = foldlChunks fin 0 needle
8383 where fin _ (T.Text farr foff flen) = A.unsafeIndex farr (foff+flen-1)
84− mask :*: skip = buildTable needle
84+ (mask :: Word64) :*: skip = buildTable n ns 0 0 0 (nlen-2)
85+ swizzle w = 1 `shiftL` (fromIntegral w .&. 0x3f)
86+ buildTable (T.Text xarr xoff xlen) xs = go
87+ where
88+ go !(g::Int64) !i !msk !skp
89+ | i >= xlast = case xs of
90+ Empty -> (msk .|. swizzle z) :*: skp
91+ Chunk y ys -> buildTable y ys g 0 msk skp
92+ | otherwise = go (g+1) (i+1) (msk .|. swizzle c) skp'
93+ where c = A.unsafeIndex xarr (xoff+i)
94+ skp' | c == z = nlen - fromIntegral g - 2
95+ | otherwise = skp
96+ xlast = xlen - 1
8597 scanOne c i (T.Text oarr ooff olen) os = go 0
8698 where
8799 go h | h >= olen = case os of
@@ -97,32 +109,13 @@ index (T.Text arr off len) xs i
97109 | j < len = A.unsafeIndex arr (off+j)
98110 | otherwise = case xs of
99111 Empty | j == len -> 0
100− | otherwise -> error "empty"
112+ | otherwise -> emptyError "index"
101113 Chunk c cs -> index c cs (i-fromIntegral len)
102114 where j = fromIntegral i
103115
104−swizzle :: Word16 -> Word64
105−swizzle k = 1 `shiftL` (fromIntegral k .&. 0x3f)
106−
107116wordLength :: Text -> Int64
108117wordLength = foldlChunks sumLength 0
109118 where sumLength i (T.Text _ _ l) = i + fromIntegral l
110119
111−buildTable :: Text -> PairS Word64 Int64
112−buildTable Empty = 0 :*: 0
113−buildTable needle@(Chunk k ks) = outer k ks 0 0 0 (nlen-2)
114− where
115− outer (T.Text xarr xoff xlen) xs = go
116− where
117− go !(g::Int64) !i !mask !skip
118− | i >= xlast = case xs of
119− Empty -> (mask .|. swizzle z) :*: skip
120− Chunk y ys -> outer y ys g 0 mask skip
121− | otherwise = go (g+1) (i+1) (mask .|. swizzle c) skip'
122− where c = A.unsafeIndex xarr (xoff+i)
123− skip' | c == z = nlen - fromIntegral g - 2
124− | otherwise = skip
125− xlast = xlen - 1
126− nlen = wordLength needle
127− z = foldlChunks fin 0 needle
128− where fin _ (T.Text farr foff flen) = A.unsafeIndex farr (foff+flen-1)
120+emptyError :: String -> a
121+emptyError fun = error ("Data.Text.Lazy.Search." ++ fun ++ ": empty input")