{-# OPTIONS --without-K --safe #-}

module Prelude.Alternative where

open import Agda.Primitive
open import Agda.Builtin.Bool

open import Prelude.Functor

private variable
  A B : Set _

record FunctorZero (F :  {}  Set   Set ) : Setω where
  field
    empty : F A
    overlap {{super}} : Functor F

record Alternative (F :  {}  Set   Set ) : Setω where
  infixl 3 _<|>_
  field
    _<|>_ : F A  F A  F A
    overlap {{super}} : FunctorZero F

open FunctorZero ⦃...⦄ public
open Alternative ⦃...⦄ public

{-# DISPLAY FunctorZero.empty _     = empty   #-}
{-# DISPLAY Alternative._<|>_ _ x y = x <|> y #-}

module _ {F :  {}  Set   Set }  _ : FunctorZero F  where
  guard : Bool  F A  F A
  guard true  x = x
  guard false _ = empty