module PrintGNFA
where
import Text.PrettyPrint.HughesPJ(Doc,text,char,int,(<>),(<+>),($+$),($$),render,nest,vcat)
import Graphviz
import GNFA
import RegExp
import PP
import PrintRegExp

animateGNFA f m = mapM (\(i,m') -> pdfG (f++show i) m') $ zip [0..] (gnfaToRegExp' m)
animateG m = animateGNFA "animate" m

instance (Show a) => PP (RegExp a)
  where pp r = text $ short r

instance (PP q, Eq q, PP s, Show s) => PP (GNFA q s)
   where pp (GNFA { states = q,
                    symbols = sigma,
                    delta = d,
                    start = q0,
                    final = f}) 
             = text "GNFA" $$ nest 5 (vcat [text "Q"    $$ (nest 7 $ set q),
                                           text "Sigma" $$ (nest 7 $ set sigma),
                                           text "delta" $$ (nest 7 $ graph q sigma d q0 f),
                                           text "Start" $$ (nest 7 $ pp q0),
                                           text "Final" $$ (nest 7 $ pp f)
                                          ])

graph q sigma d q0 f = vcat [ (pp p) <+> (pp p') <+> text "->" <+> (pp (d p p')) | p <- q, p' <- q, p /= f, p' /= q0]

instance (PP q, Eq q, PP s, Show s) => Show (GNFA q s)
  where show = render . pp

instance PP (Distinguished) where
   pp = text . show

instance (Eq q,Show q,Show s) => Graph (GNFA q s) where
  nodes t = map f pairs
    where pairs = zip (states t) [0..] 
          f (q,n) = (n,show q,stateColor t q)
          stateColor t q | q == (start t)   = Green
	  stateColor t q | q == (final t)   = Red
	  stateColor t q                    = None
	                            
  edges t = [(n,m,short (delta t p q),None) | (p,n) <- froms, (q,m) <- tos]
      where pairs = zip (states t) [0..]
            froms = filter (\(q,_) -> not $ q == (final t)) pairs
            tos = filter (\(q,_) -> not $ q == (start t)) pairs
