Skip to content

Commit de1b226

Browse files
authoredFeb 14, 2024··
Relax FiberRefs, make None behave like Runtime (#2139)
1 parent 44c3b43 commit de1b226

File tree

6 files changed

+66
-48
lines changed

6 files changed

+66
-48
lines changed
 

‎.changeset/flat-rockets-pretend.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
Introduce FiberId.Single, make FiberId.None behave like FiberId.Runtime, relax FiberRefs to use Single instead of Runtime.
6+
7+
This change is a precursor to enable easier APIs to modify the Runtime when patching FiberRefs.

‎packages/effect/src/FiberId.ts

+12-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ export type FiberIdTypeId = typeof FiberIdTypeId
2323
* @since 2.0.0
2424
* @category models
2525
*/
26-
export type FiberId = None | Runtime | Composite
26+
export type Single = None | Runtime
27+
28+
/**
29+
* @since 2.0.0
30+
* @category models
31+
*/
32+
export type FiberId = Single | Composite
2733

2834
/**
2935
* @since 2.0.0
@@ -32,6 +38,8 @@ export type FiberId = None | Runtime | Composite
3238
export interface None extends Equal.Equal, Inspectable {
3339
readonly [FiberIdTypeId]: FiberIdTypeId
3440
readonly _tag: "None"
41+
readonly id: -1
42+
readonly startTimeMillis: -1
3543
}
3644

3745
/**
@@ -60,19 +68,19 @@ export interface Composite extends Equal.Equal, Inspectable {
6068
* @since 2.0.0
6169
* @category constructors
6270
*/
63-
export const none: FiberId = internal.none
71+
export const none: None = internal.none
6472

6573
/**
6674
* @since 2.0.0
6775
* @category constructors
6876
*/
69-
export const runtime: (id: number, startTimeMillis: number) => FiberId = internal.runtime
77+
export const runtime: (id: number, startTimeMillis: number) => Runtime = internal.runtime
7078

7179
/**
7280
* @since 2.0.0
7381
* @category constructors
7482
*/
75-
export const composite: (left: FiberId, right: FiberId) => FiberId = internal.composite
83+
export const composite: (left: FiberId, right: FiberId) => Composite = internal.composite
7684

7785
/**
7886
* Returns `true` if the specified unknown value is a `FiberId`, `false`

‎packages/effect/src/FiberRefs.ts

+14-14
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export type FiberRefsSym = typeof FiberRefsSym
3333
*/
3434
export interface FiberRefs extends Pipeable {
3535
readonly [FiberRefsSym]: FiberRefsSym
36-
readonly locals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>>
36+
readonly locals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>>
3737
}
3838

3939
const delete_: {
@@ -68,8 +68,8 @@ export const fiberRefs: (self: FiberRefs) => HashSet.HashSet<FiberRef.FiberRef<a
6868
* @category utils
6969
*/
7070
export const forkAs: {
71-
(childId: FiberId.Runtime): (self: FiberRefs) => FiberRefs
72-
(self: FiberRefs, childId: FiberId.Runtime): FiberRefs
71+
(childId: FiberId.Single): (self: FiberRefs) => FiberRefs
72+
(self: FiberRefs, childId: FiberId.Single): FiberRefs
7373
} = internal.forkAs
7474

7575
/**
@@ -105,8 +105,8 @@ export const getOrDefault: {
105105
* @category utils
106106
*/
107107
export const joinAs: {
108-
(fiberId: FiberId.Runtime, that: FiberRefs): (self: FiberRefs) => FiberRefs
109-
(self: FiberRefs, fiberId: FiberId.Runtime, that: FiberRefs): FiberRefs
108+
(fiberId: FiberId.Single, that: FiberRefs): (self: FiberRefs) => FiberRefs
109+
(self: FiberRefs, fiberId: FiberId.Single, that: FiberRefs): FiberRefs
110110
} = internal.joinAs
111111

112112
/**
@@ -126,15 +126,15 @@ export const setAll: (self: FiberRefs) => Effect.Effect<void> = internal.setAll
126126
export const updateAs: {
127127
<A>(
128128
options: {
129-
readonly fiberId: FiberId.Runtime
129+
readonly fiberId: FiberId.Single
130130
readonly fiberRef: FiberRef.FiberRef<A>
131131
readonly value: A
132132
}
133133
): (self: FiberRefs) => FiberRefs
134134
<A>(
135135
self: FiberRefs,
136136
options: {
137-
readonly fiberId: FiberId.Runtime
137+
readonly fiberId: FiberId.Single
138138
readonly fiberRef: FiberRef.FiberRef<A>
139139
readonly value: A
140140
}
@@ -150,16 +150,16 @@ export const updateAs: {
150150
export const updateManyAs: {
151151
(
152152
options: {
153-
readonly forkAs?: FiberId.Runtime | undefined
153+
readonly forkAs?: FiberId.Single | undefined
154154
readonly entries: readonly [
155155
readonly [
156156
FiberRef.FiberRef<any>,
157-
readonly [readonly [FiberId.Runtime, any], ...Array<readonly [FiberId.Runtime, any]>]
157+
readonly [readonly [FiberId.Single, any], ...Array<readonly [FiberId.Single, any]>]
158158
],
159159
...Array<
160160
readonly [
161161
FiberRef.FiberRef<any>,
162-
readonly [readonly [FiberId.Runtime, any], ...Array<readonly [FiberId.Runtime, any]>]
162+
readonly [readonly [FiberId.Single, any], ...Array<readonly [FiberId.Single, any]>]
163163
]
164164
>
165165
]
@@ -168,16 +168,16 @@ export const updateManyAs: {
168168
(
169169
self: FiberRefs,
170170
options: {
171-
readonly forkAs?: FiberId.Runtime | undefined
171+
readonly forkAs?: FiberId.Single | undefined
172172
readonly entries: readonly [
173173
readonly [
174174
FiberRef.FiberRef<any>,
175-
readonly [readonly [FiberId.Runtime, any], ...Array<readonly [FiberId.Runtime, any]>]
175+
readonly [readonly [FiberId.Single, any], ...Array<readonly [FiberId.Single, any]>]
176176
],
177177
...Array<
178178
readonly [
179179
FiberRef.FiberRef<any>,
180-
readonly [readonly [FiberId.Runtime, any], ...Array<readonly [FiberId.Runtime, any]>]
180+
readonly [readonly [FiberId.Single, any], ...Array<readonly [FiberId.Single, any]>]
181181
]
182182
>
183183
]
@@ -192,7 +192,7 @@ export const updateManyAs: {
192192
* @category unsafe
193193
*/
194194
export const unsafeMake: (
195-
fiberRefLocals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>>
195+
fiberRefLocals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>>
196196
) => FiberRefs = internal.unsafeMake
197197

198198
/**

‎packages/effect/src/internal/fiberId.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ const emptyHash = Hash.string(`${FiberIdSymbolKey}-${OP_NONE}`)
4040
/** @internal */
4141
class None implements FiberId.None {
4242
readonly [FiberIdTypeId]: FiberId.FiberIdTypeId = FiberIdTypeId
43-
readonly _tag = OP_NONE;
43+
readonly _tag = OP_NONE
44+
readonly id = -1
45+
readonly startTimeMillis = -1;
4446
[Hash.symbol](): number {
4547
return emptyHash
4648
}
@@ -141,15 +143,15 @@ class Composite implements FiberId.Composite {
141143
}
142144

143145
/** @internal */
144-
export const none: FiberId.FiberId = new None()
146+
export const none: FiberId.None = new None()
145147

146148
/** @internal */
147-
export const runtime = (id: number, startTimeMillis: number): FiberId.FiberId => {
149+
export const runtime = (id: number, startTimeMillis: number): FiberId.Runtime => {
148150
return new Runtime(id, startTimeMillis)
149151
}
150152

151153
/** @internal */
152-
export const composite = (left: FiberId.FiberId, right: FiberId.FiberId): FiberId.FiberId => {
154+
export const composite = (left: FiberId.FiberId, right: FiberId.FiberId): FiberId.Composite => {
153155
return new Composite(left, right)
154156
}
155157

‎packages/effect/src/internal/fiberRefs.ts

+25-25
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import * as core from "./core.js"
1212

1313
/** @internal */
1414
export function unsafeMake(
15-
fiberRefLocals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>>
15+
fiberRefLocals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>>
1616
): FiberRefs.FiberRefs {
1717
return new FiberRefsImpl(fiberRefLocals)
1818
}
@@ -31,7 +31,7 @@ export class FiberRefsImpl implements FiberRefs.FiberRefs {
3131
constructor(
3232
readonly locals: Map<
3333
FiberRef.FiberRef<any>,
34-
Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>
34+
Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>
3535
>
3636
) {
3737
}
@@ -43,8 +43,8 @@ export class FiberRefsImpl implements FiberRefs.FiberRefs {
4343
/** @internal */
4444
const findAncestor = (
4545
_ref: FiberRef.FiberRef<any>,
46-
_parentStack: ReadonlyArray<readonly [FiberId.Runtime, unknown]>,
47-
_childStack: ReadonlyArray<readonly [FiberId.Runtime, unknown]>,
46+
_parentStack: ReadonlyArray<readonly [FiberId.Single, unknown]>,
47+
_childStack: ReadonlyArray<readonly [FiberId.Single, unknown]>,
4848
_childModified = false
4949
): readonly [unknown, boolean] => {
5050
const ref = _ref
@@ -83,8 +83,8 @@ const findAncestor = (
8383

8484
/** @internal */
8585
export const joinAs = dual<
86-
(fiberId: FiberId.Runtime, that: FiberRefs.FiberRefs) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
87-
(self: FiberRefs.FiberRefs, fiberId: FiberId.Runtime, that: FiberRefs.FiberRefs) => FiberRefs.FiberRefs
86+
(fiberId: FiberId.Single, that: FiberRefs.FiberRefs) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
87+
(self: FiberRefs.FiberRefs, fiberId: FiberId.Single, that: FiberRefs.FiberRefs) => FiberRefs.FiberRefs
8888
>(3, (self, fiberId, that) => {
8989
const parentFiberRefs = new Map(self.locals)
9090
that.locals.forEach((childStack, fiberRef) => {
@@ -111,7 +111,7 @@ export const joinAs = dual<
111111
const oldValue = parentStack[0][1]
112112
const newValue = fiberRef.join(oldValue, fiberRef.patch(patch)(oldValue))
113113
if (!Equal.equals(oldValue, newValue)) {
114-
let newStack: Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, unknown]>
114+
let newStack: Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, unknown]>
115115
const parentFiberId = parentStack[0][0]
116116
if (parentFiberId[Equal.symbol](fiberId)) {
117117
newStack = [[parentFiberId, newValue] as const, ...parentStack.slice(1)]
@@ -128,18 +128,18 @@ export const joinAs = dual<
128128

129129
/** @internal */
130130
export const forkAs = dual<
131-
(childId: FiberId.Runtime) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
132-
(self: FiberRefs.FiberRefs, childId: FiberId.Runtime) => FiberRefs.FiberRefs
131+
(childId: FiberId.Single) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
132+
(self: FiberRefs.FiberRefs, childId: FiberId.Single) => FiberRefs.FiberRefs
133133
>(2, (self, childId) => {
134-
const map = new Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, unknown]>>()
134+
const map = new Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, unknown]>>()
135135
unsafeForkAs(self, map, childId)
136136
return new FiberRefsImpl(map)
137137
})
138138

139139
const unsafeForkAs = (
140140
self: FiberRefs.FiberRefs,
141-
map: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>>,
142-
fiberId: FiberId.Runtime
141+
map: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>>,
142+
fiberId: FiberId.Single
143143
) => {
144144
self.locals.forEach((stack, fiberRef) => {
145145
const oldValue = stack[0][1]
@@ -193,21 +193,21 @@ export const getOrDefault = dual<
193193
export const updateAs = dual<
194194
<A>(
195195
options: {
196-
readonly fiberId: FiberId.Runtime
196+
readonly fiberId: FiberId.Single
197197
readonly fiberRef: FiberRef.FiberRef<A>
198198
readonly value: A
199199
}
200200
) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
201201
<A>(
202202
self: FiberRefs.FiberRefs,
203203
options: {
204-
readonly fiberId: FiberId.Runtime
204+
readonly fiberId: FiberId.Single
205205
readonly fiberRef: FiberRef.FiberRef<A>
206206
readonly value: A
207207
}
208208
) => FiberRefs.FiberRefs
209209
>(2, <A>(self: FiberRefs.FiberRefs, { fiberId, fiberRef, value }: {
210-
readonly fiberId: FiberId.Runtime
210+
readonly fiberId: FiberId.Single
211211
readonly fiberRef: FiberRef.FiberRef<A>
212212
readonly value: A
213213
}) => {
@@ -220,13 +220,13 @@ export const updateAs = dual<
220220
})
221221

222222
const unsafeUpdateAs = (
223-
locals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>>,
224-
fiberId: FiberId.Runtime,
223+
locals: Map<FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>>,
224+
fiberId: FiberId.Single,
225225
fiberRef: FiberRef.FiberRef<any>,
226226
value: any
227227
) => {
228-
const oldStack: ReadonlyArray<readonly [FiberId.Runtime, any]> = locals.get(fiberRef) ?? []
229-
let newStack: Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]> | undefined
228+
const oldStack: ReadonlyArray<readonly [FiberId.Single, any]> = locals.get(fiberRef) ?? []
229+
let newStack: Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]> | undefined
230230

231231
if (Arr.isNonEmptyReadonlyArray(oldStack)) {
232232
const [currentId, currentValue] = Arr.headNonEmpty(oldStack)
@@ -256,25 +256,25 @@ const unsafeUpdateAs = (
256256
export const updateManyAs = dual<
257257
(
258258
options: {
259-
readonly forkAs?: FiberId.Runtime | undefined
259+
readonly forkAs?: FiberId.Single | undefined
260260
readonly entries: Arr.NonEmptyReadonlyArray<
261-
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>]
261+
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>]
262262
>
263263
}
264264
) => (self: FiberRefs.FiberRefs) => FiberRefs.FiberRefs,
265265
(
266266
self: FiberRefs.FiberRefs,
267267
options: {
268-
readonly forkAs?: FiberId.Runtime | undefined
268+
readonly forkAs?: FiberId.Single | undefined
269269
readonly entries: Arr.NonEmptyReadonlyArray<
270-
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>]
270+
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>]
271271
>
272272
}
273273
) => FiberRefs.FiberRefs
274274
>(2, (self: FiberRefs.FiberRefs, { entries, forkAs }: {
275-
readonly forkAs?: FiberId.Runtime | undefined
275+
readonly forkAs?: FiberId.Single | undefined
276276
readonly entries: Arr.NonEmptyReadonlyArray<
277-
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Runtime, any]>]
277+
readonly [FiberRef.FiberRef<any>, Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>]
278278
>
279279
}) => {
280280
if (self.locals.size === 0) {

‎packages/effect/src/internal/fiberRuntime.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -3079,7 +3079,8 @@ export const fiberAwaitAll = (fibers: Iterable<Fiber.Fiber<any, any>>): Effect.E
30793079
/** @internal */
30803080
export const fiberAll = <A, E>(fibers: Iterable<Fiber.Fiber<A, E>>): Fiber.Fiber<Array<A>, E> => ({
30813081
[internalFiber.FiberTypeId]: internalFiber.fiberVariance,
3082-
id: () => RA.fromIterable(fibers).reduce((id, fiber) => FiberId.combine(id, fiber.id()), FiberId.none),
3082+
id: () =>
3083+
RA.fromIterable(fibers).reduce((id, fiber) => FiberId.combine(id, fiber.id()), FiberId.none as FiberId.FiberId),
30833084
await: core.exit(forEachParUnbounded(fibers, (fiber) => core.flatten(fiber.await), false)),
30843085
children: core.map(forEachParUnbounded(fibers, (fiber) => fiber.children, false), RA.flatten),
30853086
inheritAll: core.forEachSequentialDiscard(fibers, (fiber) => fiber.inheritAll),

0 commit comments

Comments
 (0)
Please sign in to comment.