@fncts/test 0.0.19 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- package/_cjs/api.cjs +39 -31
- package/_cjs/api.cjs.map +1 -1
- package/_cjs/control/AbstractRunnableSpec.cjs +1 -1
- package/_cjs/control/AbstractRunnableSpec.cjs.map +1 -1
- package/_cjs/control/Annotations/live.cjs +10 -12
- package/_cjs/control/Annotations/live.cjs.map +1 -1
- package/_cjs/control/Assertion/api.cjs +45 -33
- package/_cjs/control/Assertion/api.cjs.map +1 -1
- package/_cjs/control/AssertionIO/api.cjs +20 -14
- package/_cjs/control/AssertionIO/api.cjs.map +1 -1
- package/_cjs/control/DefaultTestReporter/render.cjs +50 -50
- package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -1
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs +20 -16
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -1
- package/_cjs/control/Gen/api/array.cjs +23 -17
- package/_cjs/control/Gen/api/array.cjs.map +1 -1
- package/_cjs/control/Gen/api/char.cjs +2 -2
- package/_cjs/control/Gen/api/char.cjs.map +1 -1
- package/_cjs/control/Gen/api/conc.cjs +35 -26
- package/_cjs/control/Gen/api/conc.cjs.map +1 -1
- package/_cjs/control/Gen/api/double.cjs +8 -8
- package/_cjs/control/Gen/api/double.cjs.map +1 -1
- package/_cjs/control/Gen/api/float.cjs +6 -6
- package/_cjs/control/Gen/api/float.cjs.map +1 -1
- package/_cjs/control/Gen/api/string.cjs +18 -14
- package/_cjs/control/Gen/api/string.cjs.map +1 -1
- package/_cjs/control/Gen/api/struct.cjs +4 -4
- package/_cjs/control/Gen/api/struct.cjs.map +1 -1
- package/_cjs/control/Gen/api.cjs +78 -65
- package/_cjs/control/Gen/api.cjs.map +1 -1
- package/_cjs/control/Gen.cjs.map +1 -1
- package/_cjs/control/Live/definition.cjs +5 -5
- package/_cjs/control/Live/definition.cjs.map +1 -1
- package/_cjs/control/RunnableSpec.cjs +8 -8
- package/_cjs/control/RunnableSpec.cjs.map +1 -1
- package/_cjs/control/Sample/api.cjs +66 -52
- package/_cjs/control/Sample/api.cjs.map +1 -1
- package/_cjs/control/Sized/live.cjs +3 -3
- package/_cjs/control/Sized/live.cjs.map +1 -1
- package/_cjs/control/Spec/api.cjs +322 -286
- package/_cjs/control/Spec/api.cjs.map +1 -1
- package/_cjs/control/Spec/definition.cjs.map +1 -1
- package/_cjs/control/SummaryBuilder.cjs +10 -10
- package/_cjs/control/SummaryBuilder.cjs.map +1 -1
- package/_cjs/control/Test.cjs +1 -1
- package/_cjs/control/Test.cjs.map +1 -1
- package/_cjs/control/TestAnnotationRenderer/api.cjs +28 -26
- package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -1
- package/_cjs/control/TestAnnotationRenderer/definition.cjs +2 -2
- package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -1
- package/_cjs/control/TestAspect/api.cjs +14 -14
- package/_cjs/control/TestAspect/api.cjs.map +1 -1
- package/_cjs/control/TestClock/api.cjs +9 -11
- package/_cjs/control/TestClock/api.cjs.map +1 -1
- package/_cjs/control/TestClock/definition.cjs +65 -75
- package/_cjs/control/TestClock/definition.cjs.map +1 -1
- package/_cjs/control/TestConsole/api.cjs +3 -3
- package/_cjs/control/TestConsole/api.cjs.map +1 -1
- package/_cjs/control/TestConsole/definition.cjs +20 -24
- package/_cjs/control/TestConsole/definition.cjs.map +1 -1
- package/_cjs/control/TestEnvironment.cjs +3 -3
- package/_cjs/control/TestEnvironment.cjs.map +1 -1
- package/_cjs/control/TestExecutor.cjs +3 -3
- package/_cjs/control/TestExecutor.cjs.map +1 -1
- package/_cjs/control/TestLogger.cjs +2 -2
- package/_cjs/control/TestLogger.cjs.map +1 -1
- package/_cjs/control/TestRandom/api.cjs +9 -9
- package/_cjs/control/TestRandom/api.cjs.map +1 -1
- package/_cjs/control/TestRandom/definition.cjs +65 -71
- package/_cjs/control/TestRandom/definition.cjs.map +1 -1
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +11 -11
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -1
- package/_cjs/control/TestRunner.cjs +1 -1
- package/_cjs/control/TestRunner.cjs.map +1 -1
- package/_cjs/data/AssertionValue/api.cjs +22 -14
- package/_cjs/data/AssertionValue/api.cjs.map +1 -1
- package/_cjs/data/AssertionValue/definition.cjs.map +1 -1
- package/_cjs/data/ExecutedSpec/api.cjs +61 -53
- package/_cjs/data/ExecutedSpec/api.cjs.map +1 -1
- package/_cjs/data/ExecutionResult.cjs +42 -38
- package/_cjs/data/ExecutionResult.cjs.map +1 -1
- package/_cjs/data/FreeBooleanAlgebra/api.cjs +93 -77
- package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -1
- package/_cjs/data/LogLine/Fragment.cjs +2 -2
- package/_cjs/data/LogLine/Fragment.cjs.map +1 -1
- package/_cjs/data/LogLine/Line.cjs +11 -9
- package/_cjs/data/LogLine/Line.cjs.map +1 -1
- package/_cjs/data/LogLine/Message.cjs +32 -24
- package/_cjs/data/LogLine/Message.cjs.map +1 -1
- package/_cjs/data/LogLine/Style.cjs.map +1 -1
- package/_cjs/data/Render/definition.cjs +1 -1
- package/_cjs/data/Render/definition.cjs.map +1 -1
- package/_cjs/data/TestAnnotation/api.cjs +2 -2
- package/_cjs/data/TestAnnotation/api.cjs.map +1 -1
- package/_cjs/data/TestAnnotation/definition.cjs.map +1 -1
- package/_cjs/data/TestAnnotationMap.cjs +3 -3
- package/_cjs/data/TestAnnotationMap.cjs.map +1 -1
- package/_cjs/demo.cjs +5 -5
- package/_cjs/demo.cjs.map +1 -1
- package/_cjs/util/math.cjs +6 -6
- package/_cjs/util/math.cjs.map +1 -1
- package/_mjs/api.mjs +37 -29
- package/_mjs/api.mjs.map +1 -1
- package/_mjs/control/AbstractRunnableSpec.mjs +1 -1
- package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -1
- package/_mjs/control/Annotations/live.mjs +10 -11
- package/_mjs/control/Annotations/live.mjs.map +1 -1
- package/_mjs/control/Assertion/api.mjs +40 -28
- package/_mjs/control/Assertion/api.mjs.map +1 -1
- package/_mjs/control/AssertionIO/api.mjs +17 -11
- package/_mjs/control/AssertionIO/api.mjs.map +1 -1
- package/_mjs/control/DefaultTestReporter/render.mjs +50 -50
- package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -1
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs +18 -14
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -1
- package/_mjs/control/Gen/api/array.mjs +20 -14
- package/_mjs/control/Gen/api/array.mjs.map +1 -1
- package/_mjs/control/Gen/api/char.mjs +2 -2
- package/_mjs/control/Gen/api/char.mjs.map +1 -1
- package/_mjs/control/Gen/api/conc.mjs +30 -22
- package/_mjs/control/Gen/api/conc.mjs.map +1 -1
- package/_mjs/control/Gen/api/double.mjs +8 -8
- package/_mjs/control/Gen/api/double.mjs.map +1 -1
- package/_mjs/control/Gen/api/float.mjs +6 -6
- package/_mjs/control/Gen/api/float.mjs.map +1 -1
- package/_mjs/control/Gen/api/string.mjs +18 -14
- package/_mjs/control/Gen/api/string.mjs.map +1 -1
- package/_mjs/control/Gen/api/struct.mjs +4 -4
- package/_mjs/control/Gen/api/struct.mjs.map +1 -1
- package/_mjs/control/Gen/api.mjs +68 -54
- package/_mjs/control/Gen/api.mjs.map +1 -1
- package/_mjs/control/Gen.mjs.map +1 -1
- package/_mjs/control/Live/definition.mjs +5 -5
- package/_mjs/control/Live/definition.mjs.map +1 -1
- package/_mjs/control/RunnableSpec.mjs +8 -8
- package/_mjs/control/RunnableSpec.mjs.map +1 -1
- package/_mjs/control/Sample/api.mjs +57 -43
- package/_mjs/control/Sample/api.mjs.map +1 -1
- package/_mjs/control/Sized/live.mjs +3 -3
- package/_mjs/control/Sized/live.mjs.map +1 -1
- package/_mjs/control/Spec/api.mjs +300 -265
- package/_mjs/control/Spec/api.mjs.map +1 -1
- package/_mjs/control/Spec/definition.mjs.map +1 -1
- package/_mjs/control/SummaryBuilder.mjs +10 -10
- package/_mjs/control/SummaryBuilder.mjs.map +1 -1
- package/_mjs/control/Test.mjs +1 -1
- package/_mjs/control/Test.mjs.map +1 -1
- package/_mjs/control/TestAnnotationRenderer/api.mjs +27 -25
- package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -1
- package/_mjs/control/TestAnnotationRenderer/definition.mjs +2 -2
- package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -1
- package/_mjs/control/TestAspect/api.mjs +14 -14
- package/_mjs/control/TestAspect/api.mjs.map +1 -1
- package/_mjs/control/TestClock/api.mjs +9 -10
- package/_mjs/control/TestClock/api.mjs.map +1 -1
- package/_mjs/control/TestClock/definition.mjs +65 -72
- package/_mjs/control/TestClock/definition.mjs.map +1 -1
- package/_mjs/control/TestConsole/api.mjs +3 -3
- package/_mjs/control/TestConsole/api.mjs.map +1 -1
- package/_mjs/control/TestConsole/definition.mjs +20 -22
- package/_mjs/control/TestConsole/definition.mjs.map +1 -1
- package/_mjs/control/TestEnvironment.mjs +3 -3
- package/_mjs/control/TestEnvironment.mjs.map +1 -1
- package/_mjs/control/TestExecutor.mjs +3 -3
- package/_mjs/control/TestExecutor.mjs.map +1 -1
- package/_mjs/control/TestLogger.mjs +2 -2
- package/_mjs/control/TestLogger.mjs.map +1 -1
- package/_mjs/control/TestRandom/api.mjs +9 -9
- package/_mjs/control/TestRandom/api.mjs.map +1 -1
- package/_mjs/control/TestRandom/definition.mjs +65 -68
- package/_mjs/control/TestRandom/definition.mjs.map +1 -1
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +11 -11
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -1
- package/_mjs/control/TestRunner.mjs +1 -1
- package/_mjs/control/TestRunner.mjs.map +1 -1
- package/_mjs/data/AssertionValue/api.mjs +22 -14
- package/_mjs/data/AssertionValue/api.mjs.map +1 -1
- package/_mjs/data/AssertionValue/definition.mjs.map +1 -1
- package/_mjs/data/ExecutedSpec/api.mjs +55 -47
- package/_mjs/data/ExecutedSpec/api.mjs.map +1 -1
- package/_mjs/data/ExecutionResult.mjs +40 -36
- package/_mjs/data/ExecutionResult.mjs.map +1 -1
- package/_mjs/data/FreeBooleanAlgebra/api.mjs +81 -65
- package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -1
- package/_mjs/data/LogLine/Fragment.mjs +2 -2
- package/_mjs/data/LogLine/Fragment.mjs.map +1 -1
- package/_mjs/data/LogLine/Line.mjs +11 -9
- package/_mjs/data/LogLine/Line.mjs.map +1 -1
- package/_mjs/data/LogLine/Message.mjs +26 -18
- package/_mjs/data/LogLine/Message.mjs.map +1 -1
- package/_mjs/data/LogLine/Style.mjs.map +1 -1
- package/_mjs/data/Render/definition.mjs +1 -1
- package/_mjs/data/Render/definition.mjs.map +1 -1
- package/_mjs/data/TestAnnotation/api.mjs +2 -2
- package/_mjs/data/TestAnnotation/api.mjs.map +1 -1
- package/_mjs/data/TestAnnotation/definition.mjs.map +1 -1
- package/_mjs/data/TestAnnotationMap.mjs +3 -3
- package/_mjs/data/TestAnnotationMap.mjs.map +1 -1
- package/_mjs/demo.mjs +5 -5
- package/_mjs/demo.mjs.map +1 -1
- package/_mjs/util/math.mjs +6 -6
- package/_mjs/util/math.mjs.map +1 -1
- package/_src/api.ts +36 -35
- package/_src/control/AbstractRunnableSpec.ts +0 -3
- package/_src/control/Annotations/live.ts +0 -4
- package/_src/control/Assertion/api.ts +31 -20
- package/_src/control/AssertionIO/api.ts +23 -17
- package/_src/control/DefaultTestReporter/render.ts +1 -11
- package/_src/control/FreeBooleanAlgebraIO/api.ts +12 -14
- package/_src/control/Gen/api/array.ts +18 -15
- package/_src/control/Gen/api/conc.ts +31 -26
- package/_src/control/Gen/api/string.ts +13 -9
- package/_src/control/Gen/api/struct.ts +12 -2
- package/_src/control/Gen/api.ts +56 -40
- package/_src/control/Gen.ts +0 -1
- package/_src/control/Live/definition.ts +0 -4
- package/_src/control/Sample/api.ts +77 -66
- package/_src/control/Spec/api.ts +235 -222
- package/_src/control/Spec/definition.ts +0 -2
- package/_src/control/SummaryBuilder.ts +0 -1
- package/_src/control/TestAnnotationRenderer/api.ts +17 -15
- package/_src/control/TestAnnotationRenderer/definition.ts +0 -2
- package/_src/control/TestAspect/api.ts +0 -1
- package/_src/control/TestClock/definition.ts +4 -17
- package/_src/control/TestConsole/definition.ts +0 -1
- package/_src/control/TestLogger.ts +0 -2
- package/_src/control/TestRandom/api.ts +5 -0
- package/_src/control/TestRandom/definition.ts +3 -37
- package/_src/control/TestRenderer/ConsoleRenderer.ts +0 -1
- package/_src/data/AssertionValue/api.ts +26 -22
- package/_src/data/AssertionValue/definition.ts +0 -1
- package/_src/data/ExecutedSpec/api.ts +41 -36
- package/_src/data/ExecutionResult.ts +54 -51
- package/_src/data/FreeBooleanAlgebra/api.ts +68 -58
- package/_src/data/LogLine/Line.ts +5 -3
- package/_src/data/LogLine/Message.ts +26 -18
- package/_src/data/LogLine/Style.ts +0 -1
- package/_src/data/Render/definition.ts +0 -2
- package/_src/data/TestAnnotation/api.ts +3 -1
- package/_src/data/TestAnnotation/definition.ts +0 -3
- package/_src/data/TestAnnotationMap.ts +0 -6
- package/_src/demo.ts +3 -4
- package/_src/util/math.ts +31 -17
- package/api.d.ts +12 -12
- package/control/Assertion/api.d.ts +14 -10
- package/control/AssertionIO/api.d.ts +8 -8
- package/control/FreeBooleanAlgebraIO/api.d.ts +6 -6
- package/control/Gen/api/array.d.ts +6 -6
- package/control/Gen/api/conc.d.ts +8 -8
- package/control/Gen/api/string.d.ts +4 -4
- package/control/Gen/api.d.ts +15 -15
- package/control/Sample/api.d.ts +14 -14
- package/control/Spec/api.d.ts +38 -41
- package/control/TestAnnotationRenderer/api.d.ts +3 -3
- package/control/TestConsole/definition.d.ts +2 -2
- package/data/AssertionValue/api.d.ts +8 -8
- package/data/ExecutedSpec/api.d.ts +8 -8
- package/data/ExecutionResult.d.ts +4 -4
- package/data/FreeBooleanAlgebra/api.d.ts +20 -20
- package/data/LogLine/Line.d.ts +2 -2
- package/data/LogLine/Message.d.ts +10 -10
- package/package.json +3 -3
@@ -67,7 +67,6 @@ export class ExecutionResult {
|
|
67
67
|
readonly annotations: List<TestAnnotationMap>,
|
68
68
|
readonly lines: List<Line>,
|
69
69
|
) {}
|
70
|
-
|
71
70
|
withAnnotations(annotations: List<TestAnnotationMap>): ExecutionResult {
|
72
71
|
return new ExecutionResult(this.resultType, this.label, this.status, this.offset, annotations, this.lines);
|
73
72
|
}
|
@@ -84,61 +83,65 @@ export function rendered(
|
|
84
83
|
}
|
85
84
|
|
86
85
|
/**
|
87
|
-
* @tsplus operator fncts.test.ExecutionResult &&
|
86
|
+
* @tsplus pipeable-operator fncts.test.ExecutionResult &&
|
88
87
|
*/
|
89
|
-
export function
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
88
|
+
export function and(that: ExecutionResult) {
|
89
|
+
return (self: ExecutionResult): ExecutionResult => {
|
90
|
+
if (self.status._tag === "Ignored") {
|
91
|
+
return that;
|
92
|
+
}
|
93
|
+
if (that.status._tag === "Ignored") {
|
94
|
+
return self;
|
95
|
+
}
|
96
|
+
if (self.status._tag === "Failed" && that.status._tag === "Failed") {
|
97
|
+
return new ExecutionResult(
|
98
|
+
self.resultType,
|
99
|
+
self.label,
|
100
|
+
self.status,
|
101
|
+
self.offset,
|
102
|
+
self.annotations,
|
103
|
+
self.lines.concat(that.lines.tail.getOrElse(Nil())),
|
104
|
+
);
|
105
|
+
}
|
106
|
+
if (self.status._tag === "Passed") {
|
107
|
+
return that;
|
108
|
+
}
|
109
|
+
if (that.status._tag === "Passed") {
|
110
|
+
return self;
|
111
|
+
}
|
112
|
+
throw new Error("BUG");
|
113
|
+
};
|
113
114
|
}
|
114
115
|
|
115
116
|
/**
|
116
|
-
* @tsplus operator fncts.test.ExecutionResult ||
|
117
|
+
* @tsplus pipeable-operator fncts.test.ExecutionResult ||
|
117
118
|
*/
|
118
|
-
export function
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
119
|
+
export function or(that: ExecutionResult) {
|
120
|
+
return (self: ExecutionResult): ExecutionResult => {
|
121
|
+
if (self.status._tag === "Ignored") {
|
122
|
+
return that;
|
123
|
+
}
|
124
|
+
if (that.status._tag === "Ignored") {
|
125
|
+
return self;
|
126
|
+
}
|
127
|
+
if (self.status._tag === "Failed" && that.status._tag === "Failed") {
|
128
|
+
return new ExecutionResult(
|
129
|
+
self.resultType,
|
130
|
+
self.label,
|
131
|
+
self.status,
|
132
|
+
self.offset,
|
133
|
+
self.annotations,
|
134
|
+
self.lines.concat(that.lines.tail.getOrElse(Nil())),
|
135
|
+
);
|
136
|
+
}
|
137
|
+
if (self.status._tag === "Passed") {
|
138
|
+
return self;
|
139
|
+
}
|
140
|
+
if (that.status._tag === "Passed") {
|
141
|
+
return that;
|
142
|
+
}
|
143
|
+
throw new Error("BUG");
|
144
|
+
};
|
142
145
|
}
|
143
146
|
|
144
147
|
/**
|
@@ -1,30 +1,36 @@
|
|
1
1
|
import { And, FreeBooleanAlgebra, FreeBooleanAlgebraTag, Not, Or, Value } from "./definition.js";
|
2
2
|
|
3
3
|
/**
|
4
|
-
* @tsplus
|
5
|
-
* @tsplus operator fncts.test.FreeBooleanAlgebra &&
|
4
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra and
|
5
|
+
* @tsplus pipeable-operator fncts.test.FreeBooleanAlgebra &&
|
6
6
|
*/
|
7
|
-
export function
|
8
|
-
return
|
7
|
+
export function and<A>(right: FreeBooleanAlgebra<A>) {
|
8
|
+
return (left: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<A> => {
|
9
|
+
return new And(left, right);
|
10
|
+
};
|
9
11
|
}
|
10
12
|
|
11
13
|
/**
|
12
|
-
* @tsplus
|
14
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra flatMap
|
13
15
|
*/
|
14
|
-
export function
|
15
|
-
return self
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
export function flatMap<A, B>(f: (a: A) => FreeBooleanAlgebra<B>) {
|
17
|
+
return (self: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<B> => {
|
18
|
+
return self.fold({
|
19
|
+
Value: f,
|
20
|
+
And: (l, r) => l && r,
|
21
|
+
Or: (l, r) => l || r,
|
22
|
+
Not: (v) => v.invert,
|
23
|
+
});
|
24
|
+
};
|
21
25
|
}
|
22
26
|
|
23
27
|
/**
|
24
|
-
* @tsplus
|
28
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra map
|
25
29
|
*/
|
26
|
-
export function
|
27
|
-
return self
|
30
|
+
export function map<A, B>(f: (a: A) => B) {
|
31
|
+
return (self: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<B> => {
|
32
|
+
return self.flatMap((a) => FreeBooleanAlgebra.success(f(a)));
|
33
|
+
};
|
28
34
|
}
|
29
35
|
|
30
36
|
/**
|
@@ -69,58 +75,60 @@ export function failures<A>(self: FreeBooleanAlgebra<A>): Maybe<FreeBooleanAlgeb
|
|
69
75
|
}
|
70
76
|
|
71
77
|
/**
|
72
|
-
* @tsplus
|
78
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra foldEval
|
73
79
|
*/
|
74
|
-
export function
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
});
|
80
|
+
export function foldEval<A, B>(cases: {
|
81
|
+
Value: (value: A) => B;
|
82
|
+
And: (left: B, right: B) => B;
|
83
|
+
Or: (left: B, right: B) => B;
|
84
|
+
Not: (value: B) => B;
|
85
|
+
}) {
|
86
|
+
return (self: FreeBooleanAlgebra<A>): Eval<B> => {
|
87
|
+
return Eval.defer(() => {
|
88
|
+
switch (self._tag) {
|
89
|
+
case FreeBooleanAlgebraTag.Value:
|
90
|
+
return Eval.now(cases.Value(self.value));
|
91
|
+
case FreeBooleanAlgebraTag.And:
|
92
|
+
return self.left.foldEval(cases).zipWith(self.right.foldEval(cases), cases.And);
|
93
|
+
case FreeBooleanAlgebraTag.Or:
|
94
|
+
return self.left.foldEval(cases).zipWith(self.right.foldEval(cases), cases.Or);
|
95
|
+
case FreeBooleanAlgebraTag.Not:
|
96
|
+
return self.result.foldEval(cases).map(cases.Not);
|
97
|
+
}
|
98
|
+
});
|
99
|
+
};
|
95
100
|
}
|
96
101
|
|
97
102
|
/**
|
98
|
-
* @tsplus
|
103
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra fold
|
99
104
|
*/
|
100
|
-
export function
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
return self.foldEval(cases).run;
|
105
|
+
export function fold<A, B>(cases: {
|
106
|
+
Value: (value: A) => B;
|
107
|
+
And: (left: B, right: B) => B;
|
108
|
+
Or: (left: B, right: B) => B;
|
109
|
+
Not: (value: B) => B;
|
110
|
+
}) {
|
111
|
+
return (self: FreeBooleanAlgebra<A>): B => {
|
112
|
+
return self.foldEval(cases).run;
|
113
|
+
};
|
110
114
|
}
|
111
115
|
|
112
116
|
/**
|
113
|
-
* @tsplus
|
117
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra iff
|
114
118
|
*/
|
115
|
-
export function
|
116
|
-
return left
|
119
|
+
export function iff<A>(right: FreeBooleanAlgebra<A>) {
|
120
|
+
return (left: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<A> => {
|
121
|
+
return left.implies(right) && right.implies(left);
|
122
|
+
};
|
117
123
|
}
|
118
124
|
|
119
125
|
/**
|
120
|
-
* @tsplus
|
126
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra implies
|
121
127
|
*/
|
122
|
-
export function
|
123
|
-
return left
|
128
|
+
export function implies<A>(right: FreeBooleanAlgebra<A>) {
|
129
|
+
return (left: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<A> => {
|
130
|
+
return left.invert || right;
|
131
|
+
};
|
124
132
|
}
|
125
133
|
|
126
134
|
/**
|
@@ -150,11 +158,13 @@ export function not<A>(self: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<A> {
|
|
150
158
|
}
|
151
159
|
|
152
160
|
/**
|
153
|
-
* @tsplus
|
154
|
-
* @tsplus operator fncts.test.FreeBooleanAlgebra ||
|
161
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebra or
|
162
|
+
* @tsplus pipeable-operator fncts.test.FreeBooleanAlgebra ||
|
155
163
|
*/
|
156
|
-
export function
|
157
|
-
return
|
164
|
+
export function or<A>(right: FreeBooleanAlgebra<A>) {
|
165
|
+
return (left: FreeBooleanAlgebra<A>): FreeBooleanAlgebra<A> => {
|
166
|
+
return new Or(left, right);
|
167
|
+
};
|
158
168
|
}
|
159
169
|
|
160
170
|
/**
|
@@ -57,10 +57,12 @@ export function prependTo(self: Line, message: Message): Message {
|
|
57
57
|
}
|
58
58
|
|
59
59
|
/**
|
60
|
-
* @tsplus
|
60
|
+
* @tsplus pipeable fncts.test.data.Line withOffset
|
61
61
|
*/
|
62
|
-
export function withOffset(
|
63
|
-
return
|
62
|
+
export function withOffset(shift: number) {
|
63
|
+
return (self: Line): Line => {
|
64
|
+
return new Line(self.fragments, self.offset + shift);
|
65
|
+
};
|
64
66
|
}
|
65
67
|
|
66
68
|
/**
|
@@ -44,14 +44,14 @@ export function prependFragment(fragment: Fragment, self: Message): Message {
|
|
44
44
|
/**
|
45
45
|
* @tsplus operator fncts.test.data.Message +
|
46
46
|
*/
|
47
|
-
export function
|
47
|
+
export function concat(self: Message, that: Message): Message {
|
48
48
|
return Message(self.lines.concat(that.lines));
|
49
49
|
}
|
50
50
|
|
51
51
|
/**
|
52
52
|
* @tsplus operator fncts.test.data.Message |
|
53
53
|
*/
|
54
|
-
export function
|
54
|
+
export function combine(self: Message, that: Message): Message {
|
55
55
|
const last = self.lines.last;
|
56
56
|
const head = that.lines.head;
|
57
57
|
if (last.isJust() && head.isJust()) {
|
@@ -62,33 +62,41 @@ export function combine_(self: Message, that: Message): Message {
|
|
62
62
|
}
|
63
63
|
|
64
64
|
/**
|
65
|
-
* @tsplus
|
65
|
+
* @tsplus pipeable fncts.test.data.Message drop
|
66
66
|
*/
|
67
|
-
export function
|
68
|
-
return
|
67
|
+
export function drop(n: number) {
|
68
|
+
return (self: Message): Message => {
|
69
|
+
return Message(self.lines.drop(n));
|
70
|
+
};
|
69
71
|
}
|
70
72
|
|
71
73
|
/**
|
72
|
-
* @tsplus
|
74
|
+
* @tsplus pipeable fncts.test.data.Message map
|
73
75
|
*/
|
74
|
-
export function
|
75
|
-
return
|
76
|
+
export function map(f: (line: Line) => Line) {
|
77
|
+
return (self: Message): Message => {
|
78
|
+
return Message(self.lines.map(f));
|
79
|
+
};
|
76
80
|
}
|
77
81
|
|
78
82
|
/**
|
79
|
-
* @tsplus
|
83
|
+
* @tsplus pipeable fncts.test.data.Message withOffset
|
80
84
|
*/
|
81
|
-
export function withOffset(
|
82
|
-
return self
|
85
|
+
export function withOffset(offset: number) {
|
86
|
+
return (self: Message): Message => {
|
87
|
+
return self.map((line) => line.withOffset(offset));
|
88
|
+
};
|
83
89
|
}
|
84
90
|
|
85
91
|
/**
|
86
|
-
* @tsplus
|
92
|
+
* @tsplus pipeable fncts.test.data.Message intersperse
|
87
93
|
*/
|
88
|
-
export function intersperse(
|
89
|
-
return
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
+
export function intersperse(line: Line) {
|
95
|
+
return (self: Message): Message => {
|
96
|
+
return new Message(
|
97
|
+
Vector.from(
|
98
|
+
self.lines.foldRight(List.empty<Line>(), (ln, rest) => Cons(ln, rest.isEmpty() ? Nil() : Cons(line, rest))),
|
99
|
+
),
|
100
|
+
);
|
101
|
+
};
|
94
102
|
}
|
@@ -8,7 +8,6 @@ export const enum RenderTag {
|
|
8
8
|
export class RenderFunction {
|
9
9
|
readonly _tag = RenderTag.Function;
|
10
10
|
constructor(readonly name: string, readonly paramLists: Conc<Conc<RenderParam>>) {}
|
11
|
-
|
12
11
|
get rendered(): string {
|
13
12
|
return `${this.name}(${this.paramLists.map((ps) => ps.map((p) => p.rendered).join(", ")).join("")})`;
|
14
13
|
}
|
@@ -17,7 +16,6 @@ export class RenderFunction {
|
|
17
16
|
export class RenderInfix {
|
18
17
|
readonly _tag = RenderTag.Infix;
|
19
18
|
constructor(readonly left: RenderParam, readonly op: string, readonly right: RenderParam) {}
|
20
|
-
|
21
19
|
get rendered(): string {
|
22
20
|
return `(${this.left.rendered} ${this.op} ${this.right.rendered})`;
|
23
21
|
}
|
@@ -30,7 +30,9 @@ export const TimingTag = Tag<number>("fncts.test.TestAnnotation.Timing");
|
|
30
30
|
*/
|
31
31
|
export const Timing = new TestAnnotation(TimingTag, "timing", 0, (x, y) => x + y);
|
32
32
|
|
33
|
-
export const FibersTag = Tag<Either<number, Conc<Ref<HashSet<Fiber.Runtime<any, any>>>>>>(
|
33
|
+
export const FibersTag = Tag<Either<number, Conc<Ref<HashSet<Fiber.Runtime<any, any>>>>>>(
|
34
|
+
"fncts.test.TestAnnotation.Fibers",
|
35
|
+
);
|
34
36
|
/**
|
35
37
|
* @tsplus static fncts.test.TestAnnotationOps Fibers
|
36
38
|
*/
|
@@ -10,18 +10,15 @@ export type TestAnnotationTypeId = typeof TestAnnotationTypeId;
|
|
10
10
|
export class TestAnnotation<V> implements Hashable, Equatable {
|
11
11
|
readonly _typeId: TestAnnotationTypeId = TestAnnotationTypeId;
|
12
12
|
readonly _V!: () => V;
|
13
|
-
|
14
13
|
constructor(
|
15
14
|
readonly tag: Tag<V>,
|
16
15
|
readonly identifier: string,
|
17
16
|
readonly initial: V,
|
18
17
|
readonly combine: (v1: V, v2: V) => V,
|
19
18
|
) {}
|
20
|
-
|
21
19
|
get [Symbol.hash]() {
|
22
20
|
return Hashable.combine(Hashable.string(this.identifier), Hashable.unknown(this.tag));
|
23
21
|
}
|
24
|
-
|
25
22
|
[Symbol.equals](that: unknown) {
|
26
23
|
return (
|
27
24
|
isTestAnnotation(that) &&
|
@@ -4,7 +4,6 @@ import { identity } from "@fncts/base/data/function";
|
|
4
4
|
|
5
5
|
export class TestAnnotationMap {
|
6
6
|
constructor(private readonly map: HashMap<TestAnnotation<any>, any>) {}
|
7
|
-
|
8
7
|
combine(that: TestAnnotationMap): TestAnnotationMap {
|
9
8
|
return new TestAnnotationMap(
|
10
9
|
Conc.from(this.map)
|
@@ -20,22 +19,17 @@ export class TestAnnotationMap {
|
|
20
19
|
),
|
21
20
|
);
|
22
21
|
}
|
23
|
-
|
24
22
|
get<V>(key: TestAnnotation<V>): V {
|
25
23
|
return this.map.get(key).match(() => key.initial, identity);
|
26
24
|
}
|
27
|
-
|
28
25
|
private overwrite<V>(key: TestAnnotation<V>, value: V): TestAnnotationMap {
|
29
26
|
return new TestAnnotationMap(this.map.set(key, value));
|
30
27
|
}
|
31
|
-
|
32
28
|
private update<V>(key: TestAnnotation<V>, f: (v: V) => V): TestAnnotationMap {
|
33
29
|
return this.overwrite(key, f(this.get(key)));
|
34
30
|
}
|
35
|
-
|
36
31
|
annotate<V>(key: TestAnnotation<V>, value: V): TestAnnotationMap {
|
37
32
|
return this.update(key, (_) => key.combine(_, value));
|
38
33
|
}
|
39
|
-
|
40
34
|
static empty: TestAnnotationMap = new TestAnnotationMap(HashMap.makeDefault());
|
41
35
|
}
|
package/_src/demo.ts
CHANGED
@@ -2,9 +2,9 @@ import { DefaultRunnableSpec } from "@fncts/test/control/DefaultRunnableSpec";
|
|
2
2
|
|
3
3
|
import { suite, test, testIO } from "./api.js";
|
4
4
|
import { strictEqualTo } from "./control/Assertion.js";
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
const ServiceATag = Tag<{
|
6
|
+
x: number;
|
7
|
+
}>("fncts.test.demo.ServiceA");
|
8
8
|
class DemoSpec extends DefaultRunnableSpec {
|
9
9
|
spec = suite(
|
10
10
|
"TestSuite",
|
@@ -12,5 +12,4 @@ class DemoSpec extends DefaultRunnableSpec {
|
|
12
12
|
test("Demo failure", { a: { b: { c: { d: 100 } } } }.assert(strictEqualTo({ a: { b: { c: { d: 0 } } } }))),
|
13
13
|
);
|
14
14
|
}
|
15
|
-
|
16
15
|
new DemoSpec().main();
|
package/_src/util/math.ts
CHANGED
@@ -4,7 +4,6 @@ export const MIN_VALUE_32 = 2 ** -126 * 2 ** -23;
|
|
4
4
|
export const MAX_VALUE_32 = 2 ** 127 * (1 + (2 ** 23 - 1) / 2 ** 23);
|
5
5
|
/** @internal */
|
6
6
|
export const EPSILON_32 = 2 ** -23;
|
7
|
-
|
8
7
|
/** @internal */
|
9
8
|
const INDEX_POSITIVE_INFINITY_32 = 2139095040; // floatToIndex(MAX_VALUE_32) + 1;
|
10
9
|
/** @internal */
|
@@ -23,7 +22,10 @@ export function safeFloatToIndex(f: number, label: string): IO<never, never, num
|
|
23
22
|
return IO.succeedNow(index);
|
24
23
|
}
|
25
24
|
|
26
|
-
export function decomposeFloat(f: number): {
|
25
|
+
export function decomposeFloat(f: number): {
|
26
|
+
exponent: number;
|
27
|
+
significand: number;
|
28
|
+
} {
|
27
29
|
// 1 => significand 0b1 - exponent 1 (will be preferred)
|
28
30
|
// => significand 0b0.1 - exponent 2
|
29
31
|
const maxSignificand = 1 + (2 ** 23 - 1) / 2 ** 23;
|
@@ -45,11 +47,9 @@ export function floatToIndex(f: number): number {
|
|
45
47
|
return INDEX_NEGATIVE_INFINITY_32;
|
46
48
|
}
|
47
49
|
const { exponent, significand } = decomposeFloat(f);
|
48
|
-
|
49
50
|
if (Number.isNaN(exponent) || Number.isNaN(significand) || !Number.isInteger(significand * 0x800000)) {
|
50
51
|
return Number.NaN;
|
51
52
|
}
|
52
|
-
|
53
53
|
if (f > 0 || (f === 0 && 1 / f === Number.POSITIVE_INFINITY)) {
|
54
54
|
return indexInFloatFromDecomp(exponent, significand);
|
55
55
|
} else {
|
@@ -60,10 +60,8 @@ export function floatToIndex(f: number): number {
|
|
60
60
|
/** @internal */
|
61
61
|
export function indexInFloatFromDecomp(exponent: number, significand: number) {
|
62
62
|
// WARNING: significand >= 0
|
63
|
-
|
64
63
|
// By construct of significand in decomposeFloat,
|
65
64
|
// significand is always max-ed.
|
66
|
-
|
67
65
|
// The float close to zero are the only one having a significand <1, they also have an exponent of -126.
|
68
66
|
// They are in range: [2**(-126) * 2**(-23), 2**(-126) * (2 - 2 ** 23)]
|
69
67
|
// In other words there are 2**24 elements in that range if we include zero.
|
@@ -104,15 +102,17 @@ export function indexToFloat(index: number): number {
|
|
104
102
|
}
|
105
103
|
|
106
104
|
/** @internal */
|
107
|
-
export type ArrayInt64 = {
|
105
|
+
export type ArrayInt64 = {
|
106
|
+
sign: 1 | -1;
|
107
|
+
data: [number, number];
|
108
|
+
};
|
108
109
|
|
109
110
|
/** @internal */
|
110
111
|
export const Zero64: ArrayInt64 = { sign: 1, data: [0, 0] };
|
111
|
-
|
112
112
|
/** @internal */
|
113
113
|
export const Unit64: ArrayInt64 = { sign: 1, data: [0, 1] };
|
114
|
-
|
115
114
|
/** @internal */
|
115
|
+
|
116
116
|
export function isZero64(a: ArrayInt64): boolean {
|
117
117
|
return a.data[0] === 0 && a.data[1] === 0;
|
118
118
|
}
|
@@ -178,7 +178,6 @@ function substract64Internal(a: ArrayInt64, b: ArrayInt64): ArrayInt64 {
|
|
178
178
|
const high = a.data[0] + b.data[0] + (low > 0xffffffff ? 1 : 0);
|
179
179
|
return { sign: 1, data: [high >>> 0, low >>> 0] };
|
180
180
|
}
|
181
|
-
|
182
181
|
// a.sign === -1 with b.sign === 1 is impossible given: a - b >= 0, except for a = 0 and b = 0
|
183
182
|
// Operation is a substraction
|
184
183
|
return {
|
@@ -270,7 +269,10 @@ const INDEX_NEGATIVE_INFINITY: ArrayInt64 = { sign: -1, data: [2146435072, 1] };
|
|
270
269
|
*
|
271
270
|
* @internal
|
272
271
|
*/
|
273
|
-
export function decomposeDouble(d: number): {
|
272
|
+
export function decomposeDouble(d: number): {
|
273
|
+
exponent: number;
|
274
|
+
significand: number;
|
275
|
+
} {
|
274
276
|
// 1 => significand 0b1 - exponent 1 (will be preferred)
|
275
277
|
// => significand 0b0.1 - exponent 2
|
276
278
|
const maxSignificand = 2 - Number.EPSILON;
|
@@ -292,10 +294,8 @@ function positiveNumberToInt64(n: number): ArrayInt64["data"] {
|
|
292
294
|
/** @internal */
|
293
295
|
function indexInDoubleFromDecomp(exponent: number, significand: number): ArrayInt64["data"] {
|
294
296
|
// WARNING: significand >= 0
|
295
|
-
|
296
297
|
// By construct of significand in decomposeDouble,
|
297
298
|
// significand is always max-ed.
|
298
|
-
|
299
299
|
// The double close to zero are the only one having a significand <1, they also have an exponent of -1022.
|
300
300
|
// They are in range: [2**(-1022) * 2**(-52), 2**(-1022) * (2 - 2 ** 52)]
|
301
301
|
// In other words there are 2**53 elements in that range if we include zero.
|
@@ -447,8 +447,14 @@ export function nextAfter(x: number, y: number) {
|
|
447
447
|
export function computeBiasedRanges(
|
448
448
|
min: ArrayInt64,
|
449
449
|
max: ArrayInt64,
|
450
|
-
biasedRanges?: {
|
451
|
-
|
450
|
+
biasedRanges?: {
|
451
|
+
min: ArrayInt64;
|
452
|
+
max: ArrayInt64;
|
453
|
+
}[],
|
454
|
+
): {
|
455
|
+
min: ArrayInt64;
|
456
|
+
max: ArrayInt64;
|
457
|
+
}[] {
|
452
458
|
if (biasedRanges != null) {
|
453
459
|
return biasedRanges;
|
454
460
|
}
|
@@ -477,8 +483,16 @@ export function computeArrayInt64GenerateRange(
|
|
477
483
|
min: ArrayInt64,
|
478
484
|
max: ArrayInt64,
|
479
485
|
biasFactor: number | undefined,
|
480
|
-
biasedRanges:
|
481
|
-
|
486
|
+
biasedRanges:
|
487
|
+
| {
|
488
|
+
min: ArrayInt64;
|
489
|
+
max: ArrayInt64;
|
490
|
+
}[]
|
491
|
+
| undefined,
|
492
|
+
): UIO<{
|
493
|
+
min: ArrayInt64;
|
494
|
+
max: ArrayInt64;
|
495
|
+
}> {
|
482
496
|
return IO.gen(function* (_) {
|
483
497
|
if (biasFactor === undefined || (yield* _(Random.nextIntBetween(1, biasFactor))) !== 1) {
|
484
498
|
return { min, max };
|