| 376 | ) |
| 377 | |
| 378 | const makeBuilder = <RIn, E, ROut>( |
| 379 | self: Layer.Layer<ROut, E, RIn>, |
| 380 | scope: Scope.Scope, |
| 381 | inMemoMap = false |
| 382 | ): Effect.Effect<(memoMap: Layer.MemoMap) => Effect.Effect<Context.Context<ROut>, E, RIn>> => { |
| 383 | const op = self as Primitive |
| 384 | switch (op._op_layer) { |
| 385 | case "Locally": { |
| 386 | return core.sync(() => (memoMap: Layer.MemoMap) => op.f(memoMap.getOrElseMemoize(op.self, scope))) |
| 387 | } |
| 388 | case "ExtendScope": { |
| 389 | return core.sync(() => (memoMap: Layer.MemoMap) => |
| 390 | fiberRuntime.scopeWith( |
| 391 | (scope) => memoMap.getOrElseMemoize(op.layer, scope) |
| 392 | ) as unknown as Effect.Effect<Context.Context<ROut>, E, RIn> |
| 393 | ) |
| 394 | } |
| 395 | case "Fold": { |
| 396 | return core.sync(() => (memoMap: Layer.MemoMap) => |
| 397 | pipe( |
| 398 | memoMap.getOrElseMemoize(op.layer, scope), |
| 399 | core.matchCauseEffect({ |
| 400 | onFailure: (cause) => memoMap.getOrElseMemoize(op.failureK(cause), scope), |
| 401 | onSuccess: (value) => memoMap.getOrElseMemoize(op.successK(value), scope) |
| 402 | }) |
| 403 | ) |
| 404 | ) |
| 405 | } |
| 406 | case "Fresh": { |
| 407 | return core.sync(() => (_: Layer.MemoMap) => pipe(op.layer, buildWithScope(scope))) |
| 408 | } |
| 409 | case "FromEffect": { |
| 410 | return inMemoMap |
| 411 | ? core.sync(() => (_: Layer.MemoMap) => op.effect as Effect.Effect<Context.Context<ROut>, E, RIn>) |
| 412 | : core.sync(() => (memoMap: Layer.MemoMap) => memoMap.getOrElseMemoize(self, scope)) |
| 413 | } |
| 414 | case "Provide": { |
| 415 | return core.sync(() => (memoMap: Layer.MemoMap) => |
| 416 | pipe( |
| 417 | memoMap.getOrElseMemoize(op.first, scope), |
| 418 | core.flatMap((env) => |
| 419 | pipe( |
| 420 | memoMap.getOrElseMemoize(op.second, scope), |
| 421 | core.provideContext(env) |
| 422 | ) |
| 423 | ) |
| 424 | ) |
| 425 | ) |
| 426 | } |
| 427 | case "Scoped": { |
| 428 | return inMemoMap |
| 429 | ? core.sync(() => (_: Layer.MemoMap) => |
| 430 | fiberRuntime.scopeExtend( |
| 431 | op.effect as Effect.Effect<Context.Context<ROut>, E, RIn>, |
| 432 | scope |
| 433 | ) |
| 434 | ) |
| 435 | : core.sync(() => (memoMap: Layer.MemoMap) => memoMap.getOrElseMemoize(self, scope)) |