{-# OPTIONS --safe #-} module Data.Fin where open import Level open import Data.Nat open import Data.Empty open import Data.Maybe private variable n : ℕ Fin : ℕ → Type Fin zero = ⊥ Fin (suc n) = Maybe (Fin n) pattern fzero = nothing pattern fsuc i = just i open import Decidable open import Data.Bool open import Path open import Discrete open import Discrete.IsSet module DiscreteFin where _≡ᴮ_ : Fin n → Fin n → Bool _≡ᴮ_ {n = suc n} fzero fzero = true _≡ᴮ_ {n = suc n} (fsuc x) (fsuc y) = x ≡ᴮ y _≡ᴮ_ {n = suc n} _ _ = false sound : (x y : Fin n) → T (x ≡ᴮ y) → x ≡ y sound {n = suc _} fzero fzero p = refl sound {n = suc _} (fsuc x) (fsuc y) p = cong fsuc (sound x y p) complete : (x : Fin n) → T (x ≡ᴮ x) complete {n = suc _} fzero = _ complete {n = suc _} (fsuc x) = complete x discreteFin : Discrete (Fin n) discreteFin = from-bool-eq record { DiscreteFin } open import HLevels isSetFin : isSet (Fin n) isSetFin = Discrete→isSet discreteFin open import Literals.Number open import Agda.Builtin.Nat renaming (_<_ to _<ᵇ_) open import Data.Bool FinFromℕ : ∀ m n → T (m <ᵇ n) → Fin n FinFromℕ zero (suc n) p = fzero FinFromℕ (suc m) (suc n) p = fsuc (FinFromℕ m n p) instance numberFin : ∀ {n} → Number (Fin n) numberFin {n} = record { Constraint = λ m → T (m <ᵇ n) ; fromNat = λ m {{pr}} → FinFromℕ m n pr } open import Data.Unit _ : Fin 5 _ = 3 _ : Fin 1 _ = 0