monad-memo-0.5.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
LanguageHaskell2010

Control.Monad.Memo.Vector.Unsafe

Contents

Description

VectorCache - mutable-vector-based MonadCache with unsafe operations.

This is a version of Control.Monad.Memo.Mutable.Vector but implemented using unsafe* vector operations. Faster than default implementation but you must be sure that your code doesn't try to read/write outside vector boundaries.

Synopsis

VectorCache for boxed types

type VectorCache s e = Cache Vector s e Source #

MonadCache based on boxed vector

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

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

Instances
MaybeLike (Maybe v) v => VectorMemo v (Maybe v) Source # 
Instance details

Defined in Control.Monad.Memo.Vector.Instances

unsafeEvalVectorMemo Source #

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 and unsafe operations

Vector length must covers all possible keys used in computation otherwise the behaviour is undefined (i.e. segfault)

unsafeRunVectorMemo Source #

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 and unsafe operations. It also returns the final content of the vector cache

Vector length must covers all possible keys used in computation otherwise the behaviour is undefined (i.e. segfault)

UVectorCache for unboxed types

type UVectorCache s e = Cache UVector s e Source #

MonadCache based on unboxed vector

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

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

Instances
MaybeLike v v => UVectorMemo v v Source # 
Instance details

Defined in Control.Monad.Memo.Vector.Instances

unsafeEvalUVectorMemo Source #

Arguments

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

memoized computation

-> Int

vector length

-> m a

result

Evaluate computation using mutable unboxed vector and unsafe operations

Vector length must covers all possible keys used in computation otherwise the behaviour is undefined (i.e. segfault)

unsafeRunUVectorMemo Source #

Arguments

:: (PrimMonad m, UVectorMemo v e, MVector UVector 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 boxed vector and unsafe operations. It also returns the final content of the vector cache

Vector length must covers all possible keys used in computation otherwise the behaviour is undefined (i.e. segfault)

Generic functions for VectorCache

newtype Container vec Source #

Constructors

Container 

Fields

Instances
(PrimMonad m, PrimState m ~ s, MaybeLike e v, MVector c e) => MonadMemo Int v (Cache c s e m) Source # 
Instance details

Defined in Control.Monad.Memo.Vector.Unsafe

Methods

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

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

Defined in Control.Monad.Memo.Vector.Unsafe

Methods

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

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

type Cache vec k e = ReaderCache (Container (vec k e)) Source #

Generic Vector-based memo cache

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