module Test.QuickSpec.Utils.MemoValuation where
import Test.QuickSpec.Term
import Test.QuickSpec.Signature
import Data.Array hiding (index)
import Data.Array.Base(unsafeAt)
import Unsafe.Coerce
import GHC.Prim
import Test.QuickSpec.Utils.Typed
import Test.QuickSpec.Utils.TypeRel
memoValuation :: Sig -> (forall a. Variable a -> a) -> (forall a. Variable a -> a)
memoValuation sig f = unsafeCoerce . unsafeAt arr . index . sym . unVariable
where arr :: Array Int Any
arr = array (0, maximum (0:map (some (index . sym . unVariable)) vars))
[(index (sym (unVariable v)), unsafeCoerce (f v))
| Some v <- vars ]
vars = toList (variables sig)