/-
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
prelude
import Init.Data.ToString
universes u

namespace Lean

inductive LOption (α : Type u)
| none  {} : LOption
| some     : α → LOption
| undef {} : LOption

namespace LOption
variables {α : Type u}

instance : Inhabited (LOption α) := ⟨none⟩

instance [HasToString α] : HasToString (LOption α) :=
⟨fun o => match o with | none   => "none" | undef  => "undef" | (some a) => "(some " ++ toString a ++ ")"⟩

def beq [HasBeq α] : LOption α → LOption α → Bool
| none,   none   => true
| undef,  undef  => true
| some a, some b => a == b
| _,      _      => false

instance [HasBeq α] : HasBeq (LOption α) := ⟨beq⟩

end LOption
end Lean

def Option.toLOption {α : Type u} : Option α → Lean.LOption α
| none   => Lean.LOption.none
| some a => Lean.LOption.some a
