open import FRP.JS.Nat using ( ℕ ; zero ; suc ) open import FRP.JS.Bool using ( Bool ; true ; false ; _∧_ ) open import FRP.JS.Maybe using ( Maybe ; just ; nothing ) module FRP.JS.List where infixr 4 _∷_ _++_ infixr 2 _≟[_]_ data List {α} (A : Set α) : Set α where [] : List A _∷_ : (a : A) → (as : List A) → List A {-# BUILTIN LIST List #-} {-# BUILTIN NIL [] #-} {-# BUILTIN CONS _∷_ #-} [_] : ∀ {α} {A : Set α} → A → List A [ x ] = x ∷ [] _++_ : ∀ {α} {A : Set α} → List A → List A → List A [] ++ ys = ys (x ∷ xs) ++ ys = x ∷ (xs ++ ys) map : ∀ {α β} {A : Set α} {B : Set β} → (A → B) → List A → List B map f [] = [] map f (x ∷ xs) = f x ∷ map f xs foldr : ∀ {α β} {A : Set α} {B : Set β} → (A → B → B) → B → List A → B foldr c n [] = n foldr c n (x ∷ xs) = c x (foldr c n xs) foldl : ∀ {α β} {A : Set α} {B : Set β} → (A → B → A) → A → List B → A foldl c n [] = n foldl c n (x ∷ xs) = foldl c (c n x) xs buildAppend : ∀ {α} {A : Set α} → List A → (ℕ → A) → ℕ → List A buildAppend as f zero = as buildAppend as f (suc n) = buildAppend (f n ∷ as) f n build : ∀ {α} {A : Set α} → (ℕ → A) → ℕ → List A build = buildAppend [] length : ∀ {α} {A : Set α} → List A → ℕ length = foldr (λ a n → suc n) zero lookup : ∀ {α} {A : Set α} → List A → ℕ → Maybe A lookup [] x = nothing lookup (a ∷ as) zero = just a lookup (a ∷ as) (suc n) = lookup as n _≟[_]_ : ∀ {α β} {A : Set α} {B : Set β} → List A → (A → B → Bool) → List B → Bool [] ≟[ p ] [] = true (a ∷ as) ≟[ p ] (b ∷ bs) = (p a b) ∧ (as ≟[ p ] bs) _ ≟[ p ] _ = false