{-# OPTIONS --without-K #-}
module FunUniverse.Agda where
open import Type
open import Data.Two using (proj′)
import Data.Vec.NP as V
import Function as F
import Data.Product as ×
open F using (const; _∘′_)
open V using ([]; _∷_)
open × using (_×_; _,_; proj₁; proj₂; uncurry)
open import Data.One using (𝟙)
open import Data.Two using (𝟚)
open import Data.Vec using (Vec)
open import Data.Bit using (0b; 1b)
open import FunUniverse.Data
open import FunUniverse.Category
open import FunUniverse.Rewiring.Linear
open import FunUniverse.Core
-→- : ★ → ★ → ★
-→- A B = A → B
funCat : Category -→-
funCat = F.id , _∘′_
module Abstract𝟚 (some𝟚 : ★) where
private
★-U' : Universe ★₀
★-U' = mk 𝟙 some𝟚 _×_ Vec
agdaFunU : FunUniverse ★
agdaFunU = ★-U' , -→-
module AgdaFunUniverse = FunUniverse agdaFunU
funLin : LinRewiring agdaFunU
funLin = mk funCat
(λ f → ×.map f F.id)
×.swap (λ {((x , y) , z) → x , (y , z) }) (λ x → _ , x) proj₂
(λ f g → ×.map f g) (λ f → ×.map F.id f)
(F.const []) _ (uncurry _∷_) V.uncons
funRewiring : Rewiring agdaFunU
funRewiring = mk funLin _ (λ x → x , x) (F.const []) ×.<_,_> proj₁ proj₂
V.rewire V.rewireTbl
open Abstract𝟚 𝟚 public
funFork : HasFork agdaFunU
funFork = (λ { (b , xy) → proj′ xy b })
, (λ { f g (b , x) → proj′ (f , g) b x })
agdaFunOps : FunOps agdaFunU
agdaFunOps = mk funRewiring funFork (F.const 0b) (F.const 1b)
module AgdaFunOps = FunOps agdaFunOps