sessiontypes-0.1.0: test/Test/Program/Normalizable.hs
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
module Test.Program.Normalizable where
import Control.SessionTypes
import Control.SessionTypes.Indexed
left_nested_offer :: MonadSession m => m ('Cap ctx (Off '[Off '[Off '[Eps], Eps], Eps])) ('Cap ctx Eps) ()
left_nested_offer =
offer (
offer (
offZ eps0
) eps0
) eps0
right_nested_offer :: MonadSession m => m ('Cap ctx (Off '[Eps, Eps, Eps])) ('Cap ctx Eps) ()
right_nested_offer = eps0 <& eps0 <&> eps0
center_nested_offer :: MonadSession m => m ('Cap ctx (Off '[Eps, Off '[Eps], Eps])) ('Cap ctx Eps) ()
center_nested_offer =
eps0
<& offZ eps0
<&> eps0
left_nested_select :: MonadSession m => m ('Cap ctx (Sel '[Sel '[Sel '[Eps], Eps], Eps])) ('Cap ctx Eps) ()
left_nested_select = sel2 >> sel1 >> eps0
right_nested_select :: MonadSession m => m ('Cap ctx (Sel '[Eps, Eps, Eps])) ('Cap ctx Eps) ()
right_nested_select = selN3 >> eps0
center_nested_select :: MonadSession m => m ('Cap ctx (Sel '[Eps, Sel '[Eps], Eps])) ('Cap ctx Eps) ()
center_nested_select = selN3 >> eps0
extra_r_and_wk_after :: MonadSession m => m ('Cap ctx (R (R (Sel '[Wk V, Wk (Wk Eps)])))) ('Cap ctx Eps) ()
extra_r_and_wk_after = recurse $ go 1
where
go 0 = recurseFix $ \_ -> sel2 >> sel1 >> weaken0 >> weaken0 >> eps0
go n = recurseFix $ \_ -> do
sel1
weaken0
var (go $ n - 1)
extra_r_and_wk_before :: MonadSession m => m ('Cap ctx (R (R (Sel '[V, Wk (Wk Eps)])))) ('Cap ctx Eps) ()
extra_r_and_wk_before = recurseFix $ \_ -> recurse $ go 1
where
go 0 = sel2 >> sel1 >> weaken0 >> weaken0 >> eps0
go n = do
sel1
var (go $ n - 1)
simple_recursion :: MonadSession m => m ('Cap ctx (R (Sel '[V, Wk Eps]))) ('Cap ctx Eps) ()
simple_recursion = recurse $ go 1
where
go 0 = selN2 >> weaken0 >> eps0
go n = sel1 >> var (go $ n - 1)