{-# LANGUAGE MultiParamTypeClasses #-}
-- | Memo table classes
module Data.Function.YaMemo.MemoTableClasses (
  -- * Class
    MemoTable(..)
   ,MemoTableT(..)
    ) where

class MemoTable t where
  emptyMemoTable  :: Ord a => t a b
  lookupMemoTable :: Ord a => a -> t a b -> Maybe b
  insertMemoTable :: Ord a => a -> b -> t a b -> t a b

class (Monad m) => MemoTableT t m where
  emptyMemoTableT  :: Ord a => t a (m b)
  lookupMemoTableT :: Ord a => a -> t a (m b) -> Maybe (m b)
  insertMemoTableT :: Ord a => a -> m b -> t a (m b) -> t a (m b)