module Data.AList where
import Prelude hiding (sum)
import Data.Monoid
import Data.Semigroup
import Data.Foldable
data AList a = AListTip a
| AListAppend (AList a) (AList a)
| AListEmpty
deriving (Read,Show)
singleton x = AListTip x
append = AListAppend
instance Eq a => Eq (AList a) where
alist == alist' = toList alist == toList alist'
instance Ord a => Ord (AList a) where
compare alist alist' = compare (toList alist) (toList alist')
instance Foldable AList where
foldMap f AListEmpty = mempty
foldMap f (AListTip a) = f a
foldMap f (AListAppend a b) = foldMap f a `mappend` foldMap f b
cons x alist = singleton x `append` alist
snoc alist x = alist `append` singleton x
drawAList x = '[' : drawAList' x ++ "]"
drawAList' AListEmpty = ""
drawAList' (AListAppend a b) = drawAList' a ++ "," ++ drawAList' b
drawAList' (AListTip a) = show a
instance Monoid (AList a) where
mempty = AListEmpty
mappend = append
instance Semigroup (AList a) where
(<>) = append