{-# OPTIONS --without-K #-} module Composition.Forkable where open import Type hiding (★) open import Level using (_⊔_) record Forkable {s t} {S : ★ s} (1+ : S → S) (_↝_ : S → S → ★ t) : ★ (s ⊔ t) where constructor mk field fork : ∀ {i o} (f g : i ↝ o) → (1+ i) ↝ o open import Data.Product open import Data.Bool funFork : ∀ {s} → Forkable (_×_ Bool) (λ (A B : ★ s) → A → B) funFork {s} = mk fork where fork : ∀ {A B : ★ s} → (f g : A → B) → Bool × A → B fork f g (b , x) = (if b then f else g) x open import Data.Nat using (suc) open import Data.Bits bitsFunFork : Forkable suc _→ᵇ_ bitsFunFork = mk fork where fork : ∀ {i o} → (f g : i →ᵇ o) → suc i →ᵇ o fork f g (b ∷ x) = (if b then f else g) x