{-# OPTIONS --safe #-}
module Prelude.Allable where

open import Prelude.Init
open import Prelude.LiteralSequences
open import Prelude.DecEq

record Allable (F : Type ℓ → Type ℓ) : Type (lsuc ℓ) where
  field All : ∀ {A} → (A → Type) → F A → Type ℓ

  ∀∈-syntax   = All
  ∀∈-syntax′  = All
  ¬∀∈-syntax  = λ {A} P → ¬_ ∘ All {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 Allable ⦃...⦄ public

instance
  Allable-List : Allable {ℓ} List
  Allable-List .All = L.All.All

  Allable-Vec : ∀ {n} → Allable {ℓ} (flip Vec n)
  Allable-Vec .All P = V.All.All P

  Allable-Maybe : Allable {ℓ} Maybe
  Allable-Maybe .All = M.All.All

private
  open import Prelude.Decidable

  _ : ∀[ x ∈ List ℕ ∋ [ 1 ⨾ 2 ⨾ 3 ] ] (x > 0)
  _ = auto

  _ : ∀[ x ∈ just 42 ] (x > 0)
  _ = auto

  _ : ∀[ x ∈ nothing ] (x > 0)
  _ = auto

  _ : ¬∀[ x ∈ just 0 ] (x > 0)
  _ = auto