Navigation

Implementations

Two complementary surfaces live on this ornament: a typed-spec layer and a consumer-coordination layer.

Typed-spec layer

A define call describes a project that supports multiple interchangeable implementations under a single langName. Each ImplementationDescriptor carries a name and an open capabilities attrset for impl-specific metadata (e.g. invocation flags, version range, supported targets).

select spec implName returns the descriptor or throws if absent. available spec excluded filters out broken/excluded impls. perImpl spec f evaluates f against each impl and returns the results keyed by impl name — the typed analog of dynamic .${implName} projections.

Consumer-coordination layer

defineSystem { langName; implementations; defaultImpl; makeOverridable; allowUserExtensions ? false } returns { impls; withExtras; filterByName } (plus extend when extensions are allowed). The implementations argument is an attrset ({ impl-a = {...}; impl-b = {...}; ... }) so consumers can produce the coordination record without re-shaping input.

withExtras builderFunction args projects per-impl variants under result.${implName} attributes, injects passthru.repl when an impl exposes replWith, and populates passthru.meta.ci.targets with the implementations minus the current one and brokenOn.

filterByName impl xs resolves implementation-specific sources/dependencies — plain values pass through; non-derivation attrsets are treated as per-impl selectors with optional default.

makeBuilder { implsSystem; createPublicAPI; baseToolEnv } recursively wraps a createPublicAPI projection with extend and withTools so downstream consumers receive the full builder surface (not just an impls-system) after extension or tool augmentation. Cross-ornament dependency on mb.ornaments.toolEnv.