----------------------------------------------------------------------------
-- |
-- Module      :  CSPM.LTS.LTS
-- Copyright   :  (c) Fontaine 2009 - 2011
-- License     :  BSD3
-- 
-- Maintainer  :  Fontaine@cs.uni-duesseldorf.de
-- Stability   :  experimental
-- Portability :  GHC-only
--
{-# LANGUAGE BangPatterns #-}
{-# Language DeriveDataTypeable #-}

module CSPM.LTS.LTS
where
import CSPM.FiringRules.Rules
import CSPM.Interpreter as Interpreter
import CSPM.Interpreter.Hash

import Data.Typeable
import Data.Map (Map)
import Data.Ord (comparing)
import Data.Function (on)

data LtsNode
  = LtsNode {
    nodeDigest :: ! Interpreter.Digest
   ,nodeProcess :: Interpreter.Process
   } deriving Typeable

mkLtsNode :: Interpreter.Process -> LtsNode
mkLtsNode p = LtsNode {
   nodeDigest = hash p
  ,nodeProcess = p }

instance Ord  LtsNode where compare = comparing nodeDigest
instance Eq   LtsNode where (==) = on (==) nodeDigest
instance Show LtsNode where
  show f = "(LTSNode " ++ (show $ nodeDigest f) ++ ")"

type LTS = Map LtsNode [Rule INT]