{-# LANGUAGE DeriveGeneric #-}
module Modelling.ActivityDiagram.Datatype (
  AdConnection (..),
  AdNode (..),
  UMLActivityDiagram(..),
  getInitialNodes,
  getFinalNodes,
  isActionNode,
  isObjectNode,
  isDecisionNode,
  isMergeNode,
  isForkNode,
  isJoinNode,
  isInitialNode,
  isActivityFinalNode,
  isFlowFinalNode,
  adjNodes
) where

import GHC.Generics (Generic)

data AdConnection =
  AdConnection {
    AdConnection -> Int
from :: Int,
    AdConnection -> Int
to :: Int,
    AdConnection -> String
guard :: String
  } deriving ((forall x. AdConnection -> Rep AdConnection x)
-> (forall x. Rep AdConnection x -> AdConnection)
-> Generic AdConnection
forall x. Rep AdConnection x -> AdConnection
forall x. AdConnection -> Rep AdConnection x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AdConnection -> Rep AdConnection x
from :: forall x. AdConnection -> Rep AdConnection x
$cto :: forall x. Rep AdConnection x -> AdConnection
to :: forall x. Rep AdConnection x -> AdConnection
Generic, ReadPrec [AdConnection]
ReadPrec AdConnection
Int -> ReadS AdConnection
ReadS [AdConnection]
(Int -> ReadS AdConnection)
-> ReadS [AdConnection]
-> ReadPrec AdConnection
-> ReadPrec [AdConnection]
-> Read AdConnection
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS AdConnection
readsPrec :: Int -> ReadS AdConnection
$creadList :: ReadS [AdConnection]
readList :: ReadS [AdConnection]
$creadPrec :: ReadPrec AdConnection
readPrec :: ReadPrec AdConnection
$creadListPrec :: ReadPrec [AdConnection]
readListPrec :: ReadPrec [AdConnection]
Read, Int -> AdConnection -> ShowS
[AdConnection] -> ShowS
AdConnection -> String
(Int -> AdConnection -> ShowS)
-> (AdConnection -> String)
-> ([AdConnection] -> ShowS)
-> Show AdConnection
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AdConnection -> ShowS
showsPrec :: Int -> AdConnection -> ShowS
$cshow :: AdConnection -> String
show :: AdConnection -> String
$cshowList :: [AdConnection] -> ShowS
showList :: [AdConnection] -> ShowS
Show, AdConnection -> AdConnection -> Bool
(AdConnection -> AdConnection -> Bool)
-> (AdConnection -> AdConnection -> Bool) -> Eq AdConnection
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AdConnection -> AdConnection -> Bool
== :: AdConnection -> AdConnection -> Bool
$c/= :: AdConnection -> AdConnection -> Bool
/= :: AdConnection -> AdConnection -> Bool
Eq, Eq AdConnection
Eq AdConnection
-> (AdConnection -> AdConnection -> Ordering)
-> (AdConnection -> AdConnection -> Bool)
-> (AdConnection -> AdConnection -> Bool)
-> (AdConnection -> AdConnection -> Bool)
-> (AdConnection -> AdConnection -> Bool)
-> (AdConnection -> AdConnection -> AdConnection)
-> (AdConnection -> AdConnection -> AdConnection)
-> Ord AdConnection
AdConnection -> AdConnection -> Bool
AdConnection -> AdConnection -> Ordering
AdConnection -> AdConnection -> AdConnection
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AdConnection -> AdConnection -> Ordering
compare :: AdConnection -> AdConnection -> Ordering
$c< :: AdConnection -> AdConnection -> Bool
< :: AdConnection -> AdConnection -> Bool
$c<= :: AdConnection -> AdConnection -> Bool
<= :: AdConnection -> AdConnection -> Bool
$c> :: AdConnection -> AdConnection -> Bool
> :: AdConnection -> AdConnection -> Bool
$c>= :: AdConnection -> AdConnection -> Bool
>= :: AdConnection -> AdConnection -> Bool
$cmax :: AdConnection -> AdConnection -> AdConnection
max :: AdConnection -> AdConnection -> AdConnection
$cmin :: AdConnection -> AdConnection -> AdConnection
min :: AdConnection -> AdConnection -> AdConnection
Ord)

data AdNode =
  AdActionNode {
    AdNode -> Int
label :: Int,
    AdNode -> String
name :: String
  }
  | AdObjectNode {
      label :: Int,
      name :: String
  }
  | AdDecisionNode {
      label :: Int
  }
  | AdMergeNode {
      label :: Int
  }
  | AdForkNode {
      label :: Int
  }
  | AdJoinNode {
      label :: Int
  }
  | AdActivityFinalNode {
      label :: Int
  }
  | AdFlowFinalNode {
      label :: Int
  }
  | AdInitialNode {
      label :: Int
  } deriving ((forall x. AdNode -> Rep AdNode x)
-> (forall x. Rep AdNode x -> AdNode) -> Generic AdNode
forall x. Rep AdNode x -> AdNode
forall x. AdNode -> Rep AdNode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AdNode -> Rep AdNode x
from :: forall x. AdNode -> Rep AdNode x
$cto :: forall x. Rep AdNode x -> AdNode
to :: forall x. Rep AdNode x -> AdNode
Generic, ReadPrec [AdNode]
ReadPrec AdNode
Int -> ReadS AdNode
ReadS [AdNode]
(Int -> ReadS AdNode)
-> ReadS [AdNode]
-> ReadPrec AdNode
-> ReadPrec [AdNode]
-> Read AdNode
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS AdNode
readsPrec :: Int -> ReadS AdNode
$creadList :: ReadS [AdNode]
readList :: ReadS [AdNode]
$creadPrec :: ReadPrec AdNode
readPrec :: ReadPrec AdNode
$creadListPrec :: ReadPrec [AdNode]
readListPrec :: ReadPrec [AdNode]
Read, Int -> AdNode -> ShowS
[AdNode] -> ShowS
AdNode -> String
(Int -> AdNode -> ShowS)
-> (AdNode -> String) -> ([AdNode] -> ShowS) -> Show AdNode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AdNode -> ShowS
showsPrec :: Int -> AdNode -> ShowS
$cshow :: AdNode -> String
show :: AdNode -> String
$cshowList :: [AdNode] -> ShowS
showList :: [AdNode] -> ShowS
Show, AdNode -> AdNode -> Bool
(AdNode -> AdNode -> Bool)
-> (AdNode -> AdNode -> Bool) -> Eq AdNode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AdNode -> AdNode -> Bool
== :: AdNode -> AdNode -> Bool
$c/= :: AdNode -> AdNode -> Bool
/= :: AdNode -> AdNode -> Bool
Eq)


data UMLActivityDiagram =
  UMLActivityDiagram {
    UMLActivityDiagram -> [AdNode]
nodes :: [AdNode],
    UMLActivityDiagram -> [AdConnection]
connections :: [AdConnection]
  } deriving ((forall x. UMLActivityDiagram -> Rep UMLActivityDiagram x)
-> (forall x. Rep UMLActivityDiagram x -> UMLActivityDiagram)
-> Generic UMLActivityDiagram
forall x. Rep UMLActivityDiagram x -> UMLActivityDiagram
forall x. UMLActivityDiagram -> Rep UMLActivityDiagram x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UMLActivityDiagram -> Rep UMLActivityDiagram x
from :: forall x. UMLActivityDiagram -> Rep UMLActivityDiagram x
$cto :: forall x. Rep UMLActivityDiagram x -> UMLActivityDiagram
to :: forall x. Rep UMLActivityDiagram x -> UMLActivityDiagram
Generic, ReadPrec [UMLActivityDiagram]
ReadPrec UMLActivityDiagram
Int -> ReadS UMLActivityDiagram
ReadS [UMLActivityDiagram]
(Int -> ReadS UMLActivityDiagram)
-> ReadS [UMLActivityDiagram]
-> ReadPrec UMLActivityDiagram
-> ReadPrec [UMLActivityDiagram]
-> Read UMLActivityDiagram
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS UMLActivityDiagram
readsPrec :: Int -> ReadS UMLActivityDiagram
$creadList :: ReadS [UMLActivityDiagram]
readList :: ReadS [UMLActivityDiagram]
$creadPrec :: ReadPrec UMLActivityDiagram
readPrec :: ReadPrec UMLActivityDiagram
$creadListPrec :: ReadPrec [UMLActivityDiagram]
readListPrec :: ReadPrec [UMLActivityDiagram]
Read, Int -> UMLActivityDiagram -> ShowS
[UMLActivityDiagram] -> ShowS
UMLActivityDiagram -> String
(Int -> UMLActivityDiagram -> ShowS)
-> (UMLActivityDiagram -> String)
-> ([UMLActivityDiagram] -> ShowS)
-> Show UMLActivityDiagram
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UMLActivityDiagram -> ShowS
showsPrec :: Int -> UMLActivityDiagram -> ShowS
$cshow :: UMLActivityDiagram -> String
show :: UMLActivityDiagram -> String
$cshowList :: [UMLActivityDiagram] -> ShowS
showList :: [UMLActivityDiagram] -> ShowS
Show, UMLActivityDiagram -> UMLActivityDiagram -> Bool
(UMLActivityDiagram -> UMLActivityDiagram -> Bool)
-> (UMLActivityDiagram -> UMLActivityDiagram -> Bool)
-> Eq UMLActivityDiagram
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UMLActivityDiagram -> UMLActivityDiagram -> Bool
== :: UMLActivityDiagram -> UMLActivityDiagram -> Bool
$c/= :: UMLActivityDiagram -> UMLActivityDiagram -> Bool
/= :: UMLActivityDiagram -> UMLActivityDiagram -> Bool
Eq)


adjNodes :: AdNode -> UMLActivityDiagram -> [AdNode]
adjNodes :: AdNode -> UMLActivityDiagram -> [AdNode]
adjNodes AdNode
node (UMLActivityDiagram [AdNode]
ns [AdConnection]
conns) =
  let adjLabel :: [Int]
adjLabel = (AdConnection -> Int) -> [AdConnection] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map AdConnection -> Int
to ([AdConnection] -> [Int]) -> [AdConnection] -> [Int]
forall a b. (a -> b) -> a -> b
$ (AdConnection -> Bool) -> [AdConnection] -> [AdConnection]
forall a. (a -> Bool) -> [a] -> [a]
filter (\AdConnection
c -> AdConnection -> Int
from AdConnection
c Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== AdNode -> Int
label AdNode
node) [AdConnection]
conns
  in (AdNode -> Bool) -> [AdNode] -> [AdNode]
forall a. (a -> Bool) -> [a] -> [a]
filter (\AdNode
node' -> AdNode -> Int
label AdNode
node' Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
adjLabel) [AdNode]
ns

isActionNode :: AdNode -> Bool
isActionNode :: AdNode -> Bool
isActionNode AdNode
node =
  case AdNode
node of
    AdActionNode {} -> Bool
True
    AdNode
_ -> Bool
False

isObjectNode :: AdNode -> Bool
isObjectNode :: AdNode -> Bool
isObjectNode AdNode
node =
  case AdNode
node of
    AdObjectNode {} -> Bool
True
    AdNode
_ -> Bool
False

isDecisionNode :: AdNode -> Bool
isDecisionNode :: AdNode -> Bool
isDecisionNode AdNode
node =
  case AdNode
node of
    AdDecisionNode {} -> Bool
True
    AdNode
_ -> Bool
False

isMergeNode :: AdNode -> Bool
isMergeNode :: AdNode -> Bool
isMergeNode AdNode
node =
  case AdNode
node of
    AdMergeNode {} -> Bool
True
    AdNode
_ -> Bool
False

isForkNode :: AdNode -> Bool
isForkNode :: AdNode -> Bool
isForkNode AdNode
node =
  case AdNode
node of
    AdForkNode {} -> Bool
True
    AdNode
_ -> Bool
False

isJoinNode :: AdNode -> Bool
isJoinNode :: AdNode -> Bool
isJoinNode AdNode
node =
  case AdNode
node of
    AdJoinNode {} -> Bool
True
    AdNode
_ -> Bool
False

isInitialNode :: AdNode -> Bool
isInitialNode :: AdNode -> Bool
isInitialNode AdNode
node =
  case AdNode
node of
    AdInitialNode {} -> Bool
True
    AdNode
_ -> Bool
False

isActivityFinalNode :: AdNode -> Bool
isActivityFinalNode :: AdNode -> Bool
isActivityFinalNode AdNode
node =
  case AdNode
node of
    AdActivityFinalNode {} -> Bool
True
    AdNode
_ -> Bool
False

isFlowFinalNode :: AdNode -> Bool
isFlowFinalNode :: AdNode -> Bool
isFlowFinalNode AdNode
node =
  case AdNode
node of
    AdFlowFinalNode {} -> Bool
True
    AdNode
_ -> Bool
False


getInitialNodes :: UMLActivityDiagram -> [AdNode]
getInitialNodes :: UMLActivityDiagram -> [AdNode]
getInitialNodes (UMLActivityDiagram [AdNode]
ns [AdConnection]
_) =
  (AdNode -> Bool) -> [AdNode] -> [AdNode]
forall a. (a -> Bool) -> [a] -> [a]
filter AdNode -> Bool
isInitialNode [AdNode]
ns

getFinalNodes :: UMLActivityDiagram -> [AdNode]
getFinalNodes :: UMLActivityDiagram -> [AdNode]
getFinalNodes (UMLActivityDiagram [AdNode]
ns [AdConnection]
_) =
  (AdNode -> Bool) -> [AdNode] -> [AdNode]
forall a. (a -> Bool) -> [a] -> [a]
filter (\AdNode
x -> AdNode -> Bool
isActivityFinalNode AdNode
x Bool -> Bool -> Bool
|| AdNode -> Bool
isFlowFinalNode AdNode
x) [AdNode]
ns