Source code on Github
-- ** irrelevant version of Data.List.Membership
{-# OPTIONS --safe --with-K #-}
module Prelude.Irrelevance.List.Membership where

open import Prelude.Init; open SetAsType
open import Prelude.General
open import Prelude.DecEq.Core
open import Prelude.Decidable
open import Prelude.InferenceRules

open import Prelude.Irrelevance.Core
open import Prelude.Irrelevance.WithK
open import Prelude.Irrelevance.Empty

private pattern 𝟙 = L.Fst.[ refl ]; pattern 𝟚 x = x  L.Fst.[ refl ]

module _ {A : Type } where

  private variable
    x y : A
    xs ys zs : List A
    P : Pred A ℓ′

  ·Any : Pred A ℓ′  Pred (List A) _
  ·Any P = First (·¬_  P) P

  _·∈_ : A  List A  Type 
  x ·∈ xs = ·Any (x ≡_) xs

  ·∈⇒∈ : x ·∈ xs  x L.Mem.∈ xs
  ·∈⇒∈ = L.Fst.toAny

  module _  _ : P ⁇¹  where
    ·Any-resp-↭ : ·Any P Respects _↭_
    ·Any-resp-↭ ↭-refl wit         = wit
    ·Any-resp-↭ (↭-prep x p) First.[ px ] = First.[ px ]
    ·Any-resp-↭ (↭-prep x p) (¬px  wit) = ¬px  ·Any-resp-↭ p wit
    ·Any-resp-↭ (↭-swap x y p) First.[ px ]
      with ¿ P y ¿
    ... | yes py = First.[ py ]
    ... | no ¬py = ¬⇒·¬ ¬py  First.[ px ]
    ·Any-resp-↭ (↭-swap x y p) (¬px  First.[ py ]) = First.[ py ]
    ·Any-resp-↭ (↭-swap x y p) (¬px  ¬py  wit) = ¬py  ¬px  ·Any-resp-↭ p wit
    ·Any-resp-↭ (↭-trans p q) wit = ·Any-resp-↭ q $ ·Any-resp-↭ p wit

  module _  _ : DecEq A  where
    ·∈-resp-↭ :  {x : A}  (x ·∈_) Respects _↭_
    ·∈-resp-↭ = ·Any-resp-↭

  module _ {a p} {A : Set a} where
    ·∁ : Pred A ℓ′  Pred A ℓ′
    (·∁ P) x = ·¬ P x

    import Relation.Nullary.Decidable as Dec
    module _ {P : Pred A p} where
      first? : Decidable¹ P  Decidable¹ (First P (·∁ P))
      first? P? xs = Nullary.map′ (L.Fst.map id ¬⇒·¬) (L.Fst.map id ·¬⇒¬)
                                  (L.Fst.first? P? xs)

      cofirst? : Decidable¹ P  Decidable¹ (First (·∁ P) P)
      cofirst? P? xs = Nullary.map′ (L.Fst.map ¬⇒·¬ id)  (L.Fst.map ·¬⇒¬ id)
                                    (L.Fst.cofirst? P? xs)

  instance
    ··∈ : ·² _·∈_
    ··∈ .∀≡ = L.Fst.irrelevant ·¬⇒¬ ∀≡ ∀≡

    Dec-·∈ :  DecEq A   _·∈_ ⁇²
    Dec-·∈ .dec = cofirst? (_ ≟_) _

  infixl 4 _─_
  _─_ :  xs  x ·∈ xs  List A
  xs  x∈ = xs L.Any.─ L.Fst.toAny x∈

  ·∈-─⁺ :
     (x∈ : x ·∈ xs) 
     x  y
     y ·∈ xs
      ────────────────
      y ·∈ (xs  x∈)
  ·∈-─⁺ 𝟙 x≢y 𝟙 = ⊥-elim $ x≢y refl
  ·∈-─⁺ 𝟙 _ (_  y∈) = y∈
  ·∈-─⁺ (_  _) _ 𝟙 = 𝟙
  ·∈-─⁺ (_  x∈) x≢y (  y∈) =   ·∈-─⁺ x∈ x≢y y∈

  ·∈-─⁻ :
     (x∈ : x ·∈ xs) 
     x  y
     y ·∈ (xs  x∈)
      ────────────────
      y ·∈ xs
  ·∈-─⁻ 𝟙 x≢y y∈ = (¬⇒·¬ $ ≢-sym x≢y)  y∈
  ·∈-─⁻ (_  x∈) x≢y 𝟙 = 𝟙
  ·∈-─⁻ (_  x∈) x≢y (  y∈) =   ·∈-─⁻ x∈ x≢y y∈

  module _  _ : DecEq A  where
    ·∈-─⁻′ :
       (x∈ : x ·∈ xs) 
       y ·∈ (xs  x∈)
        ────────────────
        y ·∈ xs
    ·∈-─⁻′ {x = x} {y = y} 𝟙 y∈
      with y  x
    ... | yes refl = 𝟙
    ... | no  = ¬⇒·¬   y∈
    ·∈-─⁻′ (_  x∈) 𝟙 = 𝟙
    ·∈-─⁻′ (_  x∈) (  y∈) =   ·∈-─⁻′ x∈ y∈

  ─∘─ : (x∈ : x ·∈ xs)
       (y∈ : y ·∈ xs)
       (x≢y : x  y)
       (xs  x∈  ·∈-─⁺ x∈ x≢y y∈)
       (xs  y∈  ·∈-─⁺ y∈ (≢-sym x≢y) x∈)
  ─∘─ 𝟙 𝟙 _ = refl
  ─∘─ 𝟙 (_  _) _ = refl
  ─∘─ (_  _) 𝟙 _ = refl
  ─∘─ (_  x∈) (_  y∈) x≢y rewrite ─∘─ x∈ y∈ x≢y = refl