diff --git a/packages/effect-fc-next/src/ScopeRegistry.ts b/packages/effect-fc-next/src/ScopeRegistry.ts index 7cbb846..58e9a75 100644 --- a/packages/effect-fc-next/src/ScopeRegistry.ts +++ b/packages/effect-fc-next/src/ScopeRegistry.ts @@ -1,4 +1,4 @@ -import { type Cause, Context, DateTime, type Duration, Effect, Equal, Exit, HashMap, Layer, Option, Scope, Semaphore, Stream, SubscriptionRef } from "effect" +import { type Cause, Context, DateTime, type Duration, Effect, Equal, Exit, HashMap, Layer, Option, Order, Scope, Semaphore, Stream, SubscriptionRef } from "effect" export interface ScopeRegistryService { @@ -159,18 +159,20 @@ export class ScopeRegistryServiceImpl implements ScopeRegistryService { getNextExpiration( entries: HashMap.HashMap, ): Option.Option { - let earliest: DateTime.Utc | undefined - - for (const entry of HashMap.values(entries)) { - if ( - entry.leases === 0 && - entry.expiresAt._tag === "Some" && - (!earliest || DateTime.isLessThan(entry.expiresAt.value, earliest)) - ) - earliest = entry.expiresAt.value - } - - return Option.fromNullishOr(earliest) + return HashMap.reduce( + entries, + Option.none(), + (earliest, entry) => Option.match( + Option.filter(entry.expiresAt, () => entry.leases === 0), + { + onNone: () => earliest, + onSome: expiresAt => Option.some(Option.match(earliest, { + onNone: () => expiresAt, + onSome: Order.min(DateTime.Order)(expiresAt), + })), + }, + ), + ) } }