# core/predicates/concern.predicate.ts

> 24 lines of code and 3 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-predicates-concern-predicate-ts
Source text: https://banes-lab.com/source/quality/core/predicates/concern.predicate.ts.txt

Listed in [core/predicates](https://banes-lab.com/api/source/quality/core/predicates.md), after [core/predicates/concept.predicate.ts](https://banes-lab.com/source/quality/core/predicates/concept.predicate.ts.md) and before [core/predicates/config.predicate.ts](https://banes-lab.com/source/quality/core/predicates/config.predicate.ts.md).

## Definitions

- `matchesFilter` (lexical_declaration, line 21, exported)
- `MatchCheck` (type_alias_declaration, line 4)
- `MATCH_CHECKS` (lexical_declaration, line 6)

## Contained in

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

## Used by

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

## Linked from

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

## Source

```typescript
import type { Indices, QualityQueryFilter } from "#types/quality.types";
import type { QualityConcern } from "#types/catalog.types";

type MatchCheck = (indices: Indices, concern: QualityConcern, filter: QualityQueryFilter) => boolean;

const MATCH_CHECKS: readonly MatchCheck[] = [
    (_indices, concern, filter): boolean => filter.numeric === undefined || concern.numeric === filter.numeric,
    (_indices, concern, filter): boolean =>
        filter.crossTool === undefined || concern.toolCount > 1 === filter.crossTool,
    (_indices, concern, filter): boolean =>
        filter.hasConfigOptions === undefined || Boolean(concern.configOptions?.length) === filter.hasConfigOptions,
    (_indices, concern, filter): boolean =>
        typeof filter.minValue !== "number" || (typeof concern.value === "number" && concern.value >= filter.minValue),
    (indices, concern, filter): boolean =>
        typeof filter.tool !== "string" || (indices.concernTools.get(concern.id)?.has(filter.tool) ?? false),
    (indices, concern, filter): boolean =>
        typeof filter.ecosystem !== "string" ||
        (indices.concernEcosystems.get(concern.id)?.has(filter.ecosystem) ?? false),
];

export const matchesFilter = function matchesFilter(
    indices: Indices,
    concern: QualityConcern,
    filter: QualityQueryFilter,
): boolean {
    return MATCH_CHECKS.every((check) => check(indices, concern, filter));
};
```
