core/converters/location.converter.ts
core/converters/location.converter.ts is a file in Bane's Lab Build Scripts. 35 lines of code and 9 definitions.
import type { Identity, Link, Placed, Placement } from "#types/catalog.types";
import type { IndexPlan } from "#types/index.types";
import { linkOf } from "#core/resolvers/link.resolver";
export const placedOf = function placedOf(placement: Placement | null): Placed {
return { siblings: placement?.siblings ?? null, up: placement?.up ?? null };
};
const neighborAt = function neighborAt(members: readonly Identity[], at: number, site: string): Link | null {
const member = members.find((_, index) => index === at);
return member === undefined ? null : linkOf(member, site, member.title);
};
export const placementsOf = function placementsOf(
plans: readonly IndexPlan[],
identities: readonly Identity[],
site: string,
): ReadonlyMap<string, Placement> {
const known = new Map([...identities, ...plans.map((plan) => plan.identity)].map((held) => [held.ref, held]));
const placements = new Map<string, Placement>();
for (const plan of plans) {
const up = linkOf(plan.identity, site, plan.identity.title);
const members = plan.refs.flatMap((ref) => {
const member = known.get(ref);
return member === undefined ? [] : [member];
});
members.forEach((member, at) => {
if (!placements.has(member.ref)) {
const siblings = {
next: neighborAt(members, at + 1, site),
previous: neighborAt(members, at - 1, site),
};
placements.set(member.ref, { siblings, up });
}
});
}
return placements;
};