{-# OPTIONS --safe #-}
module Data.List where
open import Agda.Builtin.List
using (List; []; _∷_)
public
open import Cubical.Data.List.Properties using (isOfHLevelList) public
open import Level
private
variable
y : A
xs : List A
foldr : (A → B → B) → B → List A → B
foldr f b [] = b
foldr f b (x ∷ xs) = f x (foldr f b xs)
para : (A → List A → B → B) → B → List A → B
para f b [] = b
para f b (x ∷ xs) = f x xs (para f b xs)
open import Data.Nat
length : List A → ℕ
length = foldr (λ _ → suc) zero
open import Data.Bool
null : List A → Bool
null = foldr (λ _ _ → false) true
open import Data.Fin
infixl 6 _!!_
_!!_ : (xs : List A) → Fin (length xs) → A
(x ∷ xs) !! zero = x
(x ∷ xs) !! suc n = xs !! n
private variable n : ℕ
tabulate : (Fin n → A) → List A
tabulate {n = zero} f = []
tabulate {n = suc n} f = f zero ∷ tabulate (λ i → f (suc i))
open import Data.Maybe
infixl 6 _!?_
_!?_ : (xs : List A) → ℕ → Maybe A
[] !? n = nothing
(x ∷ xs) !? zero = just x
(x ∷ xs) !? suc n = xs !? n
open import Data.Sigma
open import Function
infixr 5 _++_
_++_ : List A → List A → List A
_++_ = flip (foldr _∷_)
mapl : (A → B) → List A → List B
mapl f = foldr (_∷_ ∘ f) []
concatMap : (A → List B) → List A → List B
concatMap f = foldr (_++_ ∘ f) []
module ListMonad where
_>>=_ : List A → (A → List B) → List B
_>>=_ = flip concatMap
return : A → List A
return x = x ∷ []
open import Decidable
open import Data.Bool
open import Path
open import Data.Unit
module DiscreteList (_≟_ : Discrete A) where
_≡ᴮ_ : List A → List A → Bool
[] ≡ᴮ [] = true
[] ≡ᴮ (_ ∷ _) = false
(_ ∷ _) ≡ᴮ [] = false
(x ∷ xs) ≡ᴮ (y ∷ ys) = does (x ≟ y) && xs ≡ᴮ ys
sound : (x y : List A) → T (x ≡ᴮ y) → x ≡ y
sound [] [] ps = refl
sound (x ∷ xs) (y ∷ ys) ps with x ≟ y
... | yes p = cong₂ _∷_ p (sound xs ys ps)
complete : (x : List A) → T (x ≡ᴮ x)
complete [] = tt
complete (x ∷ xs) with x ≟ x
... | yes p = complete xs
... | no ¬p = ¬p refl
discreteList : Discrete A → Discrete (List A)
discreteList eq = from-bool-eq record { DiscreteList eq }
tail : List A → List A
tail (_ ∷ xs) = xs
tail [] = []
uncons : List A → Maybe (A × List A)
uncons [] = nothing
uncons (x ∷ xs) = just (x , xs)
++-assoc : (xs ys zs : List A) → (xs ++ ys) ++ zs ≡ xs ++ (ys ++ zs)
++-assoc [] ys zs = refl
++-assoc (x ∷ xs) ys zs = cong (x ∷_) (++-assoc xs ys zs)
++[] : (xs : List A) → xs ++ [] ≡ xs
++[] [] = refl
++[] (x ∷ xs) = cong (x ∷_) (++[] xs)