2013-2014 Matteo Acerbi

Simple examples

module Session.Examples.Misc where
open import Session

Abstract examples

module Basic (M : Set  Set)(η :  {X}  X  M X)
             (A : Entry)(B :   ) where

  a : []  (»» (A  B))  A [ M   ]> []  »» B
  a = send Z| Z| »= λ _   η _

  b : []  (A  B) ««  A [ M   ]> []  B ««
  b = send Z| Z| »= λ _   η _

  c : []  »» (A  B) [ M   ]> []  »» B  A
  c = receive Z| »= λ _   η _

Basic communication

module Ex1 (M : Set  Set)(η :  {X}  X  M X) where

  ex1 : [] [ M   ]> []
  ex1 = new⊤
      » fork ([]  -+) (  write Z| 42
                        » end   Z|   )
      » _ <- read Z|
       end Z|
open IO
open import Control.Concurrent
open import Unit as U
open import Data.String

open Ex1 IO return

Basic communication, with IO actions

ex2 : IOProc _
ex2 = new⊤
    »  putStrLn « "A channel was created!" »
    » fork ([]  -+) (   putStrLn « "Child has started" »
                      »  threadDelay onesec
                      » write Z| "Message"
                      »  putStrLn « "Child has written" »
                      »  threadDelay onesec
                      » end Z|
                      »  putStrLn « "Child has finished" »
                      »  return tt)
    »  threadDelay onesec
    » s <- read Z|
      putStrLn « "Parent has received \"" ++ s ++ "\"" »
    »  threadDelay onesec
    » end Z|
    »  putStrLn « "Parent has finished" »

Send and receive

ex3 : IOProc 
ex3 =  putStrLn « "Enter 0" »
    » l <- new⊤
     r <- new⊤
     fork ([]  +-  +-) (   putStrLn « "Enter 1" »
                           » write Z| « "1 -> 0" »
                           » send Z| Z|
                           » a <- read Z|
                             putStrLn a
                           »  putStrLn « "Exit 1" »
                           » end Z|)
    » fork ([]  -    +) (  receive Z|
                           »  putStrLn « "Enter 2" »
                           » write Z| « "2 -> 0" »
                           » end Z|
                           » write Z| « "2 -> 1" »
                           »  putStrLn « "Exit 2" »
                           » end Z|)
    » x <- read Z|
     y <- read Z|
      (putStrLn x >> putStrLn y >> putStrLn « "Exit 0" »)
    » end Z|

Main program

main : IO U.<>
main = putStrLn « "*** Ex 1 ***" » >>
       run ex1 []                  >>
       putStrLn « "*** Ex 2 ***" » >>
       run ex2 []                  >>
       putStrLn « "*** Ex 3 ***" » >>
       run ex3 []                  >>
       threadDelay onesec