diff --git a/Stack.cabal b/Stack.cabal
--- a/Stack.cabal
+++ b/Stack.cabal
@@ -1,5 +1,5 @@
 name:                Stack
-version:             0.1.0
+version:             0.2.0
 synopsis:            Stack data structure type
 description:         Please see README.md
 homepage:            https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
diff --git a/src/Data/Stack.hs b/src/Data/Stack.hs
--- a/src/Data/Stack.hs
+++ b/src/Data/Stack.hs
@@ -1,11 +1,13 @@
 -- | Abstract Stack data type
+--
+-- <https://en.wikipedia.org/wiki/Stack_(abstract_data_type)>
 module Data.Stack (
     Stack,
     stackNew,
-    stackIsEmpty,
     stackPush,
     stackPeek,
     stackPop,
+    stackIsEmpty,
     stackSize,
   )
   where
@@ -17,24 +19,41 @@
 stackNew :: Stack a
 stackNew = Stack []
 
--- | Test if stack is empty
-stackIsEmpty :: Stack a -> Bool
-stackIsEmpty (Stack []) = True
-stackIsEmpty (Stack _)  = False
-
 -- | Push item onto Stack
+--
+-- > (∀x)(∀s)(stackPop (stackPush s x) == Just (s,x))
 stackPush :: Stack a -> a -> Stack a
 stackPush (Stack items) item = Stack (item : items)
 
 -- | Pop most recently added item without removing from the Stack
-stackPeek :: Stack a -> a
-stackPeek (Stack items) = head items
+--
+-- > stackPeek stackNew == Nothing
+-- > (∀x)(∀s)(stackPeek (stackPush s x) == Just x)
+-- > (∀s)(stackPeek s == fmap snd (stackPop s))
+stackPeek :: Stack a -> Maybe a
+stackPeek (Stack []) = Nothing
+stackPeek (Stack items) = Just (head items)
 
--- | Pop most recently item from Stack
-stackPop :: Stack a -> (Stack a, a)
-stackPop (Stack items) = (Stack (tail items), stackPeek (Stack items))
+-- | Pop most recently added item from Stack
+--
+-- > stackPop stackNew == Nothing
+-- > (∀x)(∀s)(stackPop (stackPush s x) == Just (s,x))
+stackPop :: Stack a -> Maybe (Stack a, a)
+stackPop (Stack []) = Nothing
+stackPop (Stack items) = Just (Stack (tail items), head items)
 
+-- | Test if stack is empty
+--
+-- > stackIsEmpty stackNew == True
+-- > (∀x)(∀s)(stackIsEmpty (stackPush s x) == True)
+-- > (∀s)((stackSize s == 0) ⇔ (stackIsEmpty s == True))
+stackIsEmpty :: Stack a -> Bool
+stackIsEmpty (Stack []) = True
+stackIsEmpty (Stack _)  = False
+
 -- | Compute number of elements contained in the Stack
+--
+-- > stackSize stackNew == 0
+-- > (∀x)(∀s)((stackSize s == n) ⇒ (stackSize (stackPush s x) == n+1))
 stackSize :: Stack a -> Int
 stackSize (Stack items) = length items
-
