{-# 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