-- Typdefinitionen für den NFA:
-------------------------------

module NFA where

type Sigma       = [Char] -- = String, hier aber nicht gemeint...

type DeltaNFA state = state -> Maybe Char -> [state]

type NFA state = ([state],          -- Liste der Zustaende
                  Sigma,            -- Alphabet
                  (DeltaNFA state), -- Transitionsfunktion
                  state,            -- Anfangszustand
                  [state])          -- Menge der Endzustaende

--
-- Show: NFA, DFA
--
--------------------------------------------------------------------------------


showNFA :: NFA Int -> IO()
showNFA (qs,cs,delta,q0,finals) 
 = putStr ("States:   " ++ show qs ++
   '\n':"Alphabet: " ++ show cs  ++
   '\n':"Transition table:" ++ (showDelta qs cs delta) ++ 
   '\n':"Start state :" ++ show q0 ++
   '\n':"Final states:" ++ show finals) 

showDelta :: [Int] -> Sigma -> DeltaNFA Int -> String
showDelta [] cs delta = ['\n']
showDelta (q:qs) cs delta 
    = concat (map (showLine q delta) cs)
          ++ '\n': show q ++ " - eps -> " ++ show (delta q Nothing)  ++
      (showDelta qs cs delta)
    where showLine :: Int -> DeltaNFA Int -> Char -> String
          showLine q delta c = '\n': show q ++ " - " ++ [c] ++ "   -> " 
                               ++ show (delta q (Just c))  

{-
showDFA :: DFA [Int] -> IO()
showDFA (qs,cs,delta,q0,finals) 
 = putStr ("States:   " ++ show qs ++
   '\n':"Alphabet: " ++ show cs  ++
   '\n':"Transition table:" ++ (showDeltaDFA qs cs delta) ++ 
   '\n':"Start state :" ++ show q0 ++
   '\n':"Final states:" ++ show finals) 

showDeltaDFA :: [[Int]] -> Sigma -> DeltaDFA [Int] -> String
showDeltaDFA [] cs delta = ['\n']
showDeltaDFA (q:qs) cs delta 
    = concat (map (showLine q delta) cs) ++
      (showDeltaDFA qs cs delta)
    where showLine :: [Int] -> DeltaDFA [Int] -> Sigma -> String
          showLine q delta c = '\n': show q ++ " - " ++ [c] ++ " -> " 
                               ++ show (delta q [c])  



showD :: DFA Int -> IO()
showD (qs,cs,delta,q0,finals) 
 = putStr ("States:   " ++ show qs ++
   '\n':"Alphabet: " ++ show cs  ++
   '\n':"Transition table:" ++ (showDeltaD qs cs delta) ++ 
   '\n':"Start state :" ++ show q0 ++
   '\n':"Final states:" ++ show finals) 

showDeltaD :: [Int] -> Sigma -> DeltaDFA Int -> String
showDeltaD [] cs delta = ['\n']
showDeltaD (q:qs) cs delta 
    = concat (map (showLine q delta) cs) ++
      (showDeltaD qs cs delta)
    where showLine :: Int -> DeltaDFA Int -> Sigma -> String
          showLine q delta c = '\n' : show q ++ " - " ++ [c] ++ " -> " 
                               ++ show (delta q [c])  
-}
