module Text.Regex.TDFA.NewDFA.MakeTest(test_singleline,test_multiline) where
import qualified Data.IntSet as ISet(IntSet,member,fromAscList)
import Text.Regex.TDFA.Common(WhichTest(..),Index)
import Text.Regex.TDFA.NewDFA.Uncons(Uncons(uncons))
{-# INLINE test_singleline #-}
{-# INLINE test_multiline #-}
{-# INLINE test_common #-}
test_singleline,test_multiline,test_common :: Uncons text => WhichTest -> Index -> Char -> text -> Bool
test_multiline Test_BOL _off prev _input = prev == '\n'
test_multiline Test_EOL _off _prev input = case uncons input of
Nothing -> True
Just (next,_) -> next == '\n'
test_multiline test off prev input = test_common test off prev input
test_singleline Test_BOL off _prev _input = off == 0
test_singleline Test_EOL _off _prev input = case uncons input of
Nothing -> True
_ -> False
test_singleline test off prev input = test_common test off prev input
test_common Test_BOB off _prev _input = off==0
test_common Test_EOB _off _prev input = case uncons input of
Nothing -> True
_ -> False
test_common Test_BOW _off prev input = not (isWord prev) && case uncons input of
Nothing -> False
Just (c,_) -> isWord c
test_common Test_EOW _off prev input = isWord prev && case uncons input of
Nothing -> True
Just (c,_) -> not (isWord c)
test_common Test_EdgeWord _off prev input =
if isWord prev
then case uncons input of Nothing -> True
Just (c,_) -> not (isWord c)
else case uncons input of Nothing -> False
Just (c,_) -> isWord c
test_common Test_NotEdgeWord _off prev input = not (test_common Test_EdgeWord _off prev input)
test_common Test_BOL _ _ _ = undefined
test_common Test_EOL _ _ _ = undefined
isWord :: Char -> Bool
isWord c = ISet.member (fromEnum c) wordSet
where wordSet :: ISet.IntSet
wordSet = ISet.fromAscList . map fromEnum $ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"