{- | An edge sequence that belongs to no named requirement chapter.
It exercises the same interpreter used by registration and retirement.
-}
module Conformance.Edge.Sequence (story) where

import Conformance.Story.Live
    ( Context (Context)
    , Edge (..)
    , EdgeRequest (..)
    , Story
    , compareWithModel
    , observe
    , submit
    )

story :: Context reg wal -> Story reg wal step obs cmp ()
story :: forall reg wal step obs cmp.
Context reg wal -> Story reg wal step obs cmp ()
story (Context reg
registry wal
holder) = do
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
InsertAbsent String
"sequence-active" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
UpdateActive String
"sequence-active" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
UpdateTerminal String
"sequence-active" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
InsertActive String
"sequence-direct" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
InsertAbsent String
"sequence-absent" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
DeleteAbsent String
"sequence-absent" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
WitnessTerminal String
"sequence-active" wal
holder)
    EdgeRequest wal
-> ProgramT (Step (LiveI reg wal step obs cmp)) Identity ()
forall {wal} {a} {obs} {cmp}.
EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked (Edge -> String -> wal -> EdgeRequest wal
forall wal. Edge -> String -> wal -> EdgeRequest wal
EdgeRequest Edge
DeleteActive String
"sequence-direct" wal
holder)
  where
    checked :: EdgeRequest wal
-> ProgramT (Step (LiveI reg wal a obs cmp)) Identity ()
checked EdgeRequest wal
request = do
        step <- reg -> EdgeRequest wal -> Story reg wal a obs cmp a
forall reg wal step obs cmp.
reg -> EdgeRequest wal -> Story reg wal step obs cmp step
submit reg
registry EdgeRequest wal
request
        observation <- observe step
        _ <- compareWithModel step observation
        pure ()