attoparsec-0.13.0.1: Data/Attoparsec/Text/FastSet.hs
-- |
-- Module : Data.Attoparsec.Text.FastSet
-- Copyright : Bryan O'Sullivan 2015
-- License : BSD3
--
-- Maintainer : bos@serpentine.com
-- Stability : experimental
-- Portability : unknown
--
-- Fast set membership tests for 'Char' values.
module Data.Attoparsec.Text.FastSet
(
-- * Data type
FastSet
-- * Construction
, fromList
-- * Lookup
, member
-- * Handy interface
, charClass
) where
import qualified Data.IntSet as I
import Data.Char (ord)
newtype FastSet = FastSet I.IntSet
fromList :: String -> FastSet
fromList = FastSet . I.fromList . map ord
-- | Check the set for membership.
member :: Char -> FastSet -> Bool
member c (FastSet s) = I.member (ord c) s
{-# INLINE member #-}
charClass :: String -> FastSet
charClass = fromList . go
where go (a:'-':b:xs) = [a..b] ++ go xs
go (x:xs) = x : go xs
go _ = ""