Hyperlinkv0.8.0-beta.28

Store

Store.mapEffectsconstsrc/Store.ts:1293
<Effects extends StoreEffectsVariance<StoreContractValue>, Out = Effects>(
  effects: Effects,
  transform: (
    effect: Effect.Effect<unknown, never, never>
  ) => Effect.Effect<unknown, never, never>
): Out

The generic transform primitive: walk every method on a effects object (nested shape leaves + custom methods) and pass each method's returned Effect through transform, then re-nest and re-stamp the TypeId brand. Composes with pipe.

transform is applied uniformly; whether it changes types is expressed through the result:

  • Type-preserving transforms (withSpan / retry / timed, whose signature is Effect<A, E, R> → Effect<A, E, R>) leave the type unchanged — Out defaults to Effects.
  • Type-changing transforms (narrowing E, like catchWriteErrors) supply an explicit Out computed per method by a mapped type (e.g. CatchWriteError), so the change flows through each method precisely.
combinatorseffectsEffectTypeIdcatchWriteErrorsCatchWriteErrorStoreEffectsVariance
Source src/Store.ts:129323 lines
export const mapEffects = <
  Effects extends StoreEffectsVariance<StoreContractValue>,
  Out = Effects,
>(
  effects: Effects,
  transform: (
    effect: Effect.Effect<unknown, never, never>,
  ) => Effect.Effect<unknown, never, never>,
): Out => {
  const flat: Record<string, unknown> = {};
  flattenEffects(effects, "", flat);

  const mapped: Record<string, unknown> = {};
  for (const [path, method] of Object.entries(flat)) {
    mapped[path] = mapMethod(method, transform);
  }

  const built = nestHandle(mapped);
  stampEffectsBrand(built);
  // Same structural-rebuild idiom as `effects`: the mapped object is reassembled by dynamic assignment,
  // so its type is asserted once here (as `Out` — the caller-supplied per-method result, or `Effects`).
  return built as Out;
};
Referenced by 2 symbols