cmeeren / batchit Goto Github PK
View Code? Open in Web Editor NEWCall batched functions as normal functions
License: MIT License
Call batched functions as normal functions
License: MIT License
In the Option
module we have Option.defaultWith
that takes a thunk.
Perhaps there should be an overload to Batch.Create
where notFound
is a thunk?
This would help in two ways:
notFound
value is expensive we can avoid creating itWhat do you think?
Hello,
I have hit on a scenario where I think that BatchIt can help, but it does not have an appropriate overload.
Suppose we have a function for fetching a single book by ID:
let tryFetchBook (bookID : string) : Async<Book option> =
async {
// ...
}
And also that we cannot create a good batched version (string array -> Async<(string * Book option) array>
) for whatever reason.
This cannot be wrapped by the existing BatchIt overloads (I think!), but there is still benefit to having a batch. If multiple concurrent requests come in for the same book, then we would like to only make one fetch for that ID.
In other words, BatchIt can prevent multiple in-flight requests for the same data.
Here are the appropriate overloads to support this:
type Batch with
static member Create(getSingle : 'a -> Async<'b>, waitSize : int) =
let getBatched (requests : 'a array) =
requests
|> Seq.distinct
|> Seq.map
(fun request ->
async {
let! result = getSingle request
return request, result
})
|> Async.Parallel
let notFound = Unchecked.defaultof<'b>
Batch.Create(getBatched, notFound, waitSize)
static member Create(getSingle : 'extra -> 'a -> Async<'b>, waitSize : int) =
let getBatched (extra : 'extra) (requests : 'a array) =
requests
|> Seq.distinct
|> Seq.map
(fun request ->
async {
let! result = getSingle extra request
return request, result
})
|> Async.Parallel
let notFound = Unchecked.defaultof<'b>
Batch.Create(getBatched, notFound, waitSize)
What do you think?
Happy to send a PR
I can't see anything around caching in the docs, however this is a common use-case for tasks that BatchIt is also useful for.
The idea would be that cached requests could resolve immediately and only un-cached requests would hit the batching mechanism.
I don't think that any sophisticated cache expiry logic is required, since (at least in my use-case) Batch objects only live as long as a user request anyway.
Assuming the request object is the cache key, this would require that requests implement comparison
. I think having the requests be simple data types is a good practice anyway.
What are your thoughts on this?
Would a PR in this area be accepted?
For example, will the exception get routed back to each caller?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.