monad-memo-0.4.1: Memoization monad transformer

Copyright(c) Eduard Sergeev 2013
LicenseBSD-style (see the file LICENSE)
Maintainereduard.sergeev@gmail.com
Stabilityexperimental
Portabilitynon-portable (multi-param classes, flexible instances)
Safe HaskellNone
LanguageHaskell98

Control.Monad.Memo.Vector

Contents

Description

VectorCache - mutable-vector-based (IO and ST hosted) MonadCache

The fastest memoization cache, however it is even more limiting than Control.Monad.Memo.Array due to nature of Data.Vector.Mutable. Still if you can use this cache please do since it will give you dramatic calculation speed up in comparison to pure Map-based cache, especially when unboxed UVectorCache is used.

Limitations: Since MVector is used as MonadCache the key must be Int and the size of the cache's vector must be known beforehand with vector being allocated before the first call. In addition unboxed UVectorCache can only store Unbox values (but it does it very efficiently).

Synopsis

VectorCache for boxed types

type Vector = MVector #

Boxed vector

type VectorCache s e = Cache Vector s e #

MonadCache based on boxed vector

class MaybeLike e v => VectorMemo v e | v -> e #

This is just to be able to infer the type of the VectorCache element.

evalVectorMemo #

Arguments

:: (PrimMonad m, VectorMemo v e) 
=> VectorCache (PrimState m) e m a

memoized computation

-> Int

vector length

-> m a

result

Evaluate computation using mutable boxed vector

Vector length must covers all possible keys used in computation otherwise index out of bound error is generated by vector code

runVectorMemo #

Arguments

:: (PrimMonad m, VectorMemo v e) 
=> VectorCache (PrimState m) e m a

memoized computation

-> Int

vector length

-> m (a, Vector (PrimState m) e)

result and final vector cache

Evaluate computation using mutable boxed vector. It also returns the final content of the vector cache

Vector length must covers all possible keys used in computation otherwise index out of bound error is generated by vector code

UVectorCache for unboxed types

type UVector = MVector #

Unboxed vector

type UVectorCache s e = Cache UVector s e #

MonadCache based on unboxed vector

class MaybeLike e v => UVectorMemo v e | v -> e #

This is just to be able to infer the type of the UVectorCache element.

evalUVectorMemo #

Arguments

:: (PrimMonad m, MVector UVector e, UVectorMemo v e) 
=> UVectorCache (PrimState m) e m a

memoized computation

-> Int

vector length

-> m a

result

Evaluate computation using mutable unboxed vector

Vector length must covers all possible keys used in computation otherwise index out of bound error is generated by vector code

runUVectorMemo #

Arguments

:: (PrimMonad m, MVector UVector e, UVectorMemo v e) 
=> UVectorCache (PrimState m) e m a

memoized computation

-> Int

vector length

-> m (a, UVector (PrimState m) e)

result and final vector cache

Evaluate computation using mutable unboxed vector. It also returns the final content of the vector cache

Vector length must covers all possible keys used in computation otherwise index out of bound error is generated by vector code

Generic functions for VectorCache

newtype Container vec #

Constructors

Container 

Fields

Instances

(PrimMonad m, (~) * (PrimState m) s, MaybeLike e v, MVector c e) => MonadMemo Int v (Cache c s e m) # 

Methods

memo :: (Int -> Cache c s e m v) -> Int -> Cache c s e m v #

(PrimMonad m, (~) * (PrimState m) s, MaybeLike e v, MVector c e) => MonadCache Int v (Cache c s e m) # 

Methods

lookup :: Int -> Cache c s e m (Maybe v) #

add :: Int -> v -> Cache c s e m () #

type Cache vec s e = ReaderCache (Container (vec s e)) #

Generic Vector-based memo cache

genericEvalVectorMemo :: (MaybeLike e v, PrimMonad m, MVector c e) => Cache c (PrimState m) e m a -> Int -> m a #

genericRunVectorMemo :: (MaybeLike e v, PrimMonad m, MVector c e) => Cache c (PrimState m) e m a -> Int -> m (a, c (PrimState m) e) #