{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Data.Aztecs.Storage (Storage(..)) where

import Data.Data (Typeable)
import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap

class (Typeable (s a), Typeable a) => Storage s a where
  singleton :: Int -> a -> s a
  all :: s a -> [(Int, a)]
  insert :: Int -> a -> s a -> s a
  lookup :: Int -> s a -> Maybe a
  fromAscList :: [(Int, a)] -> s a
  remove :: Int -> s a -> (Maybe a, s a)

instance (Typeable a) => Storage IntMap a where
  singleton :: Int -> a -> IntMap a
singleton = Int -> a -> IntMap a
forall a. Int -> a -> IntMap a
IntMap.singleton
  all :: IntMap a -> [(Int, a)]
all = IntMap a -> [(Int, a)]
forall a. IntMap a -> [(Int, a)]
IntMap.toList
  insert :: Int -> a -> IntMap a -> IntMap a
insert = Int -> a -> IntMap a -> IntMap a
forall a. Int -> a -> IntMap a -> IntMap a
IntMap.insert
  lookup :: Int -> IntMap a -> Maybe a
lookup = Int -> IntMap a -> Maybe a
forall a. Int -> IntMap a -> Maybe a
IntMap.lookup
  fromAscList :: [(Int, a)] -> IntMap a
fromAscList = [(Int, a)] -> IntMap a
forall a. [(Int, a)] -> IntMap a
IntMap.fromAscList
  remove :: Int -> IntMap a -> (Maybe a, IntMap a)
remove Int
i IntMap a
s = (Int -> IntMap a -> Maybe a
forall a. Int -> IntMap a -> Maybe a
IntMap.lookup Int
i IntMap a
s, Int -> IntMap a -> IntMap a
forall a. Int -> IntMap a -> IntMap a
IntMap.delete Int
i IntMap a
s) -- TODO remove double lookup