-- |
-- 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 _            = ""