!-     Safe)StackAbstract Stack data typeStackO(1). Create new empty StackStackO(1). Push item onto Stack 0("x)("s)(stackPop (stackPush s x) == Just (s,x))StackO(1)>. Pop most recently added item without removing from the Stack vstackPeek stackNew == Nothing ("x)("s)(stackPeek (stackPush s x) == Just x) ("s)(stackPeek s == fmap snd (stackPop s))StackO(1)). Pop most recently added item from Stack MstackPop stackNew == Nothing ("x)("s)(stackPop (stackPush s x) == Just (s,x))StackO(1). Test if stack is empty stackIsEmpty stackNew == True ("x)("s)(stackIsEmpty (stackPush s x) == True) ("s)((stackSize s == 0) ! (stackIsEmpty s == True))StackO(1)3. Compute number of elements contained in the Stack YstackSize stackNew == 0 ("x)("s)((stackSize s == n) ! (stackSize (stackPush s x) == n+1))Safe1 StackSynchronized stack data type StackCreate new empty StackStackPush item onto StackStack<Pop most recently added item without removing from the StackStack<Pop most recently added item without removing from the Stack'Automatically retries if stack is emptyStack'Pop most recently added item from StackStack'Pop most recently added item from Stack'Automatically retries if stack is emptyStackTest if stack is emptyStack1Compute number of elements contained in the Stack  SafeCStackCreate new empty StackStackPush item onto StackStack<Pop most recently added item without removing from the StackStack<Pop most recently added item without removing from the StackBlocks if stack is emptyStack'Pop most recently added item from StackStack'Pop most recently added item from StackBlocks if stack is emptyStackTest if stack is emptyStack1Compute number of elements contained in the Stack           "Stack-0.4.0-3n0jn5oI3rtCOo8Q7gcJGV Data.StackControl.Concurrent.STM.StackControl.Concurrent.StackStackstackNew stackPush stackPeekstackPop stackIsEmpty stackSize $fMonoidStack$fSemigroupStack $fNFDataStack $fReadStack $fShowStack stackTryPeek stackTryPop