{-# LANGUAGE TypeSynonymInstances #-} module Toktok.Stack where import Data.Monoid newtype Stack a = Stack [[a]] deriving (Show, Eq) merge :: Stack a -> Stack a -> Stack a merge (Stack a) (Stack b) = Stack $ merge' a b where merge' [] b = b merge' a [] = a merge' (l:ls) (l':ls') = (l ++ l'):merge' ls ls' singleton :: Int -> a -> Stack a singleton n a = Stack $ singleton' n a where singleton' n x | n <= 0 = error "index should be > 0" singleton' n x | n == 1 = [[x]] singleton' n x = []:singleton' (n-1) x instance Monoid (Stack a) where mempty = Stack [] mappend = merge head :: Stack a -> [a] head (Stack []) = [] head (Stack (l:_)) = l pop:: Stack a -> Stack a pop (Stack []) = Stack [] pop (Stack (_:ls)) = Stack ls emptyStack :: Stack a emptyStack = Stack []