git.iko.soy/typeable/attoparsec
on master help sign in
Missed a few files. darcum-mode: FAIL.
commitbd72b340ad8af48bacf189718ecd6a15fc512f37 authorBryan O'Sullivan <bos@serpentine.com> dateFri 25 Jan 2008, 15:32 (19 years ago) parent5e10bdc
1 file changed+41
src/Text/ParserCombinators/ByteStringParser/FastSet.hs+41
src/Text/ParserCombinators/ByteStringParser/FastSet.hsnew file+41
@@ -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