{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeOperators #-}
module Data.StableMemo.Weak (memo, memo2, memo3) where
import Control.Applicative
import Data.Proxy
import System.Mem.Weak (Weak)
import qualified Data.StableMemo.Internal as Internal
memo :: (a -> b) -> (a -> b)
memo :: forall a b. (a -> b) -> a -> b
memo a -> b
f = forall {k} a (b :: k). Const a b -> a
getConst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (ref :: * -> *) (f :: k -> *) (g :: k -> *) (b :: k).
Ref ref =>
Proxy ref -> (forall (a :: k). f a -> g a) -> f b -> g b
Internal.memo (forall {k} (t :: k). Proxy t
Proxy :: Proxy Weak) (forall {k} a (b :: k). a -> Const a b
Const forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} a (b :: k). Const a b -> a
getConst) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} a (b :: k). a -> Const a b
Const
memo2 :: (a -> b -> c) -> (a -> b -> c)
memo2 :: forall a b c. (a -> b -> c) -> a -> b -> c
memo2 a -> b -> c
f = forall a b. (a -> b) -> a -> b
memo (forall a b. (a -> b) -> a -> b
memo forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b -> c
f)
memo3 :: (a -> b -> c -> d) -> (a -> b -> c -> d)
memo3 :: forall a b c d. (a -> b -> c -> d) -> a -> b -> c -> d
memo3 a -> b -> c -> d
f = forall a b. (a -> b) -> a -> b
memo (forall a b c. (a -> b -> c) -> a -> b -> c
memo2 forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b -> c -> d
f)