
Concurrency.pudu
Pudu32 lines1.5 KB
1/** @Limiter.Concurrency.Module — at most N executions at once */2module PuduLangResilience.Limiter.Concurrency34import PuduLangResilience.Clock as Clock5import PuduLangResilience.Domain.Algorithms as Algorithms6import PuduLangResilience.Limiter.Engine as Engine7import PuduLangResilience.Limiter as Limiter89/** @Limiter.Concurrency.Options — permits held at once and the queue behind them */10export type Options = { permitLimit: Int, queueLimit: Int, queueOrder: Limiter.QueueOrder, clock: Clock.Clock }111213export fn defaults() -> Options {14 Options{permitLimit: 1000, queueLimit: 0, queueOrder: Limiter.OldestFirst, clock: Clock.system()}15}161718export fn validate(options: &Options) -> Array[Str] {19 var problems: Array[Str] = []20 if options.permitLimit < 1 { problems = problems.push("permitLimit must be at least 1") }21 if options.queueLimit < 0 { problems = problems.push("queueLimit must not be negative") }22 problems23}242526export fn create(options: &Options) -> Result[Limiter.Limiter, Array[Str]] {27 let problems = validate(options)28 if !problems.isEmpty() { return Err(problems) }29 let queueing = Engine.Queueing{permitLimit: options.permitLimit, queueLimit: options.queueLimit, order: options.queueOrder}30 Ok(Engine.limiter(options.permitLimit, Algorithms.concurrency(options.permitLimit), &queueing, options.clock))31}32