------------------------------------------------------------------------
-- The Agda standard library
--
-- Wrapper for the proof irrelevance modality
--
-- This allows us to store proof irrelevant witnesses in a record and
-- use projections to manipulate them without having to turn on the
-- unsafe option --irrelevant-projections.
-- Cf. Data.Refinement for a use case
------------------------------------------------------------------------

{-# OPTIONS --cubical-compatible --safe #-}

module Data.Irrelevant where

open import Level using (Level)

private
  variable
    a b c : Level
    A : Set a
    B : Set b
    C : Set c

------------------------------------------------------------------------
-- Type

record Irrelevant (A : Set a) : Set a where
  constructor [_]
  field .irrelevant : A
open Irrelevant public

------------------------------------------------------------------------
-- Algebraic structure: Functor, Appplicative and Monad-like

map : (A  B)  Irrelevant A  Irrelevant B
map f [ a ] = [ f a ]

pure : A  Irrelevant A
pure x = [ x ]

infixl 4 _<*>_
_<*>_ : Irrelevant (A  B)  Irrelevant A  Irrelevant B
[ f ] <*> [ a ] = [ f a ]

infixl 1 _>>=_
_>>=_ : Irrelevant A  (.A  Irrelevant B)  Irrelevant B
[ a ] >>= f = f a

------------------------------------------------------------------------
-- Other functions

zipWith : (A  B  C)  Irrelevant A  Irrelevant B  Irrelevant C
zipWith f a b =  f a b