{-# OPTIONS --without-K #-}
module FunUniverse.Types where

open import Type hiding ()
open import Data.Nat.NP using ()
open import Level.NP
open import Function

open import FunUniverse.Data

record FunUniverse {t} (T :  t) :  ( t) where
  constructor _,_
  field
    universe : Universe T
    _`→_     : T  T  ★₀

  infix 0 _`→_
  open Universe universe public

  `𝟙→_ : T  ★₀
  `𝟙→ A = `𝟙 `→ A

  `𝟚→_ : T  ★₀
  `𝟚→ A = `𝟚 `→ A

  _`→𝟙 : T  ★₀
  A `→𝟙 = A `→ `𝟙

  _`→𝟚 : T  ★₀
  A `→𝟚 = A `→ `𝟚

  _`→ᵇ_ :     ★₀
  i `→ᵇ o = `Bits i `→ `Bits o

  `Endo : T  ★₀
  `Endo A = A `→ A

module OpFunU {t} {T : Set t} (funU : FunUniverse T) where
  open FunUniverse funU
  opFunU : FunUniverse T
  opFunU = universe , flip _`→_