module Stack (module Stack, module X) where
import Data.Maybe (fromJust)
import Data.Foldable as X (toList)
import Data.Set.Ordered (OSet, (|<))
import qualified Data.Set.Ordered as OS
type Stack a = OSet a
empty :: Stack a
empty = OS.empty
singleton :: a -> Stack a
singleton = OS.singleton
insert :: Ord a => a -> Stack a -> Stack a
insert = (|<)
removeLast :: Ord a => Stack a -> Stack a
removeLast s = OS.delete (Stack.last s) s
head :: Stack a -> a
head = (`unsafeElemAt` 0)
safeHead :: Stack a -> Maybe a
safeHead = (`elemAt` 0)
last :: Stack a -> a
last s = s `unsafeElemAt` (Stack.size s - 1)
pop :: Ord a => Stack a -> Stack a
pop s = OS.delete (Stack.head s) s
popWithInfo :: Ord a => Stack a -> (Stack a, a, a)
popWithInfo s = let
top = Stack.head s
s' = OS.delete top s
top' = Stack.head s' in
(s', top, top')
tail :: Ord a => Stack a -> [a]
tail = toList . pop
elemAt :: Stack a -> Int -> Maybe a
elemAt = OS.elemAt
takeStack :: Ord a => Int -> Stack a -> Stack a
takeStack n = fromList . take n . toList
unsafeElemAt :: Stack a -> Int -> a
unsafeElemAt s = fromJust . OS.elemAt s
fromList :: Ord a => [a] -> Stack a
fromList = OS.fromList
size :: Stack a -> Int
size = OS.size