alex-2.3.2: src/CharSet.hs
-- -----------------------------------------------------------------------------
--
-- CharSet.hs, part of Alex
--
-- (c) Chris Dornan 1995-2000, Simon Marlow 2003
--
-- An abstract CharSet type for Alex. To begin with we'll use Alex's
-- original definition of sets as functions, then later will
-- transition to something that will work better with Unicode.
--
-- ----------------------------------------------------------------------------}
module CharSet (
CharSet, -- abstract
emptyCharSet,
charSetSingleton,
charSet,
charSetMinus,
charSetComplement,
charSetRange,
charSetUnion,
charSetToArray,
charSetElems
) where
import Data.Array ( Array, array )
-- Implementation as functions
type CharSet = Char -> Bool
emptyCharSet :: CharSet
emptyCharSet = const False
charSetSingleton :: Char -> CharSet
charSetSingleton c = \x -> x == c
charSet :: [Char] -> CharSet
charSet s x = x `elem` s
charSetMinus :: CharSet -> CharSet -> CharSet
charSetMinus s1 s2 x = s1 x && not (s2 x)
charSetUnion :: CharSet -> CharSet -> CharSet
charSetUnion s1 s2 x = s1 x || s2 x
charSetComplement :: CharSet -> CharSet
charSetComplement s1 = not . s1
charSetRange :: Char -> Char -> CharSet
charSetRange c1 c2 x = x >= c1 && x <= c2
charSetToArray :: CharSet -> Array Char Bool
charSetToArray set = array (fst (head ass), fst (last ass)) ass
where ass = [(c,set c) | c <- ['\0'..'\xff']]
charSetElems :: CharSet -> [Char]
charSetElems set = [c | c <- ['\0'..'\xff'], set c]