Source code on Github
{-# OPTIONS --with-K #-}
open import Prelude.Init; open SetAsType
open import Prelude.Lists.Dec
open import Prelude.Membership
open import Prelude.DecEq
open import Prelude.ToList
open import Prelude.FromList
open import Prelude.Indexable
open import Prelude.Measurable
open import Prelude.Lists.Indexed hiding (_‼_)
open import Prelude.Decidable
open import Prelude.Ord
open import Prelude.General

open import Data.List.Relation.Binary.Subset.Propositional.Properties using (Any-resp-⊆)
import Relation.Binary.Reasoning.Setoid as BinSetoid

open import Prelude.Sets.AsUniqueLists.Core
open import Prelude.Sets.AsUniqueLists.Extra

module Prelude.Sets.AsUniqueLists.Indexed where

module _ {A : Type} ⦃ _ : DecEq A ⦄ where
  private variable
    x x′ : A; xs xs′ ys zs : Set⟨ A ⟩
    B : Type; P : Pred₀ A

  instance
    Indexable-Set : Indexable Set⟨ A ⟩ A
    Indexable-Set = λ where
      .Ix s → Fin ∣ s ∣
      ._‼_ s i → toList s ‼ i

  Indexˢ = Pred (Set⟨ A ⟩) _ ∋ Ix

  ‼-from⁺ : ∀ {xs : List A} → Ix xs → Indexˢ (fromList xs)
  ‼-from⁺ {xs} = ‼-nub⁺ {xs = xs}

  ‼-from⁻ : ∀ {xs : List A} → Indexˢ (fromList xs) → Ix xs
  ‼-from⁻ {xs} = ‼-nub⁻ {xs = xs}

  ‼-to⁺ : Ix xs → Ix (toList xs)
  ‼-to⁺ = id

  ‼-to⁻ : Ix (toList xs) → Ix xs
  ‼-to⁻ = id

  module _ {B : Type} ⦃ _ : DecEq B ⦄ (xs : Set⟨ A ⟩) (f : A → Ix xs → B) where

    mapWithIxˢ : List B
    mapWithIxˢ = map (λ (i , x) → f x i) (enumerate $ xs ∙toList)

module _ {A : Type} ⦃ _ : DecEq A ⦄ {xs : Set⟨ A ⟩} where

  module _ {B : Type} ⦃ _ : DecEq B ⦄ (f : A → B) where
    ‼-mapˢ : Ix xs → Ix (mapˢ f xs)
    ‼-mapˢ = ‼-from⁺ {xs = map f (xs ∙toList)}
           ∘ ‼-map⁺ f {xs ∙toList}

  module _ {B : Type} ⦃ _ : DecEq B ⦄ (f : ∀ {x} → x ∈ˢ xs → B) where

    ‼-mapWith∈ˢ : Ix xs → Ix (mapWith∈ˢ xs f)
    ‼-mapWith∈ˢ = ‼-from⁺ {xs = L.Mem.mapWith∈ (xs ∙toList) (f ∘ ∈-nub⁻ ∘ ∈ˢ-fromList⁺)}
                ∘ ‼-mapWith∈ {xs = xs ∙toList}

  module _ {B : Type} ⦃ _ : DecEq B ⦄ xs (f : A → Ix xs → B) where

    ‼-mapWithIx : Ix xs → Ix (mapWithIx xs f)
    ‼-mapWithIx i = ‼-mapWithIx⁺ {xs = xs ∙toList} f i