# core/converters/closure.converter.ts

> 39 lines of code and 5 definitions.

Tree: Project Scripts
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/scripts#file-scripts-core-converters-closure-converter-ts
Source text: https://banes-lab.com/source/scripts/core/converters/closure.converter.ts.txt

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

## Definitions

- `callDelta` (lexical_declaration, line 23, exported)
- `foldDeltas` (lexical_declaration, line 5, exported)
- `exportDelta` (lexical_declaration, line 34, exported)
- `{ file, fn }` (lexical_declaration, line 24, exported)
- `entries` (lexical_declaration, line 35, exported)

## Contained in

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

## Uses

- [core/predicates/closure.predicate.ts](https://banes-lab.com/source/scripts/core/predicates/closure.predicate.ts.md)

## Used by

- [core/analyzers/closure.analyzer.ts](https://banes-lab.com/source/scripts/core/analyzers/closure.analyzer.ts.md)
- [core/coordinators/closure.coordinator.ts](https://banes-lab.com/source/scripts/core/coordinators/closure.coordinator.ts.md)

## Linked from

- [core/analyzers](https://banes-lab.com/anatomy/scripts/folder-scripts-core-analyzers.md)
- [core/coordinators](https://banes-lab.com/anatomy/scripts/folder-scripts-core-coordinators.md)
- [core/predicates](https://banes-lab.com/anatomy/scripts/folder-scripts-core-predicates.md)

## Source

```typescript
import type { Atom, CallEntry, ExportEntry, FileFlags, GraphDelta, GraphEntries } from "#types/closure.types";
import { EMIT_EVENT, EVENT_FUNCTIONS, SUBSCRIBE_EVENT } from "#configuration/constants/closure.constants";
import { isConsumerCall, isRegisterCall } from "#core/predicates/closure.predicate";

export const foldDeltas = function foldDeltas(deltas: readonly GraphDelta[]): GraphEntries {
    return {
        consumers: deltas.flatMap((delta) => delta.consumers ?? []),
        emits: deltas.flatMap((delta) => delta.emits ?? []),
        eventActivity: deltas.flatMap((delta) => delta.eventActivity ?? []),
        exports: deltas.flatMap((delta) => delta.exports ?? []),
        externalConsumers: deltas.flatMap((delta) => delta.externalConsumers ?? []),
        iconsExports: deltas.flatMap((delta) => delta.iconsExports ?? []),
        idsExports: deltas.flatMap((delta) => delta.idsExports ?? []),
        imports: deltas.flatMap((delta) => delta.imports ?? []),
        interfaces: deltas.flatMap((delta) => delta.interfaces ?? []),
        registers: deltas.flatMap((delta) => delta.registers ?? []),
        sideEffectImports: deltas.flatMap((delta) => delta.sideEffectImports ?? []),
        stringsExports: deltas.flatMap((delta) => delta.stringsExports ?? []),
        subscribes: deltas.flatMap((delta) => delta.subscribes ?? []),
    };
};

export const callDelta = function callDelta(entry: CallEntry, idArg: Atom | null): GraphDelta {
    const { file, fn } = entry;
    return {
        consumers: isConsumerCall(fn) ? [entry] : [],
        emits: fn === EMIT_EVENT ? [{ eventArg: idArg, file }] : [],
        eventActivity: EVENT_FUNCTIONS.has(fn) ? [entry] : [],
        registers: isRegisterCall(fn) ? [entry] : [],
        subscribes: fn === SUBSCRIBE_EVENT ? [{ eventArg: idArg, file }] : [],
    };
};

export const exportDelta = function exportDelta(names: readonly string[], file: string, flags: FileFlags): GraphDelta {
    const entries: ExportEntry[] = names.map((name) => ({ file, name }));
    return {
        exports: entries,
        iconsExports: flags.isIcons ? entries : [],
        idsExports: flags.isIds ? entries : [],
        stringsExports: flags.isStrings ? entries : [],
    };
};
```
