Enforcing "At Least One Service Required" in Effect Layer Dependencies
Modeling “at least one service required” in Effect Layer dependencies
Hi, I’m using layered services and I’m trying to enforce an “either/or” dependency at compile-time.
I have a Qdrant service that can work with any subset of embedding services:
DenseEmbedding SparseEmbedding LateEmbedding At layer creation, I currently check using serviceOption(...) for each embedding service and fails if none are present.
This allows building/providing layers that typecheck, but then fail at runtime with “no embedding services configured”.
Is it possible to express in types that Qdrant requires at least one of those embedding services (not necessarily all three).
Simplified shape:
const dense = yield* Effect.serviceOption(DenseEmbedding);const sparse = yield* Effect.serviceOption(SparseEmbedding);const late = yield* Effect.serviceOption(LateEmbedding);if (nonePresent) return yield* new NoEmbeddingServicesConfiguredError();
const dense = yield* Effect.serviceOption(DenseEmbedding);const sparse = yield* Effect.serviceOption(SparseEmbedding);const late = yield* Effect.serviceOption(LateEmbedding);if (nonePresent) return yield* new NoEmbeddingServicesConfiguredError();
I know Effect environments are usually modeled as required intersections (R1 & R2 & ...), but I’m looking for an idiomatic pattern for:
“require one of these services” avoid runtime-only failure when possible
Is the recommended approach to introduce a wrapper capability/tag (e.g. EmbeddingsAvailable) and require that instead, or is there a better pattern for this?