import { A as Definition, C as Rules, S as DehydratedState, _ as PermixHooks, c as PermixRuleNotDefinedError, g as Permix, l as CheckArgs, s as PermixNotReadyError, v as RulesPaths } from "../index-BYcbfVQ7.mjs";
import { Context, Effect, Layer } from "effect";

//#region src/effect/permix.d.ts
interface PermixOptions {
  /**
   * Unique identifier for the Effect Context tag. Defaults to a unique string
   * so multiple `createPermix` calls produce isolated instances.
   */
  id?: string;
}
/**
 * Create an Effect-compatible Permix factory.
 *
 * Returns a Context `Tag`, Layer constructors, and Effect-returning helpers
 * that you can use in any Effect program — server or client.
 *
 * @link https://permix.letstri.dev/docs/integrations/effect
 */
declare function createPermix<D extends Definition>(options?: PermixOptions): {
  Tag: Context.Tag<Permix<D>, Permix<D>>;
  layer: (rules?: Rules<D>) => Layer.Layer<Permix<D>, never, never>;
  layerSetup: <E, R>(rules: Effect.Effect<Rules<D>, E, R>) => Layer.Layer<Permix<D>, E, R>;
  setup: (rules: Rules<D>) => Effect.Effect<void, never, Permix<D>>;
  check: (...args: CheckArgs<D>) => Effect.Effect<boolean, PermixNotReadyError | PermixRuleNotDefinedError, Permix<D>>;
  dehydrate: () => Effect.Effect<DehydratedState<D>, PermixNotReadyError, Permix<D>>;
  hydrate: (state: DehydratedState<D>) => Effect.Effect<void, PermixNotReadyError, Permix<D>>;
  isReady: () => Effect.Effect<boolean, never, Permix<D>>;
  isReadyAsync: () => Effect.Effect<void, never, Permix<D>>;
  getRules: () => Effect.Effect<Rules<D> | null, never, Permix<D>>;
  hook: <K extends keyof PermixHooks<D>>(name: K, fn: PermixHooks<D>[K]) => Effect.Effect<() => void, never, Permix<D>>;
  hookOnce: <K extends keyof PermixHooks<D>>(name: K, fn: PermixHooks<D>[K]) => Effect.Effect<void, never, Permix<D>>;
  template: <T = void>(rules: Rules<D> | ((param: T) => Rules<D>)) => (param: T) => Rules<D>;
  id: string;
  $inferDefinition: D;
  $inferPath: RulesPaths<D>;
};
type EffectPermix<D extends Definition> = ReturnType<typeof createPermix<D>>;
//#endregion
export { EffectPermix, PermixOptions, createPermix };