open import Type open import Function.NP open import Data.Nat open import Data.Product.NP using (_,_) open import Control.Protocol.Core open import Control.Protocol.Sequence module Control.Protocol.ClientServer (Query : ★₀) (Resp : Query → ★₀) where ClientRound ServerRound : Proto ClientRound = send λ (q : Query) → recv λ (r : Resp q) → end ServerRound = dual ClientRound Client Server : ℕ → Proto Client n = replicateᴾ n ClientRound Server = dual ∘ Client DynamicServer StaticServer : Proto DynamicServer = recv λ n → Server n StaticServer = send λ n → Server n module PureServer (serve : Π Query Resp) where server : ∀ n → ⟦ Server n ⟧ server zero = _ server (suc n) q = serve q , server n