module Data.AList
(
AList,
fromList,
toList,
toMap,
fromMap,
isEmpty,
lookupAll,
lookupFirst,
lookupBy,
member,
values,
keys,
insert,
append,
deleteAll,
deleteFirst,
deleteBy) where
import Prelude hiding (deleteBy)
import qualified Data.Map as M
import Data.List (delete)
import Data.Monoid ((<>), mappend, mempty, Monoid)
import Safe (headMay)
data AList key value = AList [(key, value)] deriving (Show)
instance Monoid (AList k v) where
mempty = AList []
mappend (AList a) (AList b) = AList $ a ++ b
isEmpty :: AList k v -> Bool
isEmpty (AList al) = null al
lookupAll :: Eq k => k -> AList k v -> [v]
lookupAll k (AList al) = map snd $ filter ((== k) . fst) al
lookupFirst :: Eq k => k -> AList k v -> Maybe v
lookupFirst k (AList l) = lookup k l
lookupBy :: (k -> Bool) -> AList k v -> AList k v
lookupBy f (AList l) = AList $ filter (f . fst) l
member :: Eq k => k -> AList k v -> Bool
member k = elem k . keys
values :: AList k v -> [v]
values (AList al) = map snd al
keys :: AList k v -> [k]
keys (AList al) = map fst al
insert :: k -> v -> AList k v -> AList k v
insert k v (AList l) = AList $ (k, v):l
append :: k -> v -> AList k v -> AList k v
append k v (AList l) = AList $ l ++ [(k, v)]
deleteAll :: Eq k => k -> AList k v -> AList k v
deleteAll k = deleteBy (== k)
deleteFirst :: Eq k => k -> AList k v -> AList k v
deleteFirst _ (AList []) = AList []
deleteFirst t (AList ((k, v):is))
| t == k = AList is
| otherwise = insert k v . deleteFirst t $ AList is
deleteBy :: (k -> Bool) -> AList k v -> AList k v
deleteBy f = lookupBy (not . f)
fromList :: [(k, v)] -> AList k v
fromList = AList
toList :: AList k v -> [(k, v)]
toList (AList l) = l
toMap :: Ord k => AList k v -> M.Map k v
toMap (AList l) = M.fromList l
fromMap :: Ord k => M.Map k v -> AList k v
fromMap = AList . M.toList