@@ -0,0 +1,41 @@
1+-----------------------------------------------------------------------------
2+-- |
3+-- Module : Text.ParserCombinators.ByteStringParser.FastSet
4+-- Copyright : Bryan O'Sullivan 2008
5+-- License : BSD3
6+--
7+-- Maintainer : bos@serpentine.com
8+-- Stability : experimental
9+-- Portability : unknown
10+--
11+-- Fast 8-bit character set membership.
12+--
13+-----------------------------------------------------------------------------
14+module Text.ParserCombinators.ByteStringParser.FastSet
15+ (
16+ FastSet
17+ , set
18+ , member
19+ ) where
20+
21+import Data.ByteString.Char8 as SB
22+import Data.ByteString.Internal as SB
23+import Data.ByteString.Unsafe as SB
24+
25+newtype FastSet = FastSet SB.ByteString
26+ deriving (Eq, Ord, Show)
27+
28+set :: SB.ByteString -> FastSet
29+set = FastSet . SB.sort
30+
31+member :: Char -> FastSet -> Bool
32+member c (FastSet s) = search 0 (SB.length s - 1)
33+ where w = SB.c2w c
34+ search lo hi | hi < lo = False
35+ | otherwise =
36+ let mid = (lo + hi) `div` 2
37+ cur = SB.unsafeIndex s mid
38+ in case compare cur w of
39+ GT -> search lo (mid - 1)
40+ LT -> search (mid + 1) hi
41+ _ -> True