module Language.Lexer.Tlex (
    module Language.Lexer.Tlex.Syntax,
    module Language.Lexer.Tlex.Runner,
    module Language.Lexer.Tlex.Data.InputString,
    buildRunner,
) where

import           Language.Lexer.Tlex.Data.InputString
import           Language.Lexer.Tlex.Prelude
import           Language.Lexer.Tlex.Runner
import           Language.Lexer.Tlex.Syntax

import qualified Language.Lexer.Tlex.Machine.NFA          as NFA
import qualified Language.Lexer.Tlex.Pipeline.Dfa2Runner  as TlexPipeline
import qualified Language.Lexer.Tlex.Pipeline.MinDfa      as TlexPipeline
import qualified Language.Lexer.Tlex.Pipeline.Nfa2Dfa     as TlexPipeline
import qualified Language.Lexer.Tlex.Pipeline.Scanner2Nfa as TlexPipeline


buildRunner :: Enum unit => Scanner unit action -> Runner unit action
buildRunner :: forall unit action.
Enum unit =>
Scanner unit action -> Runner unit action
buildRunner Scanner unit action
scanner =
    let nfa :: NFA action
nfa = forall m. NFABuilder m () -> NFA m
NFA.buildNFA do forall e m. Enum e => Scanner e m -> NFABuilder m ()
TlexPipeline.scanner2Nfa Scanner unit action
scanner
        dfa :: DFA action
dfa = forall a. NFA a -> DFA a
TlexPipeline.nfa2Dfa NFA action
nfa
        minDfa :: DFA action
minDfa = forall a. DFA a -> DFA a
TlexPipeline.minDfa DFA action
dfa
    in forall e a. Enum e => DFA a -> Runner e a
TlexPipeline.dfa2Runner DFA action
minDfa