# core/converters/location.converter.ts

> 35 lines of code and 9 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-converters-location-converter-ts
Source text: https://banes-lab.com/source/build-scripts/core/converters/location.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/build-scripts/core/converters.md), after [core/converters/link.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/link.converter.ts.md) and before [core/converters/markup.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/markup.converter.ts.md).

## Definitions

- `placedOf` (lexical_declaration, line 5, exported)
- `neighborAt` (lexical_declaration, line 9)
- `placementsOf` (lexical_declaration, line 14, exported)
- `known` (lexical_declaration, line 19, exported)
- `placements` (lexical_declaration, line 20, exported)
- `up` (lexical_declaration, line 22, exported)
- `members` (lexical_declaration, line 23, exported)
- `member` (lexical_declaration, line 24, exported)
- `siblings` (lexical_declaration, line 29, exported)

## Contained in

- [core/converters](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-converters.md)

## Source

```typescript
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;
};
```
