{-# LANGUAGE FunctionalDependencies, ExistentialQuantification, MultiParamTypeClasses, FlexibleInstances #-} -- Module : Data.LookupTable -- License : GPLv2 module Data.LookupTable ( LookupTable , new , lookup , insert , toList , fromList ) where import Prelude hiding (lookup) import Data.Map (Map) import qualified Data.Map as Map import qualified Data.List as List import Data.IntMap (IntMap) import qualified Data.IntMap as IntMap class Ord k => LookupTable k v t | t -> k , t -> v where new :: t lookup :: k -> t -> Maybe v insert :: k -> v -> t -> t toList :: t -> [(k, v)] fromList :: [(k, v)] -> t instance Ord k => LookupTable k v (Map k v) where new = Map.empty lookup = Map.lookup insert = Map.insert toList = Map.toList fromList = Map.fromList instance Ord k => LookupTable k v [(k,v)] where new = [] lookup = List.lookup insert = curry (:) toList = id fromList = id instance LookupTable Int v (IntMap v) where new = IntMap.empty lookup = IntMap.lookup insert = IntMap.insert toList = IntMap.toList fromList = IntMap.fromList