module Data.DFA
(
DFA
, Label
, State
, initialize
, finished
, addTransition
, setFinal
, minimize
, foldTransitions
, getInitialState
, numStates
, numSymbols
, isFinal
, debugging
, loadFromFile
, dumpToFile
) where
import Prelude
import Control.Monad ( foldM )
import Foreign
import Foreign.C
newtype DFA = DFA (Ptr DFA)
type Label = CUInt
type State = CUInt
initialize :: Bool
-> State
-> IO DFA
initialize debug initial = dfa_init (fromBool debug) initial
addTransition :: DFA -> (State, Label, State) -> IO ()
addTransition dfa (t, l, h) = addTransition' dfa t l h
debugging :: DFA -> IO Bool
debugging = fmap toBool . debugging'
loadFromFile :: FilePath -> IO DFA
loadFromFile fname = fmap DFA $ throwErrnoPathIfNull "Data.DFA.loadFromFile" fname $
withCString fname loadFromFile'
dumpToFile :: DFA -> FilePath -> IO ()
dumpToFile dfa fname = throwErrnoPathIfMinus1_ "Data.DFA.dumpToFile" fname $
withCString fname (dumpToFile' dfa)
minimize :: DFA
-> Bool
-> IO ()
minimize dfa = minimize' dfa . fromBool
isFinal :: DFA -> State -> IO Bool
isFinal dfa = fmap toBool . isFinal' dfa
foldTransitions :: DFA -> ((State, Label, State, Bool) -> b -> IO b) -> b -> IO b
foldTransitions dfa f b0 =
do trans <- numTransitions dfa
foldM g b0 [ 0 .. trans 1 ]
where
g b i =
do t <- transition_start dfa i
l <- transition_label dfa i
h <- transition_end dfa i
hf <- isFinal dfa h
f (t, l, h, hf) b
foreign import ccall unsafe "dfa.h DFA_init" dfa_init :: Int -> State -> IO DFA
foreign import ccall unsafe "dfa.h DFA_getInitialState"
getInitialState :: DFA -> IO State
foreign import ccall unsafe "dfa.h DFA_free" finished :: DFA -> IO ()
foreign import ccall unsafe "dfa.h DFA_numStates" numStates :: DFA -> IO CUInt
foreign import ccall unsafe "dfa.h DFA_numSymbols" numSymbols :: DFA -> IO CUInt
foreign import ccall unsafe "dfa.h DFA_numTransitions" numTransitions :: DFA -> IO CUInt
foreign import ccall unsafe "dfa.h DFA_transition_start"
transition_start :: DFA -> CUInt -> IO State
foreign import ccall unsafe "dfa.h DFA_transition_label"
transition_label :: DFA -> CUInt -> IO Label
foreign import ccall unsafe "dfa.h DFA_transition_end"
transition_end :: DFA -> CUInt -> IO State
foreign import ccall unsafe "dfa.h DFA_isFinal"
isFinal' :: DFA -> State -> IO CInt
foreign import ccall unsafe "dfa.h DFA_addTransition"
addTransition' :: DFA -> State -> Label -> State -> IO ()
foreign import ccall unsafe "dfa.h DFA_setFinal"
setFinal :: DFA -> State -> IO ()
foreign import ccall unsafe "dfa.h DFA_minimize"
minimize' :: DFA -> CInt -> IO ()
foreign import ccall unsafe "dfa.h DFA_debugging"
debugging' :: DFA -> IO CInt
foreign import ccall unsafe "dfa.h DFA_dumpToFile"
dumpToFile' :: DFA -> CString -> IO CInt
foreign import ccall unsafe "dfa.h DFA_loadFromFile"
loadFromFile' :: CString -> IO (Ptr DFA)