{-# OPTIONS --without-K #-}
open import FunUniverse.Core
open import Data.Nat.NP
open import Data.Bits
module FunUniverse.Interface.Bits
         {t} {T : Set t} (funU : FunUniverse T) where
open FunUniverse funU

record FunBits : Set t where
  field
    <0∷_> :  {n A}  (A `→ `Bits n)  A `→ `Bits (1 + n)

    <1∷_> :  {n A}  (A `→ `Bits n)  A `→ `Bits (1 + n)

    constBits :  {n _⊤}  Bits n  _⊤ `→ `Bits n

    <0ⁿ> :  {n _⊤}  _⊤ `→ `Bits n

    <1ⁿ> :  {n _⊤}  _⊤ `→ `Bits n

    constBits′′ :  {n _⊤}  Bits n  _⊤ `→ `Bits n

    exploreBits :  {n A}  (A  A `→ A)  (`Bits n `→ A)  `𝟙 `→ A

    {-
    findBits? : ∀ {n A} → (`Bits n `→? A) → `𝟙 `→? A

    findBits𝟚 : ∀ {n} → (`Bits n `→ `Bit) → `𝟙 `→? `Bits n

    fromTree : ∀ {n A} → Tree (`𝟙 `→ A) n → `Bits n `→ A
    -}

    fromFun :  {n A}  (Bits n  `𝟙 `→ A)  `Bits n `→ A

    fromBitsFun :  {i o}  (i →ᵇ o)  i `→ᵇ o

    <==> :  {n}  `Bits n  `Bits n `→ `Bit

    <⊕> :  {n}  `Bits n  `Bits n `→ `Bits n

    --vnot : ∀ {n} → `Endo (`Bits n)

    --sucBCarry : ∀ {n} → `Bits n `→ `Bits (1 + n)

    --sucB : ∀ {n} → `Bits n `→ `Bits n