------------------------------------------------------------------------ -- The Agda standard library -- -- Fixed-size tables of values, implemented as functions from 'Fin n'. -- Similar to 'Data.Vec', but focusing on ease of retrieval instead of -- ease of adding and removing elements. ------------------------------------------------------------------------ module Data.Table where open import Data.Table.Base public open import Data.Bool using (true; false) open import Data.Fin using (Fin; _≟_) import Function.Equality as FE open import Function.Inverse using (Inverse; _↔_) open import Relation.Nullary using (yes; no) open import Relation.Nullary.Decidable using (⌊_⌋) -------------------------------------------------------------------------------- -- Combinators -------------------------------------------------------------------------------- -- Changes the order of elements in the table according to a permutation (i.e. -- an 'Inverse' object on the indices). permute : ∀ {m n a} {A : Set a} → Fin m ↔ Fin n → Table A n → Table A m permute π = rearrange (Inverse.to π FE.⟨$⟩_) -- The result of 'select z i t' takes the value of 'lookup t i' at index 'i', -- and 'z' everywhere else. select : ∀ {n} {a} {A : Set a} → A → Fin n → Table A n → Table A n lookup (select z i t) j with j ≟ i ... | yes _ = lookup t i ... | no _ = z