# core/counters/base.counter.ts

> 21 lines of code and 7 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: operations
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-counters-base-counter-ts
Source text: https://banes-lab.com/source/patterns/core/counters/base.counter.ts.txt

Listed in [core/counters](https://banes-lab.com/api/source/patterns/core/counters.md), before [core/counters/dependency.counter.ts](https://banes-lab.com/source/patterns/core/counters/dependency.counter.ts.md).

## Definitions

- `increment` (lexical_declaration, line 9, exported)
- `tally` (lexical_declaration, line 13, exported)
- `maxOf` (lexical_declaration, line 22, exported)
- `sumOf` (lexical_declaration, line 1, exported)
- `total` (lexical_declaration, line 2, exported)
- `counts` (lexical_declaration, line 14, exported)
- `key` (lexical_declaration, line 16, exported)

## Contained in

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

## Used by

- [core/aggregators/representation.distribution.aggregator.ts](https://banes-lab.com/source/patterns/core/aggregators/representation.distribution.aggregator.ts.md)
- [core/aggregators/representation.graph.aggregator.ts](https://banes-lab.com/source/patterns/core/aggregators/representation.graph.aggregator.ts.md)
- [core/aggregators/representation.grid.aggregator.ts](https://banes-lab.com/source/patterns/core/aggregators/representation.grid.aggregator.ts.md)
- [core/aggregators/representation.sequence.aggregator.ts](https://banes-lab.com/source/patterns/core/aggregators/representation.sequence.aggregator.ts.md)
- [core/aggregators/representation.tree.aggregator.ts](https://banes-lab.com/source/patterns/core/aggregators/representation.tree.aggregator.ts.md)
- [core/analyzers/baseline.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/baseline.analyzer.ts.md)
- [core/analyzers/code.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/code.analyzer.ts.md)
- [core/analyzers/definition.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/definition.analyzer.ts.md)
- [core/analyzers/representation.distribution.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/representation.distribution.analyzer.ts.md)
- [core/analyzers/syntax.analyzer.ts](https://banes-lab.com/source/patterns/core/analyzers/syntax.analyzer.ts.md)
- [core/coordinators/page.coordinator.ts](https://banes-lab.com/source/patterns/core/coordinators/page.coordinator.ts.md)
- [core/counters/report.counter.ts](https://banes-lab.com/source/patterns/core/counters/report.counter.ts.md)
- [core/formatters/report.formatter.ts](https://banes-lab.com/source/patterns/core/formatters/report.formatter.ts.md)

## Linked from

- [core/aggregators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-aggregators.md)
- [core/analyzers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-analyzers.md)
- [core/coordinators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-coordinators.md)
- [core/counters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-counters.md)
- [core/formatters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-formatters.md)

## Source

```typescript
export const sumOf = function sumOf(values: Iterable<number>): number {
    let total = 0;
    for (const value of values) {
        total += value;
    }
    return total;
};

export const increment = function increment<K>(counter: Map<K, number>, key: K, by = 1): void {
    counter.set(key, (counter.get(key) ?? 0) + by);
};

export const tally = function tally<T>(items: readonly T[], keyOf: (item: T) => string): Record<string, number> {
    const counts: Record<string, number> = {};
    for (const item of items) {
        const key = keyOf(item);
        counts[key] = (counts[key] ?? 0) + 1;
    }
    return counts;
};

export const maxOf = function maxOf(values: readonly number[]): number {
    return values.reduce((best, value) => Math.max(best, value), 0);
};
```
