packages feed

typed-session-state-algorithm-0.2.0.0: test/Main.hs

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeApplications #-}

module Main (main) where

import Text.RawString.QQ (r)
import TypedSession.State.Parser (runProtocolParser)
import TypedSession.State.Pipeline (genGraph, pipleWithTracer)
import TypedSession.State.Render (StrFillEnv (StrFillEnv))

main :: IO ()
main = putStrLn "Test suite not yet implemented."

data PingPongRole = Client | Server | Counter
  deriving (Show, Read, Eq, Ord, Enum, Bounded)

data PingPongBranchSt = STrue | SFalse
  deriving (Show, Read, Eq, Ord, Enum, Bounded)

s1 =
  [r|
  
  Label 0
    Branch Client {
      BranchSt STrue
          Msg "AddOne" [] Client Counter
          Msg "Ping" ["Int", "Int", "Int"] Client Server
          Msg "Pong" [] Server Client
          Goto 0
      BranchSt SFalse
          Msg "Stop" [] Client Server
          Msg "CStop" [] Client Counter
          Terminal
    }
|]

r1 = case runProtocolParser @PingPongRole @PingPongBranchSt s1 of
  Left e -> e
  Right a ->
    let (lq, res) = pipleWithTracer a
     in case res of
          Left e -> show e
          Right ppResult -> show lq <> "\n" <> genGraph (StrFillEnv 20 20) ppResult

-- >>> error r1
-- fromList [--------------------Creat-----------------
-- Label () 0
-- [Branch] () Client
--   * BranchSt () STrue
--   Msg <()> AddOne [] Client Counter
--   Msg <()> Ping [Int, Int, Int] Client Server
--   Msg <()> Pong [] Server Client
--   Goto () 0
--   * BranchSt () SFalse
--   Msg <()> Stop [] Client Server
--   Msg <()> CStop [] Client Counter
--   Terminal ()
-- ,--------------------Idx-----------------
-- Label 0 0
-- [Branch] 0 Client
--   * BranchSt () STrue
--   Msg <(1,2,0)> AddOne [] Client Counter
--   Msg <(2,3,1)> Ping [Int, Int, Int] Client Server
--   Msg <(3,4,2)> Pong [] Server Client
--   Goto 4 0
--   * BranchSt () SFalse
--   Msg <(5,6,0)> Stop [] Client Server
--   Msg <(6,7,1)> CStop [] Client Counter
--   Terminal 7
-- ,--------------------ReRank-----------------
-- fromList [(0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7)]
-- ,--------------------Idx-----------------
-- Label 0 0
-- [Branch] 0 Client
--   * BranchSt () STrue
--   Msg <(1,2,0)> AddOne [] Client Counter
--   Msg <(2,3,1)> Ping [Int, Int, Int] Client Server
--   Msg <(3,4,2)> Pong [] Server Client
--   Goto 4 0
--   * BranchSt () SFalse
--   Msg <(5,6,0)> Stop [] Client Server
--   Msg <(6,7,1)> CStop [] Client Counter
--   Terminal 7
-- ,--------------------AddNum-----------------
-- Label [0,1,2] 0
-- [Branch] [0,1,2] Client
--   * BranchSt () STrue
--   Msg <([3,4,5],[6,7,8],0)> AddOne [] Client Counter
--   Msg <([6,7,8],[9,10,11],1)> Ping [Int, Int, Int] Client Server
--   Msg <([9,10,11],[12,13,14],2)> Pong [] Server Client
--   Goto [12,13,14] 0
--   * BranchSt () SFalse
--   Msg <([15,16,17],[18,19,20],0)> Stop [] Client Server
--   Msg <([18,19,20],[21,22,23],1)> CStop [] Client Counter
--   Terminal [21,22,23]
-- ,--------------------GenConst-----------------
-- Label ([0,1,2],0) 0
-- [Branch] [0,1,2] Client
--   * BranchSt () STrue
--   Msg <(([3,4,5],[6,7,8]),(Client,Counter),0)> AddOne [] Client Counter
--   Msg <(([6,7,8],[9,10,11]),(Client,Server),1)> Ping [ Int
--                                                      , Int
--                                                      , Int ] Client Server
--   Msg <(([9,10,11],[12,13,14]),(Server,Client),2)> Pong [] Server Client
--   Goto ([12,13,14],0) 0
--   * BranchSt () SFalse
--   Msg <(([15,16,17],[18,19,20]),(Client,Server),0)> Stop [] Client Server
--   Msg <(([18,19,20],[21,22,23]),(Client,Counter),1)> CStop [] Client Counter
--   Terminal [21,22,23]
-- ,--------------------Constrains-----------------
-- fromList [Constraint 1 4,Constraint 2 5,Constraint 3 5,Constraint 4 7,Constraint 6 7,Constraint 8 11,Constraint 10 9,Constraint 11 14,Constraint 12 0,Constraint 13 1,Constraint 14 2,Constraint 1 16,Constraint 2 17,Constraint 15 16,Constraint 17 20,Constraint 18 20,Constraint 19 22,Constraint 21 (-1),Constraint 22 (-1),Constraint 23 (-1)]
-- ,--------------------SubMap-----------------
-- fromList [(3,2),(4,1),(5,2),(6,1),(7,1),(8,2),(9,3),(10,3),(11,2),(12,0),(13,1),(14,2),(15,1),(16,1),(17,2),(18,2),(19,-1),(20,2),(21,-1),(22,-1),(23,-1)]
-- ,--------------------GenConstN-----------------
-- Label ([0,1,2],0) 0
-- [Branch] [0,1,2] Client
--   * BranchSt () STrue
--   Msg <(([2,1,2],[1,1,2]),(Client,Counter),0)> AddOne [] Client Counter
--   Msg <(([1,1,2],[3,3,2]),(Client,Server),1)> Ping [Int, Int, Int] Client Server
--   Msg <(([3,3,2],[0,1,2]),(Server,Client),2)> Pong [] Server Client
--   Goto ([0,1,2],0) 0
--   * BranchSt () SFalse
--   Msg <(([1,1,2],[2,-1,2]),(Client,Server),0)> Stop [] Client Server
--   Msg <(([2,-1,2],[-1,-1,-1]),(Client,Counter),1)> CStop [] Client Counter
--   Terminal [-1,-1,-1]
-- ,--------------------VerifyResult Map-----------------
-- fromList [(1,(Client,Server)),(2,(Client,Counter)),(3,(Server,Client))]
-- ,--------------------CollectBranchDynVal-----------------
-- fromList [1,2]
-- ,--------------------MsgT-----------------
-- Label ([S0,S1 s,S2 s],0) 0
-- [Branch] [S0,S1 s,S2 s] Client
--   * BranchSt () STrue
--   Msg <([S2 STrue,S1 s,S2 s],(Client,Counter),0)> AddOne [] Client Counter
--   Msg <([S1 STrue,S1 s,S2 s],(Client,Server),1)> Ping [ Int
--                                                       , Int
--                                                       , Int ] Client Server
--   Msg <([S3,S3,S2 s],(Server,Client),2)> Pong [] Server Client
--   Goto ([S0,S1 s,S2 s],0) 0
--   * BranchSt () SFalse
--   Msg <([S1 SFalse,S1 s,S2 s],(Client,Server),0)> Stop [] Client Server
--   Msg <([S2 SFalse,End,S2 s],(Client,Counter),1)> CStop [] Client Counter
--   Terminal [End,End,End]
-- ,--------------------MsgT1-----------------
-- Label ([S0,S1 s,S2 s],0) 0
-- [Branch] [S0,S1 s,S2 s] Client
--   * BranchSt () STrue
--   Msg <((S2 STrue,S1 STrue,S2 s),(Client,Counter),0)> AddOne [] Client Counter
--   Msg <((S1 STrue,S3,S3),(Client,Server),1)> Ping [Int, Int, Int] Client Server
--   Msg <((S3,S1 s,S0),(Server,Client),2)> Pong [] Server Client
--   Goto ([S0,S1 s,S2 s],0) 0
--   * BranchSt () SFalse
--   Msg <((S1 SFalse,S2 SFalse,End),(Client,Server),0)> Stop [] Client Server
--   Msg <((S2 SFalse,End,End),(Client,Counter),1)> CStop [] Client Counter
--   Terminal [End,End,End]
-- ]
-- -------------------------------------Client--------------Server-------------Counter
-- LABEL 0                                S0                 S1 s                S2 s
--   [Branch Client]                      S0                 S1 s                S2 s
--     AddOne                        {S2 STrue}->            S1 s               ->S2 s
--       Ping                         S1 STrue->            ->S1 s               S2 s
--       Pong                            S3<-                <-S3                S2 s
--       Goto 0                           S0                 S1 s                S2 s
--     Stop                         {S1 SFalse}->           ->S1 s               S2 s
--       CStop                       S2 SFalse->             End                ->S2 s
--       Terminal                        End                 End                 End

data Role
  = Buyer
  | Seller
  | Buyer2
  deriving (Show, Eq, Ord, Enum, Bounded)

data BookBranchSt
  = NotFound
  | Found
  | One
  | Two
  | Support
  | NotSupport
  | Enough
  | NotEnough
  deriving (Show, Eq, Ord, Enum, Bounded)

s2 =
  [r|
  Label 0
    Msg "Title" ["String"] Buyer Seller
    Branch Seller {
      BranchSt Found 
        Msg "Price" ["Int"] Seller Buyer
        Branch Buyer {
          BranchSt Two 
            Msg "PriceToBuyer2" ["Int"] Buyer Buyer2
            Branch Buyer2 {
              BranchSt NotSupport 
                Msg "NotSupport1" [] Buyer2 Buyer
                Msg "TwoNotBuy" [] Buyer Seller
                Goto 0
              BranchSt Support 
                Msg "SupportVal" ["Int"] Buyer2 Buyer
                Branch Buyer {
                  BranchSt Enough 
                    Msg "TwoAccept" [] Buyer Seller
                    Msg "TwoDate" ["Int"] Seller Buyer
                    Msg "TwoSuccess" ["Int"] Buyer Buyer2
                    Goto 0
                  BranchSt NotEnough 
                    Msg "TwoNotBuy1" [] Buyer Seller
                    Msg "TwoFailed" [] Buyer Buyer2
                    Terminal
                  }
              }
          BranchSt One 
            Msg "OneAccept" [] Buyer Seller
            Msg "OneDate" ["Int"] Seller Buyer
            Msg "OneSuccess" ["Int"] Buyer Buyer2
            Goto 0
          }
      BranchSt NotFound 
        Msg "NoBook" [] Seller Buyer
             Msg "SellerNoBook" [] Buyer Buyer2
             Goto 0
      }
|]

r2 = case runProtocolParser @Role @BookBranchSt s2 of
  Left e -> e
  Right a ->
    let (seqList, res) = pipleWithTracer a
     in case res of
          Left e -> show e
          Right ppResult ->
            let st = show seqList
             in st <> "\n" <> genGraph (StrFillEnv 20 20) ppResult

-- >>> error r2
-- fromList [--------------------Creat-----------------
-- Label () 0
-- Msg <()> Title [String] Buyer Seller
-- [Branch] () Seller
--   * BranchSt () Found
--   Msg <()> Price [Int] Seller Buyer
--   [Branch] () Buyer
--     * BranchSt () Two
--     Msg <()> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] () Buyer2
--       * BranchSt () NotSupport
--       Msg <()> NotSupport1 [] Buyer2 Buyer
--       Msg <()> TwoNotBuy [] Buyer Seller
--       Goto () 0
--       * BranchSt () Support
--       Msg <()> SupportVal [Int] Buyer2 Buyer
--       [Branch] () Buyer
--         * BranchSt () Enough
--         Msg <()> TwoAccept [] Buyer Seller
--         Msg <()> TwoDate [Int] Seller Buyer
--         Msg <()> TwoSuccess [Int] Buyer Buyer2
--         Goto () 0
--         * BranchSt () NotEnough
--         Msg <()> TwoNotBuy1 [] Buyer Seller
--         Msg <()> TwoFailed [] Buyer Buyer2
--         Terminal ()
--     * BranchSt () One
--     Msg <()> OneAccept [] Buyer Seller
--     Msg <()> OneDate [Int] Seller Buyer
--     Msg <()> OneSuccess [Int] Buyer Buyer2
--     Goto () 0
--   * BranchSt () NotFound
--   Msg <()> NoBook [] Seller Buyer
--   Msg <()> SellerNoBook [] Buyer Buyer2
--   Goto () 0
-- ,--------------------Idx-----------------
-- Label 0 0
-- Msg <(0,1,100)> Title [String] Buyer Seller
-- [Branch] 1 Seller
--   * BranchSt () Found
--   Msg <(2,3,0)> Price [Int] Seller Buyer
--   [Branch] 3 Buyer
--     * BranchSt () Two
--     Msg <(4,5,0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] 5 Buyer2
--       * BranchSt () NotSupport
--       Msg <(6,7,0)> NotSupport1 [] Buyer2 Buyer
--       Msg <(7,8,1)> TwoNotBuy [] Buyer Seller
--       Goto 8 0
--       * BranchSt () Support
--       Msg <(9,10,0)> SupportVal [Int] Buyer2 Buyer
--       [Branch] 10 Buyer
--         * BranchSt () Enough
--         Msg <(11,12,0)> TwoAccept [] Buyer Seller
--         Msg <(12,13,1)> TwoDate [Int] Seller Buyer
--         Msg <(13,14,2)> TwoSuccess [Int] Buyer Buyer2
--         Goto 14 0
--         * BranchSt () NotEnough
--         Msg <(15,16,0)> TwoNotBuy1 [] Buyer Seller
--         Msg <(16,17,1)> TwoFailed [] Buyer Buyer2
--         Terminal 17
--     * BranchSt () One
--     Msg <(18,19,0)> OneAccept [] Buyer Seller
--     Msg <(19,20,1)> OneDate [Int] Seller Buyer
--     Msg <(20,21,2)> OneSuccess [Int] Buyer Buyer2
--     Goto 21 0
--   * BranchSt () NotFound
--   Msg <(22,23,0)> NoBook [] Seller Buyer
--   Msg <(23,24,1)> SellerNoBook [] Buyer Buyer2
--   Goto 24 0
-- ,--------------------ReRank-----------------
-- fromList [(0,0),(1,1),(2,5),(3,2),(4,6),(5,3),(6,7),(7,8),(8,9),(9,10),(10,4),(11,11),(12,12),(13,13),(14,14),(15,15),(16,16),(17,17),(18,18),(19,19),(20,20),(21,21),(22,22),(23,23),(24,24)]
-- ,--------------------Idx-----------------
-- Label 0 0
-- Msg <(0,1,100)> Title [String] Buyer Seller
-- [Branch] 1 Seller
--   * BranchSt () Found
--   Msg <(5,2,0)> Price [Int] Seller Buyer
--   [Branch] 2 Buyer
--     * BranchSt () Two
--     Msg <(6,3,0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] 3 Buyer2
--       * BranchSt () NotSupport
--       Msg <(7,8,0)> NotSupport1 [] Buyer2 Buyer
--       Msg <(8,9,1)> TwoNotBuy [] Buyer Seller
--       Goto 9 0
--       * BranchSt () Support
--       Msg <(10,4,0)> SupportVal [Int] Buyer2 Buyer
--       [Branch] 4 Buyer
--         * BranchSt () Enough
--         Msg <(11,12,0)> TwoAccept [] Buyer Seller
--         Msg <(12,13,1)> TwoDate [Int] Seller Buyer
--         Msg <(13,14,2)> TwoSuccess [Int] Buyer Buyer2
--         Goto 14 0
--         * BranchSt () NotEnough
--         Msg <(15,16,0)> TwoNotBuy1 [] Buyer Seller
--         Msg <(16,17,1)> TwoFailed [] Buyer Buyer2
--         Terminal 17
--     * BranchSt () One
--     Msg <(18,19,0)> OneAccept [] Buyer Seller
--     Msg <(19,20,1)> OneDate [Int] Seller Buyer
--     Msg <(20,21,2)> OneSuccess [Int] Buyer Buyer2
--     Goto 21 0
--   * BranchSt () NotFound
--   Msg <(22,23,0)> NoBook [] Seller Buyer
--   Msg <(23,24,1)> SellerNoBook [] Buyer Buyer2
--   Goto 24 0
-- ,--------------------AddNum-----------------
-- Label [0,1,2] 0
-- Msg <([0,1,2],[3,4,5],100)> Title [String] Buyer Seller
-- [Branch] [3,4,5] Seller
--   * BranchSt () Found
--   Msg <([15,16,17],[6,7,8],0)> Price [Int] Seller Buyer
--   [Branch] [6,7,8] Buyer
--     * BranchSt () Two
--     Msg <([18,19,20],[9,10,11],0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] [9,10,11] Buyer2
--       * BranchSt () NotSupport
--       Msg <([21,22,23],[24,25,26],0)> NotSupport1 [] Buyer2 Buyer
--       Msg <([24,25,26],[27,28,29],1)> TwoNotBuy [] Buyer Seller
--       Goto [27,28,29] 0
--       * BranchSt () Support
--       Msg <([30,31,32],[12,13,14],0)> SupportVal [Int] Buyer2 Buyer
--       [Branch] [12,13,14] Buyer
--         * BranchSt () Enough
--         Msg <([33,34,35],[36,37,38],0)> TwoAccept [] Buyer Seller
--         Msg <([36,37,38],[39,40,41],1)> TwoDate [Int] Seller Buyer
--         Msg <([39,40,41],[42,43,44],2)> TwoSuccess [Int] Buyer Buyer2
--         Goto [42,43,44] 0
--         * BranchSt () NotEnough
--         Msg <([45,46,47],[48,49,50],0)> TwoNotBuy1 [] Buyer Seller
--         Msg <([48,49,50],[51,52,53],1)> TwoFailed [] Buyer Buyer2
--         Terminal [51,52,53]
--     * BranchSt () One
--     Msg <([54,55,56],[57,58,59],0)> OneAccept [] Buyer Seller
--     Msg <([57,58,59],[60,61,62],1)> OneDate [Int] Seller Buyer
--     Msg <([60,61,62],[63,64,65],2)> OneSuccess [Int] Buyer Buyer2
--     Goto [63,64,65] 0
--   * BranchSt () NotFound
--   Msg <([66,67,68],[69,70,71],0)> NoBook [] Seller Buyer
--   Msg <([69,70,71],[72,73,74],1)> SellerNoBook [] Buyer Buyer2
--   Goto [72,73,74] 0
-- ,--------------------GenConst-----------------
-- Label ([0,1,2],0) 0
-- Msg <(([0,1,2],[3,4,5]),(Buyer,Seller),100)> Title [String] Buyer Seller
-- [Branch] [3,4,5] Seller
--   * BranchSt () Found
--   Msg <(([15,16,17],[6,7,8]),(Seller,Buyer),0)> Price [Int] Seller Buyer
--   [Branch] [6,7,8] Buyer
--     * BranchSt () Two
--     Msg <(([18,19,20],[9,10,11]),(Buyer,Buyer2),0)> PriceToBuyer2 [ Int ] Buyer Buyer2
--     [Branch] [9,10,11] Buyer2
--       * BranchSt () NotSupport
--       Msg <(([21,22,23],[24,25,26]),(Buyer2,Buyer),0)> NotSupport1 [  ] Buyer2 Buyer
--       Msg <(([24,25,26],[27,28,29]),(Buyer,Seller),1)> TwoNotBuy [] Buyer Seller
--       Goto ([27,28,29],0) 0
--       * BranchSt () Support
--       Msg <(([30,31,32],[12,13,14]),(Buyer2,Buyer),0)> SupportVal [ Int ] Buyer2 Buyer
--       [Branch] [12,13,14] Buyer
--         * BranchSt () Enough
--         Msg <(([33,34,35],[36,37,38]),(Buyer,Seller),0)> TwoAccept [  ] Buyer Seller
--         Msg <(([36,37,38],[39,40,41]),(Seller,Buyer),1)> TwoDate [ Int ] Seller Buyer
--         Msg <(([39,40,41],[42,43,44]),(Buyer,Buyer2),2)> TwoSuccess [ Int ] Buyer Buyer2
--         Goto ([42,43,44],0) 0
--         * BranchSt () NotEnough
--         Msg <(([45,46,47],[48,49,50]),(Buyer,Seller),0)> TwoNotBuy1 [  ] Buyer Seller
--         Msg <(([48,49,50],[51,52,53]),(Buyer,Buyer2),1)> TwoFailed [  ] Buyer Buyer2
--         Terminal [51,52,53]
--     * BranchSt () One
--     Msg <(([54,55,56],[57,58,59]),(Buyer,Seller),0)> OneAccept [] Buyer Seller
--     Msg <(([57,58,59],[60,61,62]),(Seller,Buyer),1)> OneDate [Int] Seller Buyer
--     Msg <(([60,61,62],[63,64,65]),(Buyer,Buyer2),2)> OneSuccess [ Int ] Buyer Buyer2
--     Goto ([63,64,65],0) 0
--   * BranchSt () NotFound
--   Msg <(([66,67,68],[69,70,71]),(Seller,Buyer),0)> NoBook [] Seller Buyer
--   Msg <(([69,70,71],[72,73,74]),(Buyer,Buyer2),1)> SellerNoBook [] Buyer Buyer2
--   Goto ([72,73,74],0) 0
-- ,--------------------Constrains-----------------
-- fromList [Constraint 0 1,Constraint 2 5,Constraint 3 15,Constraint 5 17,Constraint 16 15,Constraint 17 8,Constraint 7 19,Constraint 8 20,Constraint 18 20,Constraint 19 10,Constraint 9 21,Constraint 10 22,Constraint 23 21,Constraint 22 25,Constraint 24 25,Constraint 26 29,Constraint 27 0,Constraint 28 1,Constraint 29 2,Constraint 9 30,Constraint 10 31,Constraint 32 30,Constraint 31 13,Constraint 13 34,Constraint 14 35,Constraint 33 34,Constraint 35 38,Constraint 37 36,Constraint 38 41,Constraint 39 41,Constraint 40 43,Constraint 42 0,Constraint 43 1,Constraint 44 2,Constraint 13 46,Constraint 14 47,Constraint 45 46,Constraint 47 50,Constraint 48 50,Constraint 49 52,Constraint 51 (-1),Constraint 52 (-1),Constraint 53 (-1),Constraint 7 55,Constraint 8 56,Constraint 54 55,Constraint 56 59,Constraint 58 57,Constraint 59 62,Constraint 60 62,Constraint 61 64,Constraint 63 0,Constraint 64 1,Constraint 65 2,Constraint 3 66,Constraint 5 68,Constraint 67 66,Constraint 68 71,Constraint 69 71,Constraint 70 73,Constraint 72 0,Constraint 73 1,Constraint 74 2]
-- ,--------------------SubMap-----------------
-- fromList [(1,0),(2,1),(3,2),(4,3),(5,1),(6,4),(7,5),(8,1),(9,6),(10,5),(11,7),(12,8),(13,5),(14,9),(15,2),(16,2),(17,1),(18,1),(19,5),(20,1),(21,6),(22,5),(23,6),(24,5),(25,5),(26,1),(27,0),(28,0),(29,1),(30,6),(31,5),(32,6),(33,5),(34,5),(35,9),(36,10),(37,10),(38,9),(39,9),(40,0),(41,9),(42,0),(43,0),(44,1),(45,5),(46,5),(47,9),(48,9),(49,-1),(50,9),(51,-1),(52,-1),(53,-1),(54,5),(55,5),(56,1),(57,11),(58,11),(59,1),(60,1),(61,0),(62,1),(63,0),(64,0),(65,1),(66,2),(67,2),(68,1),(69,1),(70,0),(71,1),(72,0),(73,0),(74,1)]
-- ,--------------------GenConstN-----------------
-- Label ([0,0,1],0) 0
-- Msg <(([0,0,1],[2,3,1]),(Buyer,Seller),100)> Title [String] Buyer Seller
-- [Branch] [2,3,1] Seller
--   * BranchSt () Found
--   Msg <(([2,2,1],[4,5,1]),(Seller,Buyer),0)> Price [Int] Seller Buyer
--   [Branch] [4,5,1] Buyer
--     * BranchSt () Two
--     Msg <(([1,5,1],[6,5,7]),(Buyer,Buyer2),0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] [6,5,7] Buyer2
--       * BranchSt () NotSupport
--       Msg <(([6,5,6],[5,5,1]),(Buyer2,Buyer),0)> NotSupport1 [] Buyer2 Buyer
--       Msg <(([5,5,1],[0,0,1]),(Buyer,Seller),1)> TwoNotBuy [] Buyer Seller
--       Goto ([0,0,1],0) 0
--       * BranchSt () Support
--       Msg <(([6,5,6],[8,5,9]),(Buyer2,Buyer),0)> SupportVal [Int] Buyer2 Buyer
--       [Branch] [8,5,9] Buyer
--         * BranchSt () Enough
--         Msg <(([5,5,9],[10,10,9]),(Buyer,Seller),0)> TwoAccept [] Buyer Seller
--         Msg <(([10,10,9],[9,0,9]),(Seller,Buyer),1)> TwoDate [Int] Seller Buyer
--         Msg <(([9,0,9],[0,0,1]),(Buyer,Buyer2),2)> TwoSuccess [Int] Buyer Buyer2
--         Goto ([0,0,1],0) 0
--         * BranchSt () NotEnough
--         Msg <(([5,5,9],[9,-1,9]),(Buyer,Seller),0)> TwoNotBuy1 [] Buyer Seller
--         Msg <(([9,-1,9],[-1,-1,-1]),(Buyer,Buyer2),1)> TwoFailed [] Buyer Buyer2
--         Terminal [-1,-1,-1]
--     * BranchSt () One
--     Msg <(([5,5,1],[11,11,1]),(Buyer,Seller),0)> OneAccept [] Buyer Seller
--     Msg <(([11,11,1],[1,0,1]),(Seller,Buyer),1)> OneDate [Int] Seller Buyer
--     Msg <(([1,0,1],[0,0,1]),(Buyer,Buyer2),2)> OneSuccess [Int] Buyer Buyer2
--     Goto ([0,0,1],0) 0
--   * BranchSt () NotFound
--   Msg <(([2,2,1],[1,0,1]),(Seller,Buyer),0)> NoBook [] Seller Buyer
--   Msg <(([1,0,1],[0,0,1]),(Buyer,Buyer2),1)> SellerNoBook [] Buyer Buyer2
--   Goto ([0,0,1],0) 0
-- ,--------------------VerifyResult Map-----------------
-- fromList [(0,(Buyer,Seller)),(1,(Buyer,Buyer2)),(2,(Seller,Buyer)),(5,(Buyer,Seller)),(6,(Buyer2,Buyer)),(9,(Buyer,Buyer2)),(10,(Seller,Buyer)),(11,(Seller,Buyer))]
-- ,--------------------CollectBranchDynVal-----------------
-- fromList [1,2,5,6,9]
-- ,--------------------MsgT-----------------
-- Label ([S0,S0,S1 s],0) 0
-- Msg <([S0,S0,S1 s],(Buyer,Seller),100)> Title [String] Buyer Seller
-- [Branch] [S2 s,S3,S1 s] Seller
--   * BranchSt () Found
--   Msg <([S2 s,S2 Found,S1 s],(Seller,Buyer),0)> Price [Int] Seller Buyer
--   [Branch] [S4,S5 s,S1 s] Buyer
--     * BranchSt () Two
--     Msg <([S1 Two,S5 s,S1 s],(Buyer,Buyer2),0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] [S6 s,S5 s,S7] Buyer2
--       * BranchSt () NotSupport
--       Msg <([S6 s,S5 s,S6 NotSupport],(Buyer2,Buyer),0)> NotSupport1 [  ] Buyer2 Buyer
--       Msg <([S5 NotSupport,S5 s,S1 s],(Buyer,Seller),1)> TwoNotBuy [  ] Buyer Seller
--       Goto ([S0,S0,S1 s],0) 0
--       * BranchSt () Support
--       Msg <([S6 s,S5 s,S6 Support],(Buyer2,Buyer),0)> SupportVal [ Int ] Buyer2 Buyer
--       [Branch] [S8,S5 s,S9 s] Buyer
--         * BranchSt () Enough
--         Msg <([S5 Enough,S5 s,S9 s],(Buyer,Seller),0)> TwoAccept [] Buyer Seller
--         Msg <([S10,S10,S9 s],(Seller,Buyer),1)> TwoDate [Int] Seller Buyer
--         Msg <([S9 Enough,S0,S9 s],(Buyer,Buyer2),2)> TwoSuccess [ Int ] Buyer Buyer2
--         Goto ([S0,S0,S1 s],0) 0
--         * BranchSt () NotEnough
--         Msg <([S5 NotEnough,S5 s,S9 s],(Buyer,Seller),0)> TwoNotBuy1 [  ] Buyer Seller
--         Msg <([S9 NotEnough,End,S9 s],(Buyer,Buyer2),1)> TwoFailed [  ] Buyer Buyer2
--         Terminal [End,End,End]
--     * BranchSt () One
--     Msg <([S5 One,S5 s,S1 s],(Buyer,Seller),0)> OneAccept [] Buyer Seller
--     Msg <([S11,S11,S1 s],(Seller,Buyer),1)> OneDate [Int] Seller Buyer
--     Msg <([S1 One,S0,S1 s],(Buyer,Buyer2),2)> OneSuccess [Int] Buyer Buyer2
--     Goto ([S0,S0,S1 s],0) 0
--   * BranchSt () NotFound
--   Msg <([S2 s,S2 NotFound,S1 s],(Seller,Buyer),0)> NoBook [] Seller Buyer
--   Msg <([S1 NotFound,S0,S1 s],(Buyer,Buyer2),1)> SellerNoBook [] Buyer Buyer2
--   Goto ([S0,S0,S1 s],0) 0
-- ,--------------------MsgT1-----------------
-- Label ([S0,S0,S1 s],0) 0
-- Msg <((S0,S2 s,S3),(Buyer,Seller),100)> Title [String] Buyer Seller
-- [Branch] [S2 s,S3,S1 s] Seller
--   * BranchSt () Found
--   Msg <((S2 Found,S5 s,S4),(Seller,Buyer),0)> Price [Int] Seller Buyer
--   [Branch] [S4,S5 s,S1 s] Buyer
--     * BranchSt () Two
--     Msg <((S1 Two,S6 s,S7),(Buyer,Buyer2),0)> PriceToBuyer2 [Int] Buyer Buyer2
--     [Branch] [S6 s,S5 s,S7] Buyer2
--       * BranchSt () NotSupport
--       Msg <((S6 NotSupport,S1 s,S5 NotSupport),(Buyer2,Buyer),0)> NotSupport1 [  ] Buyer2 Buyer
--       Msg <((S5 NotSupport,S0,S0),(Buyer,Seller),1)> TwoNotBuy [] Buyer Seller
--       Goto ([S0,S0,S1 s],0) 0
--       * BranchSt () Support
--       Msg <((S6 Support,S9 s,S8),(Buyer2,Buyer),0)> SupportVal [ Int ] Buyer2 Buyer
--       [Branch] [S8,S5 s,S9 s] Buyer
--         * BranchSt () Enough
--         Msg <((S5 Enough,S10,S10),(Buyer,Seller),0)> TwoAccept [] Buyer Seller
--         Msg <((S10,S0,S9 Enough),(Seller,Buyer),1)> TwoDate [Int] Seller Buyer
--         Msg <((S9 Enough,S0,S1 s),(Buyer,Buyer2),2)> TwoSuccess [ Int ] Buyer Buyer2
--         Goto ([S0,S0,S1 s],0) 0
--         * BranchSt () NotEnough
--         Msg <((S5 NotEnough,S9 NotEnough,End),(Buyer,Seller),0)> TwoNotBuy1 [  ] Buyer Seller
--         Msg <((S9 NotEnough,End,End),(Buyer,Buyer2),1)> TwoFailed [  ] Buyer Buyer2
--         Terminal [End,End,End]
--     * BranchSt () One
--     Msg <((S5 One,S11,S11),(Buyer,Seller),0)> OneAccept [] Buyer Seller
--     Msg <((S11,S0,S1 One),(Seller,Buyer),1)> OneDate [Int] Seller Buyer
--     Msg <((S1 One,S0,S1 s),(Buyer,Buyer2),2)> OneSuccess [Int] Buyer Buyer2
--     Goto ([S0,S0,S1 s],0) 0
--   * BranchSt () NotFound
--   Msg <((S2 NotFound,S0,S1 NotFound),(Seller,Buyer),0)> NoBook [] Seller Buyer
--   Msg <((S1 NotFound,S0,S1 s),(Buyer,Buyer2),1)> SellerNoBook [] Buyer Buyer2
--   Goto ([S0,S0,S1 s],0) 0
-- ]
-- -------------------------------------Buyer---------------Seller--------------Buyer2
-- LABEL 0                                S0                  S0                 S1 s
--   Title                               S0->                ->S0                S1 s
--   [Branch Seller]                     S2 s                 S3                 S1 s
--     Price                            S2 s<-           <-{S2 Found}            S1 s
--       [Branch Buyer]                   S4                 S5 s                S1 s
--         PriceToBuyer2              {S1 Two}->             S5 s               ->S1 s
--           [Branch Buyer2]             S6 s                S5 s                 S7
--             NotSupport1              S6 s<-               S5 s         <-{S6 NotSupport}
--               TwoNotBuy         S5 NotSupport->          ->S5 s               S1 s
--               Goto 0                   S0                  S0                 S1 s
--             SupportVal               S6 s<-               S5 s           <-{S6 Support}
--               [Branch Buyer]           S8                 S5 s                S9 s
--                 TwoAccept        {S5 Enough}->           ->S5 s               S9 s
--                   TwoDate            S10<-               <-S10                S9 s
--                   TwoSuccess      S9 Enough->              S0                ->S9 s
--                   Goto 0               S0                  S0                 S1 s
--                 TwoNotBuy1      {S5 NotEnough}->         ->S5 s               S9 s
--                   TwoFailed      S9 NotEnough->           End                ->S9 s
--                   Terminal            End                 End                 End
--         OneAccept                  {S5 One}->            ->S5 s               S1 s
--           OneDate                    S11<-               <-S11                S1 s
--           OneSuccess                S1 One->               S0                ->S1 s
--           Goto 0                       S0                  S0                 S1 s
--     NoBook                           S2 s<-         <-{S2 NotFound}           S1 s
--       SellerNoBook               S1 NotFound->             S0                ->S1 s
--       Goto 0                           S0                  S0                 S1 s