Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions Sources/AsyncAlgorithms/Retry/Backoff.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public protocol BackoffStrategy<Duration> {
struct ConstantBackoffStrategy<Duration: DurationProtocol>: BackoffStrategy {
@usableFromInline let constant: Duration
@usableFromInline init(constant: Duration) {
precondition(constant >= .zero, "Constsnt must be greater than or equal to 0")
self.constant = constant
}
@inlinable func nextDuration() -> Duration {
Expand All @@ -32,8 +33,10 @@ struct ConstantBackoffStrategy<Duration: DurationProtocol>: BackoffStrategy {
@usableFromInline
struct LinearBackoffStrategy<Duration: DurationProtocol>: BackoffStrategy {
@usableFromInline var current: Duration
@usableFromInline var increment: Duration
@usableFromInline let increment: Duration
@usableFromInline init(increment: Duration, initial: Duration) {
precondition(initial >= .zero, "Initial must be greater than or equal to 0")
precondition(increment >= .zero, "Increment must be greater than or equal to 0")
self.current = initial
self.increment = increment
}
Expand All @@ -48,6 +51,8 @@ struct LinearBackoffStrategy<Duration: DurationProtocol>: BackoffStrategy {
@usableFromInline var current: Duration
@usableFromInline let factor: Int
@usableFromInline init(factor: Int, initial: Duration) {
precondition(initial >= .zero, "Initial must be greater than or equal to 0")
precondition(factor >= 1, "Factor must be greater than or equal to 1")
self.current = initial
self.factor = factor
}
Expand Down Expand Up @@ -109,8 +114,8 @@ struct EqualJitterBackoffStrategy<Base: BackoffStrategy, RNG: RandomNumberGenera
self.generator = generator
}
@inlinable mutating func nextDuration() -> Base.Duration {
let halfBase = (base.nextDuration() / 2).attoseconds
return .init(attoseconds: halfBase + Int128.random(in: 0...halfBase, using: &generator))
let base = base.nextDuration()
return .init(attoseconds: Int128.random(in: (base / 2).attoseconds...base.attoseconds, using: &generator))
}
}

Expand All @@ -122,6 +127,7 @@ struct DecorrelatedJitterBackoffStrategy<Base: BackoffStrategy, RNG: RandomNumbe
@usableFromInline var current: Duration?
@usableFromInline let factor: Int
@usableFromInline init(base: Base, generator: RNG, factor: Int) {
precondition(factor >= 1, "Factor must be greater than or equal to 1")
self.base = base
self.generator = generator
self.factor = factor
Expand Down
14 changes: 7 additions & 7 deletions Sources/AsyncAlgorithms/Retry/Retry.swift
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
@available(iOS 16.0, macCatalyst 16.0, macOS 13.0, tvOS 16.0, visionOS 1.0, watchOS 9.0, *)
public struct RetryStrategy<Duration: DurationProtocol> {
enum Strategy {
@usableFromInline enum Strategy {
case backoff(Duration)
case stop
}

let strategy: Strategy

public static var stop: Self {
@usableFromInline let strategy: Strategy
@usableFromInline init(strategy: Strategy) {
self.strategy = strategy
}
@inlinable public static var stop: Self {
return .init(strategy: .stop)
}

public static func backoff(_ duration: Duration) -> Self {
@inlinable public static func backoff(_ duration: Duration) -> Self {
return .init(strategy: .backoff(duration))
}
}
Expand Down