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

module Prelude.Applicative where

open import Agda.Builtin.Unit
open import Agda.Builtin.Bool

open import Prelude.Level
open import Prelude.Function

open import Prelude.Functor

private variable
  A B : Set _
  
record Applicative (F : ∀ {a} → Set a → Set a) : Setω where
  infixl 4 _<*>_ _<*_ _*>_
  field
    pure  : A → F A
    _<*>_ : F (A → B) → F A → F B
    overlap ⦃ super}} : Functor F

  _<*_ : {A B : Set ℓ} → F A → F B → F A
  a <* b = ⦇ const a b ⦈

  _*>_ : {A B : Set ℓ} → F A → F B → F B
  a *> b = ⦇ (const id) a b ⦈

  when : Bool → F ⊤ → F ⊤
  when false _ = pure tt
  when true  m = m

  unless : Bool → F ⊤ → F ⊤
  unless true  _ = pure tt
  unless false m = m
open Applicative ⦃...⦄ public

{-# DISPLAY Applicative.pure  _ = pure  #-}
{-# DISPLAY Applicative._<*>_ _ = _<*>_ #-}
{-# DISPLAY Applicative._<*_  _ = _<*_  #-}
{-# DISPLAY Applicative._*>_  _ = _*>_  #-}