{-# LANGUAGE MultiParamTypeClasses #-}

module Data.Stream.Hinze.Memo where

import Prelude (id)

-- | We could add functional dependencies |k -> t| and |t -> k|, but since
-- Haskell has a nominal type system there may be several isomorphic key
-- types that relate to the same table type (or vice versa).
--
class Memo k t where
   tabulate  ::  (k -> a) -> t a
   lookup    ::  t a -> (k -> a)
   dom       ::  t k

   dom  =  tabulate id