{-# OPTIONS -WnoUnsupportedIndexedMatch #-}

module Experiments.Naive where

open import Cubical.Structures.Prelude

open import Cubical.Data.Empty as ⊥
open import Cubical.Data.Maybe as Maybe
open import Cubical.Data.Nat
open import Cubical.Data.Nat.Order renaming (_≤_ to _≤ℕ_; _<_ to _<ℕ_)
open import Cubical.Data.Sigma
open import Cubical.Data.Sum as ⊎
open import Cubical.Induction.WellFounded
open import Cubical.Relation.Binary
open import Cubical.Relation.Binary.Order
open import Cubical.Relation.Nullary
open import Cubical.Relation.Nullary.HLevels
open import Cubical.Data.List
open import Cubical.Data.List.Properties
open import Cubical.HITs.PropositionalTruncation as P
import Cubical.Data.List as L
open import Cubical.Functions.Logic as L hiding (¬_; ⊥)
open import Cubical.Relation.Binary.Order

open import Cubical.Structures.Prelude
import Cubical.Structures.Set.Mon.Desc as M
import Cubical.Structures.Set.CMon.Desc as M
import Cubical.Structures.Free as F
open import Cubical.Structures.Sig
open import Cubical.Structures.Str public
open import Cubical.Structures.Tree
open import Cubical.Structures.Eq
open import Cubical.Structures.Arity
open import Cubical.Structures.Set.Mon.List as L
open import Cubical.Structures.Set.CMon.SList.Base renaming (_∷_ to _∷*_; [] to []*; [_] to [_]*; _++_ to _++*_)
import Cubical.Structures.Set.CMon.SList.Base as S
open import Cubical.Structures.Set.CMon.SList.Length as S
open import Cubical.Structures.Set.CMon.SList.Membership as S

open Iso
open Toset

private
  variable
    ℓ : Level
    A : Type ℓ

module Naive {ℓ} {A : Type ℓ} (isSetA : isSet A) (_≤_ : A -> A -> Type ℓ) (tosetA : IsToset _≤_) where

  open IsToset
  open Toset⋀ isSetA _≤_ tosetA
  open Toset⋁ isSetA _≤_ tosetA

  i : A -> A -> List A
  i a b = (a ⋀ b) ∷ (a ⋁ b) ∷ []

  i-comm : ∀ a b -> i a b ≡ i b a
  i-comm a b j = ⋀Comm a b j ∷ ⋁Comm a b j ∷ []

  isSetListA : isSet (List A)
  isSetListA = isOfHLevelList 0 isSetA

  module FreeList = L.Free {A = A} isSetListA listSat

  f : A -> List A -> List A
  f a = i a FreeList.♯

private module Test where

  ≤ℕ-isToset : IsToset _≤ℕ_
  ≤ℕ-isToset = istoset isSetℕ
    (λ _ _ -> isProp≤)
    (λ _ -> ≤-refl)
    (λ _ _ _ -> ≤-trans)
    (λ _ _ -> ≤-antisym)
    lemma
    where
    <→≤ : ∀ {n m} -> n <ℕ m -> n ≤ℕ m
    <→≤ (k , p) = suc k , sym (+-suc k _) ∙ p
    lemma : BinaryRelation.isTotal _≤ℕ_
    lemma x y = ∣ ⊎.rec ⊎.inl (_⊎_.inr ∘ <→≤) (splitℕ-≤ x y) ∣₁

  open Naive isSetℕ _≤ℕ_ ≤ℕ-isToset

  _ : i 3 2 ≡ 2 ∷ 3 ∷ []
  _ = refl

  _ : f 2 [] ≡ []
  _ = refl

  _ : f 2 [ 3 ] ≡ 2 ∷ 3 ∷ []
  _ = refl

  _ : f 3 [ 2 ] ≡ 2 ∷ 3 ∷ []
  _ = refl

  _ : f 2 (1 ∷ 3 ∷ []) ≡ 1 ∷ 2 ∷ 2 ∷ 3 ∷ []
  _ = refl