# core/factories/finding.factory.ts

> 34 lines of code and 6 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-factories-finding-factory-ts
Source text: https://banes-lab.com/source/patterns/core/factories/finding.factory.ts.txt

Listed in [core/factories](https://banes-lab.com/api/source/patterns/core/factories.md), after [core/factories/field.factory.ts](https://banes-lab.com/source/patterns/core/factories/field.factory.ts.md) and before [core/factories/graph.factory.ts](https://banes-lab.com/source/patterns/core/factories/graph.factory.ts.md).

## Definitions

- `explanationFinding` (lexical_declaration, line 25, exported)
- `reasonOf` (lexical_declaration, line 7, exported)
- `makeFinding` (lexical_declaration, line 11, exported)
- `EXPLANATION` (lexical_declaration, line 5)
- `base` (lexical_declaration, line 12, exported)
- `withSignificance` (lexical_declaration, line 21, exported)

## Contained in

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

## Uses

- [core/factories/axis.factory.ts](https://banes-lab.com/source/patterns/core/factories/axis.factory.ts.md)

## Used by

- [core/converters/finding.distribution.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.distribution.converter.ts.md)
- [core/converters/finding.graph.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.graph.converter.ts.md)
- [core/converters/finding.sequence.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.sequence.converter.ts.md)
- [core/converters/finding.vector.converter.ts](https://banes-lab.com/source/patterns/core/converters/finding.vector.converter.ts.md)

## Linked from

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

## Source

```typescript
import type { ExplanationSpec, Finding, FindingInput, Narrative } from "#types/finding.types";
import { coordinate } from "#core/factories/axis.factory";
import { mathTypeOf } from "#core/resolvers/math.resolver";

const EXPLANATION = "explanation";

export const reasonOf = function reasonOf(observation: string, explanation: string): Narrative {
    return { explanation, observation };
};

export const makeFinding = function makeFinding(input: FindingInput): Finding {
    const base: Finding = {
        coordinate: input.coordinate,
        field: input.field,
        mathType: mathTypeOf(input.coordinate.analysis),
        name: input.name,
        narrative: input.narrative,
        observation: input.observation,
        support: 0,
    };
    const withSignificance = input.significance === undefined ? base : { ...base, significance: input.significance };
    return input.prediction ? { ...withSignificance, prediction: input.prediction } : withSignificance;
};

export const explanationFinding = function explanationFinding(spec: ExplanationSpec): Finding {
    return makeFinding({
        coordinate: coordinate({
            analysis: spec.analysis,
            ontology: spec.ontology,
            reasoning: EXPLANATION,
            representation: spec.representation,
        }),
        field: spec.field,
        name: spec.name,
        narrative: reasonOf(spec.observed, spec.explained),
        observation: spec.observation,
    });
};
```
