push :: (Ord a)=>a -> DistinctStack a -> Maybe (DistinctStack a)
push x (xs, st) | x `S.member` st = Nothing
                | otherwise       = Just (x:xs, S.insert x st)
push :: (Ord a)=>a -> DistinctStack a -> Maybe (DistinctStack a)
push x (xs, st) | x `S.member` st = Nothing
                | otherwise       = Just (x:xs, S.insert x st)
push x (xs, st) | x `S.member` st = Nothing
                | otherwise       = Just (x:xs, S.insert x st)