Hyperlinkv0.8.0-beta.28

Effect

Effect.provideconsteffect/Effect.ts:5862
<const Layers extends [Layer.Any, ...Array<Layer.Any>]>(
  layers: Layers,
  options?: { readonly local?: boolean | undefined } | undefined
): <A, E, R>(
  self: Effect<A, E, R>
) => Effect<
  A,
  E | Layer.Error<Layers[number]>,
  | Layer.Services<Layers[number]>
  | Exclude<R, Layer.Success<Layers[number]>>
>
<ROut, E2, RIn>(
  layer: Layer.Layer<ROut, E2, RIn>,
  options?: { readonly local?: boolean | undefined } | undefined
): <A, E, R>(
  self: Effect<A, E, R>
) => Effect<A, E | E2, RIn | Exclude<R, ROut>>
<R2>(context: Context.Context<R2>): <A, E, R>(
  self: Effect<A, E, R>
) => Effect<A, E, Exclude<R, R2>>
<A, E, R, const Layers extends [Layer.Any, ...Array<Layer.Any>]>(
  self: Effect<A, E, R>,
  layers: Layers,
  options?: { readonly local?: boolean | undefined } | undefined
): Effect<
  A,
  E | Layer.Error<Layers[number]>,
  | Layer.Services<Layers[number]>
  | Exclude<R, Layer.Success<Layers[number]>>
>
<A, E, R, ROut, E2, RIn>(
  self: Effect<A, E, R>,
  layer: Layer.Layer<ROut, E2, RIn>,
  options?: { readonly local?: boolean | undefined } | undefined
): Effect<A, E | E2, RIn | Exclude<R, ROut>>
<A, E, R, R2>(
  self: Effect<A, E, R>,
  context: Context.Context<R2>
): Effect<A, E, Exclude<R, R2>>

Provides dependencies to an effect using layers or a context. Use options.local to build the layer every time; by default, layers are shared between provide calls.

Example (Providing dependencies with a layer)

import { Context, Effect, Layer } from "effect"

interface Database {
  readonly query: (sql: string) => Effect.Effect<string>
}

const Database = Context.Service<Database>("Database")

const DatabaseLive = Layer.succeed(Database)({
  query: Effect.fn("Database.query")((sql: string) => Effect.succeed(`Result for: ${sql}`))
})

const program = Effect.gen(function*() {
  const db = yield* Database
  return yield* db.query("SELECT * FROM users")
})

const provided = Effect.provide(program, DatabaseLive)

Effect.runPromise(provided).then(console.log)
// Output: "Result for: SELECT * FROM users"
environment
Source effect/Effect.ts:586247 lines
export const provide: {
  <const Layers extends [Layer.Any, ...Array<Layer.Any>]>(
    layers: Layers,
    options?: {
      readonly local?: boolean | undefined
    } | undefined
  ): <A, E, R>(
    self: Effect<A, E, R>
  ) => Effect<
    A,
    E | Layer.Error<Layers[number]>,
    Layer.Services<Layers[number]> | Exclude<R, Layer.Success<Layers[number]>>
  >
  <ROut, E2, RIn>(
    layer: Layer.Layer<ROut, E2, RIn>,
    options?: {
      readonly local?: boolean | undefined
    } | undefined
  ): <A, E, R>(
    self: Effect<A, E, R>
  ) => Effect<A, E | E2, RIn | Exclude<R, ROut>>
  <R2>(
    context: Context.Context<R2>
  ): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E, Exclude<R, R2>>
  <A, E, R, const Layers extends [Layer.Any, ...Array<Layer.Any>]>(
    self: Effect<A, E, R>,
    layers: Layers,
    options?: {
      readonly local?: boolean | undefined
    } | undefined
  ): Effect<
    A,
    E | Layer.Error<Layers[number]>,
    Layer.Services<Layers[number]> | Exclude<R, Layer.Success<Layers[number]>>
  >
  <A, E, R, ROut, E2, RIn>(
    self: Effect<A, E, R>,
    layer: Layer.Layer<ROut, E2, RIn>,
    options?: {
      readonly local?: boolean | undefined
    } | undefined
  ): Effect<A, E | E2, RIn | Exclude<R, ROut>>
  <A, E, R, R2>(
    self: Effect<A, E, R>,
    context: Context.Context<R2>
  ): Effect<A, E, Exclude<R, R2>>
} = internalLayer.provide