|
Class: CachedValue
Object
|
+--CachedValue
- Package:
- stx:libbasic2
- Category:
- Kernel-Processes
- Version:
- rev:
1.6
date: 2018/11/05 11:48:23
- user: cg
- file: CachedValue.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
- Author:
- Claus Gittinger
Instances of CachedValue can be used for values which are costly to evaluate,
but which can be cached for some time.
For example, when asking a source code repository for the set of symbolic names,
this query takes a few seconds (a CVS roundtrip). However, this information can easily
be cached and remembered for some time (say 30seconds or so), to speed up followup
repository operations.
You may find more similar uses of this class.
[instance variables:]
value ..................... the computed (cached value)
expirationTime ............ timeStamp, when this value becomes obsolete
validDuration ............. timeDuration, how long a computed value remains valid
computation ............... a computation block, to recompute the value.
[class variables:]
instance creation
-
compute: actionBlock validityDuration: aTimeduration
-
return a 'self computing' cachedvalue, which ceases to be valid aTimeduration after
it has computed its value.
If asked again for a value, it will automatically recompute the value.
-
value: valueArg expirationTime: aTimestamp
-
return a 'one shot' cachedValue, which ceases to be valid at expirationTime.
If asked for the value after that, an exception is raised
(i.e. it does not automatically recompute a value)
accessing
-
compute: computationBlock validityDuration: aTimeduration
-
-
expirationTime: something
-
-
forceInvalid
-
-
value
-
return my value. If not yet computed or expired, recompute using the computation block.
Otherwise return the cacehdValue
-
value: valueArg expirationTime: aTimestamp
-
-
valueOrIfInvalid: exceptionalValue
-
return my value, if valid. Otherwise, return the value from exceptionalValue.
private
-
computeCachedValue
-
queries
-
isValid
-
true if the cached value is still valid
ValueExpiredException
|cv exceptionRaised didCompute|
didCompute := false.
cv := CachedValue compute:[didCompute := true. Date today dayOfWeek] validityDuration:(2 seconds).
self assert:(cv isValid not).
self assert:(didCompute not).
self assert:(cv value = Date today dayOfWeek).
self assert:(cv isValid).
self assert:(didCompute).
Delay waitForSeconds:3.
didCompute := false.
self assert:(cv isValid not).
self assert:(didCompute not).
self assert:(cv value = Date today dayOfWeek).
self assert:(cv isValid).
self assert:(didCompute).
|
|cv exceptionRaised|
cv := CachedValue value:123 expirationTime:(Timestamp now + 2 seconds).
self assert:(cv isValid).
Delay waitForSeconds:3.
self assert:(cv isValid not).
exceptionRaised := false.
ValueExpiredException handle:[:ex |
exceptionRaised := true.
] do:[
cv value
].
self assert:exceptionRaised.
|
|