Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-httpclient

Named HTTP clients for Pudu: a client factory, delegating handlers, pooled keep-alive connections, handler lifetimes, logging, and resilience

0.1.1Apache-2.01

InstallClose

Tokens.pudu

Pudu19 lines1.0 KB

GitHub ↗
1/** @Utils.Tokens.Module — cancellation tokens that fire when any of several does */2module PuduLangHttpClient.Utils.Tokens34import Std.Concurrent.Cancel as Cancel5import Std.Sync as Sync6import PuduLangHttpClient.Constants.Defaults as Defaults78/// A token that fires when any parent fires, or `millis` from now unless `millis` is9/// `Defaults.INFINITE`, whichever comes first; cancelling it leaves the parents running.10export fn linked(parents: &Array[Cancel.Token], millis: Int) -> Cancel.Token {11  var ancestors: Array[Sync.Cell[Option[Cancel.Reason]]] = []12  var deadline = if millis == Defaults.INFINITE { Defaults.INFINITE } else { clock() + (if millis < 0 { 0 } else { millis }) }13  for parent in parents {14    ancestors = ancestors.concat(parent.ancestors).push(parent.own)15    if parent.deadline != Defaults.INFINITE && (deadline == Defaults.INFINITE || parent.deadline < deadline) { deadline = parent.deadline }16  }17  Cancel.Token{own: Sync.cell(None), guard: Sync.mutex(), ancestors: ancestors, deadline: deadline}18}19