module Text.Regex.Applicative.Compile (compile) where
import Text.Regex.Applicative.Types
compile :: forall a s r . RE s a -> (a -> [Thread s r]) -> [Thread s r]
compile e k = compile2 e k k
compile2 :: forall a s r . RE s a -> (a -> [Thread s r]) -> (a -> [Thread s r]) -> [Thread s r]
compile2 e =
case e of
Eps -> \ke _kn -> ke $ error "empty"
Symbol i p -> \_ke kn -> [t kn] where
t :: (a -> [Thread s r]) -> Thread s r
t k = Thread i $ \s ->
if p s then k s else []
App (compile2 -> a1) (compile2 -> a2) -> \ke kn ->
a1
(\a1_value -> a2 (ke . a1_value) (kn . a1_value))
(\a1_value -> a2 (kn . a1_value) (kn . a1_value))
Alt (compile2 -> a1) (compile2 -> a2) ->
\ke kn -> a1 ke kn ++ a2 ke kn
Fmap f (compile2 -> a) -> \ke kn -> a (ke . f) (kn . f)
Rep g f b (compile2 -> a) ->
let combine continue stop =
case g of
Greedy -> continue ++ stop
NonGreedy -> stop ++ continue
threads b ke kn =
combine
(a (\_ -> []) (\v -> let b' = f b v in threads b' kn kn))
(ke b)
in threads b