{-# OPTIONS --safe #-} module Data.Maybe where open import Level open import Agda.Builtin.Maybe public maybe′ : {B : Maybe A → Type b} → B nothing → ((x : A) → B (just x)) → (x : Maybe A) → B x maybe′ b f nothing = b maybe′ b f (just x) = f x {-# INLINE maybe′ #-} maybe : B → (A → B) → Maybe A → B maybe = maybe′ {-# INLINE maybe #-} map-maybe : (A → B) → Maybe A → Maybe B map-maybe f nothing = nothing map-maybe f (just x) = just (f x) from-maybe : A → Maybe A → A from-maybe x mx = maybe x (λ x → x) mx {-# INLINE from-maybe #-} infixr 4.3 _??_ _??_ : Maybe A → A → A xs ?? x = from-maybe x xs open import Data.Bool guard : Bool → A → Maybe A guard b x = bool′ nothing (just x) b ensure : (A → Bool) → A → Maybe A ensure p x = guard (p x) x