{-# OPTIONS --safe #-}
module Prelude.Anyable where
open import Prelude.Init
open import Prelude.LiteralSequences
record Anyable (F : Type ℓ → Type ℓ) : Type (lsuc ℓ) where
  field Any : ∀ {A} → (A → Type) → F A → Type ℓ
  ∃∈-syntax  = Any
  ∃∈-syntax′ = Any
  ∄∈-syntax  = λ {A} P → ¬_ ∘ Any {A} P
  ∄∈-syntax′ = ∄∈-syntax
  infix 2 ∃∈-syntax ∃∈-syntax′ ∄∈-syntax ∄∈-syntax′
  syntax ∃∈-syntax  P         xs = ∃[∈    xs ] P
  syntax ∃∈-syntax′ (λ x → P) xs = ∃[ x ∈ xs ] P
  syntax ∄∈-syntax  P         xs = ∄[∈    xs ] P
  syntax ∄∈-syntax′ (λ x → P) xs = ∄[ x ∈ xs ] P
open Anyable ⦃...⦄ public
instance
  Anyable-List : Anyable {ℓ} List
  Anyable-List .Any = L.Any.Any
  Anyable-Vec : ∀ {n} → Anyable {ℓ} (flip Vec n)
  Anyable-Vec .Any P = V.Any.Any P
  Anyable-Maybe : Anyable {ℓ} Maybe
  Anyable-Maybe .Any = M.Any.Any
private
  open import Prelude.Decidable
  _ : ∃[ x ∈ List ℕ ∋ [ 1 ⨾  2 ⨾ 3 ] ] (x > 0)
  _ = auto
  _ : ∃[ x ∈ just 42 ] (x > 0)
  _ = auto
  _ : ∄[ x ∈ nothing ] (x > 0)
  _ = auto