-----------------------------------------------------------------------------
-- |
-- Module      :  CSPM.CoreLanguage.Event
-- Copyright   :  (c) Fontaine 2010 - 2011
-- License     :  BSD3
-- 
-- Maintainer  :  fontaine@cs.uni-duesseldorf.de
-- Stability   :  experimental
-- Portability :  GHC-only
--
-- This module defines the event-related part of an interface between 
-- the CSPM-CoreLanguage and the underlying implementation.
-- The underlying implementation has to instantiate the type families 'Event',
-- 'EventSet', 'RenamingRelation'
-- and the class 'BE' ('BE'== base event).
-- 
-- For full CSPM support (channels with multiple fields, event closure sets etc.)
-- CSPM.CoreLanguage.Field is also needed.
-----------------------------------------------------------------------------
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveDataTypeable #-}

module CSPM.CoreLanguage.Event
where
import Data.Typeable

type family Event i
type family EventSet i
type family RenamingRelation i

-- | Sigma is the set of all events that appear in a system.
type Sigma i = EventSet i

-- | The first argument of all functions in 'BE' is a phantom-type-argument, i.e.
-- applications pass _|_ and implementations must not use this value.
class BE i where
  eventEq :: i -> Event i -> Event i -> Bool
  member ::  i -> Event i -> EventSet i -> Bool
  intersection :: i -> EventSet i -> EventSet i -> EventSet i
  difference :: i -> EventSet i -> EventSet i -> EventSet i
  union :: i -> EventSet i -> EventSet i -> EventSet i
  null :: i -> EventSet i -> Bool
  singleton :: i -> Event i -> EventSet i
  insert :: i -> Event i -> EventSet i -> EventSet i
  delete :: i -> Event i -> EventSet i -> EventSet i
  eventSetToList :: i -> EventSet i -> [Event i]
  allEvents :: i -> EventSet i
  isInRenaming :: i -> RenamingRelation i -> Event i -> Event i -> Bool
  imageRenaming :: i -> RenamingRelation i -> Event i -> [Event i]
  preImageRenaming :: i -> RenamingRelation i -> Event i -> [Event i]
  isInRenamingDomain :: i -> Event i -> RenamingRelation i -> Bool
  isInRenamingRange :: i -> Event i -> RenamingRelation i -> Bool
  getRenamingDomain :: i -> RenamingRelation i -> [Event i]
  getRenamingRange  :: i -> RenamingRelation i -> [Event i]
  renamingFromList :: i -> [(Event i, Event i)] -> RenamingRelation i
  renamingToList :: i -> RenamingRelation i -> [(Event i, Event i)]
  singleEventToClosureSet :: i -> Event i -> EventSet i

-- | A wrapper for tick-events, tau-events and events from Sigma.
data TTE i
  = TickEvent
  | TauEvent
  | SEvent (Event i)
  deriving Typeable

class ShowEvent i where showEvent :: i -> String
class ShowTTE i where showTTE :: i -> String