packages feed

hydra-0.12.0: src/main/haskell/Hydra/Dsl/Topology.hs

module Hydra.Dsl.Topology where

import Hydra.Kernel
import Hydra.Dsl.Phantoms
import Hydra.Topology as Topology

import qualified Data.Map as M
import qualified Data.Set as S


orderingIsomorphism :: TTerm ([a] -> [a])
                  -> TTerm ([a] -> [a])
                  -> TTerm (Topology.OrderingIsomorphism a)
orderingIsomorphism encode decode = record _OrderingIsomorphism [
    _OrderingIsomorphism_encode>>: encode,
    _OrderingIsomorphism_decode>>: decode]

tarjanState :: TTerm Int
            -> TTerm (M.Map Vertex Int)
            -> TTerm (M.Map Vertex Int)
            -> TTerm [Vertex]
            -> TTerm (S.Set Vertex)
            -> TTerm [[Vertex]]
            -> TTerm TarjanState
tarjanState counter indices lowLinks stack onStack sccs = record _TarjanState [
    _TarjanState_counter>>: counter,
    _TarjanState_indices>>: indices,
    _TarjanState_lowLinks>>: lowLinks,
    _TarjanState_stack>>: stack,
    _TarjanState_onStack>>: onStack,
    _TarjanState_sccs>>: sccs]

tarjanStateCounter :: TTerm TarjanState -> TTerm Int
tarjanStateCounter ts = project _TarjanState _TarjanState_counter @@ ts

tarjanStateIndices :: TTerm TarjanState -> TTerm (M.Map Vertex Int)
tarjanStateIndices ts = project _TarjanState _TarjanState_indices @@ ts

tarjanStateLowLinks :: TTerm TarjanState -> TTerm (M.Map Vertex Int)
tarjanStateLowLinks ts = project _TarjanState _TarjanState_lowLinks @@ ts

tarjanStateStack :: TTerm TarjanState -> TTerm [Vertex]
tarjanStateStack ts = project _TarjanState _TarjanState_stack @@ ts

tarjanStateOnStack :: TTerm TarjanState -> TTerm (S.Set Vertex)
tarjanStateOnStack ts = project _TarjanState _TarjanState_onStack @@ ts

tarjanStateSccs :: TTerm TarjanState -> TTerm [[Vertex]]
tarjanStateSccs ts = project _TarjanState _TarjanState_sccs @@ ts

tarjanStateWithCounter :: TTerm TarjanState -> TTerm Int -> TTerm TarjanState
tarjanStateWithCounter ts counter = tarjanState
    counter
    (Hydra.Dsl.Topology.tarjanStateIndices ts)
    (Hydra.Dsl.Topology.tarjanStateLowLinks ts)
    (Hydra.Dsl.Topology.tarjanStateStack ts)
    (Hydra.Dsl.Topology.tarjanStateOnStack ts)
    (Hydra.Dsl.Topology.tarjanStateSccs ts)

tarjanStateWithIndices :: TTerm TarjanState -> TTerm (M.Map Vertex Int) -> TTerm TarjanState
tarjanStateWithIndices ts indices = tarjanState
    (Hydra.Dsl.Topology.tarjanStateCounter ts)
    indices
    (Hydra.Dsl.Topology.tarjanStateLowLinks ts)
    (Hydra.Dsl.Topology.tarjanStateStack ts)
    (Hydra.Dsl.Topology.tarjanStateOnStack ts)
    (Hydra.Dsl.Topology.tarjanStateSccs ts)

tarjanStateWithLowLinks :: TTerm TarjanState -> TTerm (M.Map Vertex Int) -> TTerm TarjanState
tarjanStateWithLowLinks ts lowLinks = tarjanState
    (Hydra.Dsl.Topology.tarjanStateCounter ts)
    (Hydra.Dsl.Topology.tarjanStateIndices ts)
    lowLinks
    (Hydra.Dsl.Topology.tarjanStateStack ts)
    (Hydra.Dsl.Topology.tarjanStateOnStack ts)
    (Hydra.Dsl.Topology.tarjanStateSccs ts)

tarjanStateWithStack :: TTerm TarjanState -> TTerm [Vertex] -> TTerm TarjanState
tarjanStateWithStack ts stack = tarjanState
    (Hydra.Dsl.Topology.tarjanStateCounter ts)
    (Hydra.Dsl.Topology.tarjanStateIndices ts)
    (Hydra.Dsl.Topology.tarjanStateLowLinks ts)
    stack
    (Hydra.Dsl.Topology.tarjanStateOnStack ts)
    (Hydra.Dsl.Topology.tarjanStateSccs ts)

tarjanStateWithOnStack :: TTerm TarjanState -> TTerm (S.Set Vertex) -> TTerm TarjanState
tarjanStateWithOnStack ts onStack = tarjanState
    (Hydra.Dsl.Topology.tarjanStateCounter ts)
    (Hydra.Dsl.Topology.tarjanStateIndices ts)
    (Hydra.Dsl.Topology.tarjanStateLowLinks ts)
    (Hydra.Dsl.Topology.tarjanStateStack ts)
    onStack
    (Hydra.Dsl.Topology.tarjanStateSccs ts)

tarjanStateWithSccs :: TTerm TarjanState -> TTerm [[Vertex]] -> TTerm TarjanState
tarjanStateWithSccs ts sccs = tarjanState
    (Hydra.Dsl.Topology.tarjanStateCounter ts)
    (Hydra.Dsl.Topology.tarjanStateIndices ts)
    (Hydra.Dsl.Topology.tarjanStateLowLinks ts)
    (Hydra.Dsl.Topology.tarjanStateStack ts)
    (Hydra.Dsl.Topology.tarjanStateOnStack ts)
    sccs