41 lines
910 B
Text
41 lines
910 B
Text
/-
|
||
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Daniel Selsam
|
||
|
||
Simple stack API implemented using an array.
|
||
-/
|
||
prelude
|
||
import Init.Data.Array
|
||
import Init.Data.Int
|
||
universes u v w
|
||
|
||
structure Stack (α : Type u) :=
|
||
(vals : Array α := #[])
|
||
|
||
namespace Stack
|
||
|
||
variable {α : Type u}
|
||
|
||
def empty : Stack α :=
|
||
{}
|
||
|
||
def isEmpty (s : Stack α) : Bool :=
|
||
s.vals.isEmpty
|
||
|
||
def push (v : α) (s : Stack α) : Stack α :=
|
||
{ vals := s.vals.push v .. s }
|
||
|
||
def peek? (s : Stack α) : Option α :=
|
||
if s.vals.isEmpty then none else s.vals.get? (s.vals.size-1)
|
||
|
||
def peek! [Inhabited α] (s : Stack α) : α :=
|
||
s.vals.back
|
||
|
||
def pop [Inhabited α] (s : Stack α) : Stack α :=
|
||
{ vals := s.vals.pop .. s }
|
||
|
||
def modify [Inhabited α] (s : Stack α) (f : α → α) : Stack α :=
|
||
{ vals := s.vals.modify (s.vals.size-1) f .. s }
|
||
|
||
end Stack
|