{-# OPTIONS --no-exact-split --safe #-} module Cubical.Data.Queue.1List where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Function open import Cubical.Foundations.Equiv open import Cubical.Foundations.GroupoidLaws open import Cubical.Foundations.Structure open import Cubical.Structures.Queue open import Cubical.Data.Empty as ⊥ open import Cubical.Data.Maybe open import Cubical.Data.List open import Cubical.Data.Sigma module 1List {ℓ} (A : Type ℓ) (Aset : isSet A) where open Queues-on A Aset Q = List A emp : Q emp = [] enq : A → Q → Q enq = _∷_ deq : Q → Maybe (Q × A) deq [] = nothing deq (x ∷ []) = just ([] , x) deq (x ∷ x' ∷ xs) = deqMap (enq x) (deq (x' ∷ xs)) Raw : RawQueue Raw = (Q , emp , enq , deq) WithLaws : Queue WithLaws = (Q , S , isSetQ , refl , deq-enq , isInjEnq , isInjDeq) where S = str Raw isSetQ : isSet Q isSetQ = isOfHLevelList 0 Aset deq-enq : ∀ a q → deq (enq a q) ≡ just (returnOrEnq S a (deq q)) deq-enq a [] = refl deq-enq a (x ∷ []) = refl deq-enq a (x ∷ x' ∷ xs) = subst (λ t → deqMap (enq a) (deqMap (enq x) t) ≡ just (returnOrEnq S a (deqMap (enq x) t))) (deq-enq x' xs ⁻¹) refl isInjEnq : ∀ a a' q q' → enq a q ≡ enq a' q' → (a ≡ a') × (q ≡ q') isInjEnq _ _ _ _ p = fst c , ListPath.decode _ _ (snd c) where c = ListPath.encode _ _ p isInjReturnOrEnq : ∀ a a' qr qr' → returnOrEnq S a qr ≡ returnOrEnq S a' qr' → (a ≡ a') × (qr ≡ qr') isInjReturnOrEnq a a' nothing nothing p = cong snd p , refl isInjReturnOrEnq a a' nothing (just (q' , b')) p = ⊥.rec (lower (ListPath.encode _ _ (cong fst p))) isInjReturnOrEnq a a' (just (q , b)) nothing p = ⊥.rec (lower (ListPath.encode _ _ (cong fst p))) isInjReturnOrEnq a a' (just (q , b)) (just (q' , b')) p = fst c , cong just (ΣPathP (ListPath.decode _ _ (snd c) , cong snd p)) where c = ListPath.encode _ _ (cong fst p) isInjDeq-lemma : ∀ q q' → MaybePath.Cover (deq q) (deq q') → q ≡ q' isInjDeq-lemma [] [] _ = refl isInjDeq-lemma [] (y ∷ q') c = ⊥.rec (lower (subst (MaybePath.Cover nothing) (deq-enq y q') c)) isInjDeq-lemma (x ∷ q) [] c = ⊥.rec (lower (subst (λ r → MaybePath.Cover r nothing) (deq-enq x q) c)) isInjDeq-lemma (x ∷ q) (y ∷ q') c = cong₂ _∷_ (fst p) (isInjDeq-lemma q q' (MaybePath.encode _ _ (snd p))) where p : (x ≡ y) × (deq q ≡ deq q') p = isInjReturnOrEnq _ _ _ _ (subst (uncurry MaybePath.Cover) (ΣPathP (deq-enq x q , deq-enq y q')) c) isInjDeq : ∀ q q' → deq q ≡ deq q' → q ≡ q' isInjDeq _ _ p = isInjDeq-lemma _ _ (MaybePath.encode _ _ p) Finite : FiniteQueue Finite = (Q , str WithLaws , subst isEquiv (sym (funExt foldrCons)) (idIsEquiv _))