|
Class: CachedValue
Object
|
+--CachedValue
- Package:
- stx:libbasic2
- Category:
- Kernel-Processes
- Version:
- rev:
1.10
date: 2023/05/30 13:48:43
- user: matilk
- file: CachedValue.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
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:]
copyrightCOPYRIGHT (c) 2012 by eXept Software AG
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
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.
-
initialize
-
(comment from inherited method)
called only once - initialize signals
-
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.
|
|