module Math.ExpPairs.Process
( Process ()
, Path (Path)
, aPath
, baPath
, evalPath
, lengthPath
) where
import GHC.Generics (Generic)
import Generics.Deriving.Monoid (Monoid, mempty, memptydefault, mappend, mappenddefault)
import Text.PrettyPrint.Leijen
import Math.ExpPairs.ProcessMatrix
import Math.ExpPairs.PrettyProcess
data Path = Path !ProcessMatrix ![Process]
deriving (Eq, Generic)
instance Monoid Path where
mempty = memptydefault
mappend = mappenddefault
instance Show Path where
show (Path _ l) = show (pretty (prettify l))
instance Read Path where
readsPrec _ zs = [reads' zs] where
reads' ('A':xs) = (aPath `mappend` path, ys) where
(path, ys) = reads' xs
reads' ('B':'A':xs) = (baPath `mappend` path, ys) where
(path, ys) = reads' xs
reads' ('B':xs) = (baPath, xs)
reads' xs = (mempty, xs)
instance Ord Path where
(Path _ q1) <= (Path _ q2) = cmp q1 q2 where
cmp (A:p1) (A:p2) = cmp p1 p2
cmp (BA:p1) (BA:p2) = cmp p2 p1
cmp (A:_) (BA:_) = True
cmp (BA:_) (A:_) = False
cmp [] _ = True
cmp _ [] = False
aPath :: Path
aPath = Path aMatrix [ A]
baPath :: Path
baPath = Path baMatrix [BA]
evalPath :: (Num t) => Path -> (t, t, t) -> (t, t, t)
evalPath (Path m _) = evalMatrix m
lengthPath :: Path -> Int
lengthPath (Path _ xs) = length xs