1module ReversedList where
2
3{-|
4ReversedList can be used to avoid accidentally forgetting to reverse a list
5(this most commonly occurs when implementing recursive algorithms that build up a
6list that needs to be reversed in the termination case).
7-}
8
9newtype Reversed a = Reversed [a]
10
11
12empty :: Reversed a
13empty =
14    Reversed []
15
16
17push :: a -> Reversed a -> Reversed a
18push a (Reversed list) =
19    Reversed (a : list)
20
21
22isEmpty :: Reversed a -> Bool
23isEmpty (Reversed []) = True
24isEmpty _ = False
25
26
27toList :: Reversed a -> [a]
28toList (Reversed list) =
29    reverse list
30