git.iko.soy/typeable/attoparsec
on master help sign in
Avoid use of O(n^2) nub
commit6cdcd85523b33317c120c8b00d89a6b1b345c318 authorBryan O'Sullivan <bos@serpentine.com> dateTue 2 Dec 2014, 13:48 (12 years ago) parent193d6d8
1 file changed+10−2
Data/Attoparsec/Text/FastSet.hs+10−2
Data/Attoparsec/Text/FastSet.hs+10−2
@@ -30,7 +30,7 @@ module Data.Attoparsec.Text.FastSet
3030
3131import Data.Bits ((.|.), (.&.), shiftR)
3232import Data.Function (on)
33−import Data.List (sort, sortBy, nub)
33+import Data.List (sort, sortBy)
3434import qualified Data.Array.Base as AB
3535import qualified Data.Array.Unboxed as A
3636import qualified Data.Text as T
@@ -78,7 +78,7 @@ fastHash = fromEnum
7878fromList :: String -> FastSet
7979fromList s = FastSet (AB.listArray (0, length interleaved - 1) interleaved)
8080 mask'
81− where s' = nub $ sort s
81+ where s' = ordNub (sort s)
8282 l = length s'
8383 mask' = nextPowerOf2 ((5 * l) `div` 4) - 1
8484 entries = pad mask' .
@@ -89,6 +89,14 @@ fromList s = FastSet (AB.listArray (0, length interleaved - 1) interleaved)
8989 interleaved = concatMap (\e -> [fromEnum $ key e, initialIndex e])
9090 entries
9191
92+ordNub :: Eq a => [a] -> [a]
93+ordNub [] = []
94+ordNub (y:ys) = go y ys
95+ where go x (z:zs)
96+ | x == z = go x zs
97+ | otherwise = x : go z zs
98+ go x [] = [x]
99+
92100set :: T.Text -> FastSet
93101set = fromList . T.unpack
94102