F# tips weekly #16: Asynchronous memoize
Caching the results of asynchronous functions is a common task. Can we use memoize for it? Let's find out!
Memoized Task
Surprisingly, task works great with the basic memoize function from Tip #14. If we use a function that returns Task<_>, we get a ...
jindraivanek.hashnode.dev3 min read
Re your question about there being a simpler way of memoizing a Task and/or Async - it's not trivial, but Simple is not Easy either...
TaskCell, a helper in Equinox covers memoization of a Task, with expiration (and not caching failures): github.com/jet/equinox/blob/master/src/Equinox.Core/TaskCell.fs
See the tests in the repo for the semantics
The helper is used a) internally in the Equinox caching system (not dissimilar to the stampede prevention in the .NET 9 IDistributedCache impl) b) as a standalone construct (e.g. it can be used to ensure you have a live token for some third party API given some validity period, with only a single update call regardless of how many callers trigger it etc)