# core/counters/metric.counter.ts

> 30 lines of code and 5 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: operations
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-counters-metric-counter-ts
Source text: https://banes-lab.com/source/build-scripts/core/counters/metric.counter.ts.txt

Listed in [core/counters](https://banes-lab.com/api/source/build-scripts/core/counters.md).

## Definitions

- `countedSteps` (lexical_declaration, line 12, exported)
- `gateSteps` (lexical_declaration, line 19, exported)
- `EMPTY_OPTION` (lexical_declaration, line 6)
- `countedRules` (lexical_declaration, line 8, exported)
- `countedGroups` (lexical_declaration, line 30, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import { LOCAL_RULES, PLUGIN_MODULES } from "@ssot/govlab/shared/generated/rule-index.generated.ts";
import type { CategoryGroup } from "#types/metric.types";
import type { Stage } from "@govlab/pipeline/types/stage.types.ts";
import { stagesFor } from "@govlab/pipeline/core/factories/plan.factory.ts";

const EMPTY_OPTION = "";

export const countedRules = function countedRules(): number {
    return Object.keys(LOCAL_RULES).length + PLUGIN_MODULES.length;
};

export const countedSteps = function countedSteps(stages: readonly Stage[]): number {
    return stages.reduce(
        (total, stage) => total + stage.steps.reduce((held, step) => held + (step.parallel?.length ?? 1), 0),
        0,
    );
};

export const gateSteps = function gateSteps(): number {
    return countedSteps(
        stagesFor({
            cleanCommentsIgnore: EMPTY_OPTION,
            hexIgnore: EMPTY_OPTION,
            qualityRoot: EMPTY_OPTION,
            scope: new Set<string>(),
        }).stages,
    );
};

export const countedGroups = function countedGroups(
    groups: readonly CategoryGroup[],
    pick: (group: CategoryGroup) => readonly unknown[] | undefined,
): number {
    return groups.reduce((total, group) => total + (pick(group)?.length ?? 0), 0);
};
```
