Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-resilience

Resilience pipelines for Pudu: retry, circuit breaker, timeout, fallback, hedging, rate limiting, and chaos injection

0.1.0Apache-2.01

InstallClose

Concurrency.pudu

Pudu32 lines1.5 KB

GitHub ↗
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 }1112/// A thousand permits, no queue, oldest first, on the system clock.13export fn defaults() -> Options {14  Options{permitLimit: 1000, queueLimit: 0, queueOrder: Limiter.OldestFirst, clock: Clock.system()}15}1617/// Every reason the options cannot be followed.18export 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}2425/// A concurrency limiter following the options, or every reason it cannot be made.26export 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