Source code on Github
{-# OPTIONS --with-K #-}
module Prelude.Ord.List where
open import Prelude.Init; open SetAsType
open import Prelude.General
open import Prelude.Lift
open import Prelude.DecEq.Core
open import Prelude.Decidable
open import Prelude.Irrelevance.Core
open import Prelude.Ord.Core
open import Prelude.Ord.Dec
open import Prelude.Ord.Irrelevant
module _ {A : Type ℓ} ⦃ _ : Ord A ⦄ where
  private
    pattern ≪_ x = inj₁ x; pattern ≫_ x = inj₂ x
    pattern ≪≡ = ≪ refl;   pattern ≫≡_ x = ≫ (refl , x)
  _<∗_ _≤∗_ : Rel (List A) ℓ
  _<∗_ = λ where
    [] [] → ↑ℓ ⊥
    [] (_ ∷ _) → ↑ℓ ⊤
    (_ ∷ _) [] → ↑ℓ ⊥
    (x ∷ xs) (y ∷ ys) → (x < y) ⊎ ((x ≡ y) × (xs <∗ ys))
  _≤∗_ = ≤-from-< _<∗_
  instance
    Ord-List : Ord (List A)
    Ord-List = mkOrd< _<∗_
  module _ ⦃ _ : DecEq A ⦄ ⦃ _ : DecOrd A ⦄ where
    _<∗?_ : Decidable² _<∗_
    _<∗?_ = λ where
      [] [] → no λ ()
      [] (_ ∷ _) → yes it
      (_ ∷ _) [] → no λ ()
      (x ∷ xs) (y ∷ ys) → (x <? y) ⊎-dec ((x ≟ y) ×-dec (xs <∗? ys))
    instance
      Dec-<∗ : _<∗_ ⁇²
      Dec-<∗ .dec = _ <∗? _
      DecOrd-List : DecOrd (List A)
      DecOrd-List = record {}
  module _ ⦃ _ : OrdLaws A ⦄ where instance
    postulate OrdLaws-List : OrdLaws (List A)
    ·-<∗ : ⦃ _ : ·² _<_ {A = A} ⦄ → ·² _<∗_
    ·-<∗ {x = xs} {ys} .∀≡ = go xs ys
      where
        go : ∀ (xs ys : List A) → Irrelevant (xs <∗ ys)
        go = λ where
          []      (_ ∷ _) (lift tt) (lift tt) → refl
          (_ ∷ _) (_ ∷ _) (≪ _)  (≪ _)  → cong ≪_ (∀≡ _ _)
          (_ ∷ _) (_ ∷ _) (≪ p)  (≫≡ _) → ⊥-elim $ <-irrefl refl p
          (_ ∷ _) (_ ∷ _) (≫≡ _) (≪ q)  → ⊥-elim $ <-irrefl refl q
          (_ ∷ _) (_ ∷ _) (≫≡ _) (≫≡ _) → cong ≫≡_ (∀≡ _ _)
    ·-≤∗ : ⦃ _ : ·² _≤_ {A = A} ⦄ ⦃ _ : ·² _<_ {A = A} ⦄ → ·² _≤∗_
    ·-≤∗ .∀≡ = λ where
      ≪≡    ≪≡    → refl
      ≪≡    (≫ q) → ⊥-elim $ <-irrefl refl q
      (≫ p) ≪≡    → ⊥-elim $ <-irrefl refl p
      (≫ _) (≫ _) → cong ≫_ (∀≡ _ _)
    ·Ord-List : ⦃ ·Ord A ⦄ → ·Ord (List A)
    ·Ord-List = mk·Ord
module _ {A : Type ℓ} ⦃ _ : Ord⁺⁺ A ⦄ where instance
  Ord⁺⁺-List : ⦃ DecEq A ⦄ → Ord⁺⁺ (List A)
  Ord⁺⁺-List = mkOrd⁺⁺