------------------------------------------------------------------------ -- 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 --without-K --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 ⦈