module Data.StableMemo (memo, memo2, memo3, (-->) (), memoPoly) where
import Control.Applicative
import Data.Proxy
import qualified Data.StableMemo.Internal as Internal
import Data.StableMemo.Internal ((-->) ())
memoPoly :: (f --> g) -> (f --> g)
memoPoly = Internal.memo (Proxy :: Proxy Internal.Strong)
memo :: (a -> b) -> (a -> b)
memo f = getConst . memoPoly (Const . f . getConst) . Const
memo2 :: (a -> b -> c) -> (a -> b -> c)
memo2 f = memo (memo . f)
memo3 :: (a -> b -> c -> d) -> (a -> b -> c -> d)
memo3 f = memo (memo2 . f)