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

module Data.Maybe.Base 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

mapMaybe : (A → B) → Maybe A → Maybe B
mapMaybe f nothing  = nothing
mapMaybe f (just x) = just (f x)

fromMaybe : A → Maybe A → A
fromMaybe x = maybe x (λ x → x)

infixr 2 _|?_
_|?_ : Maybe A → A → A
_|?_ = λ x y → fromMaybe y x