-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgebraFinalized.ts
More file actions
72 lines (66 loc) · 1.67 KB
/
algebraFinalized.ts
File metadata and controls
72 lines (66 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// algebraFinalized.ts
// Event 020: Algebra Evolution
// Algebras with finalization step
import type { ClassifiedAlgebra } from '../meta/algebraClassifier.js';
import { foldArray } from '../domains/fold.js';
/**
* Finalized algebra
*
* Pattern: fold → finalize → result
*
* Many computations follow this pattern:
* 1. Accumulate state via fold
* 2. Transform accumulated state to final result
*
* Example: Average = fold(sum + count) → finalize(sum/count)
*/
export interface FinalizedAlgebra<A, B, R> {
algebra: ClassifiedAlgebra<A, B>;
finalize: (accumulated: B) => R;
name: string;
}
/**
* Create finalized algebra
*/
export function withFinalization<A, B, R>(
algebra: ClassifiedAlgebra<A, B>,
finalize: (acc: B) => R,
name?: string
): FinalizedAlgebra<A, B, R> {
return {
algebra,
finalize,
name: name || `finalized(${algebra.name})`,
};
}
/**
* Compute finalized algebra on data
*/
export function computeFinalized<A, B, R>(
finalized: FinalizedAlgebra<A, B, R>,
data: A[]
): R {
// Step 1: Fold to accumulate
const accumulated = foldArray(
finalized.algebra.fn,
finalized.algebra.properties.identity as B
)(data);
// Step 2: Finalize
return finalized.finalize(accumulated);
}
/**
* Check if finalized algebra can be parallelized
*
* Requirements:
* - Underlying algebra must be CommutativeMonoid
* - Finalization must be applied after parallel reduction
*/
export function canParallelizeFinalized<A, B, R>(
finalized: FinalizedAlgebra<A, B, R>
): boolean {
return (
finalized.algebra.properties.associative &&
finalized.algebra.properties.commutative &&
finalized.algebra.properties.identity !== null
);
}