@yipe/dice 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder/ac.d.ts +25 -0
- package/dist/builder/ac.d.ts.map +1 -0
- package/dist/builder/ast.d.ts +9 -0
- package/dist/builder/ast.d.ts.map +1 -0
- package/dist/builder/attack.d.ts +41 -0
- package/dist/builder/attack.d.ts.map +1 -0
- package/dist/builder/d20.d.ts +6 -0
- package/dist/builder/d20.d.ts.map +1 -0
- package/dist/builder/dc.d.ts +26 -0
- package/dist/builder/dc.d.ts.map +1 -0
- package/dist/builder/example.d.ts +356 -0
- package/dist/builder/example.d.ts.map +1 -0
- package/dist/builder/factory.d.ts +17 -0
- package/dist/builder/factory.d.ts.map +1 -0
- package/dist/builder/index.d.ts +8 -429
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/nodes.d.ts +61 -0
- package/dist/builder/nodes.d.ts.map +1 -0
- package/dist/builder/prob.d.ts +3 -0
- package/dist/builder/prob.d.ts.map +1 -0
- package/dist/builder/roll.d.ts +205 -0
- package/dist/builder/roll.d.ts.map +1 -0
- package/dist/builder/save.d.ts +19 -0
- package/dist/builder/save.d.ts.map +1 -0
- package/dist/builder/types.d.ts +66 -0
- package/dist/builder/types.d.ts.map +1 -0
- package/dist/common/bounce.d.ts +32 -0
- package/dist/common/bounce.d.ts.map +1 -0
- package/dist/common/errors.d.ts +26 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/lru-cache.d.ts +17 -0
- package/dist/common/lru-cache.d.ts.map +1 -0
- package/dist/common/types.d.ts +65 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -111
- package/dist/index.d.ts.map +1 -0
- package/dist/parser/dice.d.ts +70 -0
- package/dist/parser/dice.d.ts.map +1 -0
- package/dist/parser/parser.d.ts +14 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/pmf/mixture.d.ts +37 -0
- package/dist/pmf/mixture.d.ts.map +1 -0
- package/dist/pmf/pmf.d.ts +380 -0
- package/dist/pmf/pmf.d.ts.map +1 -0
- package/dist/{pmf-D5VRghZI.d.cts → pmf/query.d.ts} +6 -464
- package/dist/pmf/query.d.ts.map +1 -0
- package/package.json +16 -15
- package/.claude/worktrees/amazing-matsumoto-27220c/LICENSE +0 -21
- package/.claude/worktrees/amazing-matsumoto-27220c/README.md +0 -518
- package/.claude/worktrees/vibrant-lovelace-0cc9e7/LICENSE +0 -21
- package/.claude/worktrees/vibrant-lovelace-0cc9e7/README.md +0 -518
- package/.claude/worktrees/wizardly-mclean-e375de/LICENSE +0 -21
- package/.claude/worktrees/wizardly-mclean-e375de/README.md +0 -518
- package/CHANGELOG.md +0 -239
- package/dist/builder/index.d.cts +0 -429
- package/dist/index.d.cts +0 -111
- package/dist/pmf-D5VRghZI.d.ts +0 -1129
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import type { ACBuilder } from "./ac.js";
|
|
2
|
+
import type { CritConfig } from "../common/types.js";
|
|
3
|
+
import type { DCBuilder } from "./dc.js";
|
|
4
|
+
import type { PMF } from "../pmf/pmf.js";
|
|
5
|
+
import type { DiceQuery } from "../pmf/query.js";
|
|
6
|
+
import { AttackBuilder } from "./attack.js";
|
|
7
|
+
import type { ExpressionNode } from "./nodes.js";
|
|
8
|
+
import type { RollConfig, RollType } from "./types.js";
|
|
9
|
+
export declare const defaultConfig: RollConfig;
|
|
10
|
+
export declare class RollBuilder {
|
|
11
|
+
protected readonly subRollConfigs: readonly RollConfig[];
|
|
12
|
+
constructor(countOrConfigs?: number | readonly RollConfig[]);
|
|
13
|
+
protected create(configs: readonly RollConfig[]): RollBuilder;
|
|
14
|
+
protected get lastConfig(): RollConfig;
|
|
15
|
+
hasHiddenState(): boolean;
|
|
16
|
+
getSubRollConfigs(): readonly RollConfig[];
|
|
17
|
+
static fromConfig(config: Partial<RollConfig>): RollBuilder;
|
|
18
|
+
static fromConfigs(configs: Partial<RollConfig>[]): RollBuilder;
|
|
19
|
+
static fromArgs(...args: any[]): RollBuilder;
|
|
20
|
+
d(sides: number | undefined): RollBuilder;
|
|
21
|
+
plus(modOrRoll: number | RollBuilder | undefined): RollBuilder;
|
|
22
|
+
plus(count: number, die: RollBuilder): RollBuilder;
|
|
23
|
+
minus(modOrRoll: number | RollBuilder | undefined): RollBuilder;
|
|
24
|
+
minus(count: number, die: RollBuilder): RollBuilder;
|
|
25
|
+
/** Apply one-pass reroll threshold (k): reroll faces 1..k once, must keep. */
|
|
26
|
+
reroll(value: number): RollBuilder;
|
|
27
|
+
/** Set finite explode count for max-face explosions (Infinity allowed). */
|
|
28
|
+
explode(count?: number | undefined): RollBuilder;
|
|
29
|
+
/** Apply per-die minimum value (min > 0). */
|
|
30
|
+
minimum(val: number | undefined): RollBuilder;
|
|
31
|
+
bestOf(count: number | undefined): RollBuilder;
|
|
32
|
+
keepHighest(total: number, count: number): RollBuilder;
|
|
33
|
+
keepLowest(total: number, count: number): RollBuilder;
|
|
34
|
+
keepHighestAll(total: number, count: number): PooledRollBuilder;
|
|
35
|
+
keepLowestAll(total: number, count: number): PooledRollBuilder;
|
|
36
|
+
withAdvantage(): RollBuilder;
|
|
37
|
+
withDisadvantage(): RollBuilder;
|
|
38
|
+
add(anotherRoll: RollBuilder | undefined): RollBuilder;
|
|
39
|
+
withBonus(anotherRoll: RollBuilder): RollBuilder;
|
|
40
|
+
addRoll(count?: number): RollBuilder;
|
|
41
|
+
scaleDice(scale: number): RollBuilder;
|
|
42
|
+
doubleDice(): RollBuilder;
|
|
43
|
+
alwaysHits(): AlwaysHitBuilder;
|
|
44
|
+
alwaysCrits(): AlwaysCritBuilder;
|
|
45
|
+
copy(): RollBuilder;
|
|
46
|
+
d4: () => RollBuilder;
|
|
47
|
+
d6: () => RollBuilder;
|
|
48
|
+
d8: () => RollBuilder;
|
|
49
|
+
d10: () => RollBuilder;
|
|
50
|
+
d12: () => RollBuilder;
|
|
51
|
+
d20: () => RollBuilder;
|
|
52
|
+
d100: () => RollBuilder;
|
|
53
|
+
withElvenAccuracy(): RollBuilder;
|
|
54
|
+
toExpression(): string;
|
|
55
|
+
toPMF(eps?: number): PMF;
|
|
56
|
+
get pmf(): PMF;
|
|
57
|
+
toQuery(eps?: number): DiceQuery;
|
|
58
|
+
toAST(): ExpressionNode;
|
|
59
|
+
private configToSingleExpressionWithoutModifier;
|
|
60
|
+
getRootDieConfig(): RollConfig | undefined;
|
|
61
|
+
getAllDieConfigs(): readonly RollConfig[];
|
|
62
|
+
getBonusDiceConfigs(): RollConfig[];
|
|
63
|
+
getBonusDicePMFs(check: RollBuilder, eps?: number): PMF[];
|
|
64
|
+
get modifier(): number;
|
|
65
|
+
get rollType(): RollType;
|
|
66
|
+
get baseReroll(): number;
|
|
67
|
+
half(): HalfRollBuilder;
|
|
68
|
+
/**
|
|
69
|
+
* Scale this roll's result by `numerator / denominator`, rounding each outcome.
|
|
70
|
+
* A general, composable form of {@link half} — used to model damage-type resistance
|
|
71
|
+
* (`scaleResult(1, 2)` → `(expr) // 2`) and vulnerability (`scaleResult(2)` → `2 * (expr)`).
|
|
72
|
+
* Compose several of these (and plain rolls) into one payload with {@link sumRolls}.
|
|
73
|
+
*/
|
|
74
|
+
scaleResult(numerator: number, denominator?: number, rounding?: "floor" | "round" | "ceil"): ScaleRollBuilder;
|
|
75
|
+
maxOf(count: number): MaxOfRollBuilder;
|
|
76
|
+
ac(_targetAC: number): ACBuilder;
|
|
77
|
+
dc(_saveDC: number): DCBuilder;
|
|
78
|
+
}
|
|
79
|
+
export declare class HalfRollBuilder extends RollBuilder {
|
|
80
|
+
private readonly innerRoll;
|
|
81
|
+
constructor(innerRoll: RollBuilder);
|
|
82
|
+
hasHiddenState(): boolean;
|
|
83
|
+
get lastConfig(): RollConfig;
|
|
84
|
+
getSubRollConfigs(): readonly RollConfig[];
|
|
85
|
+
toExpression(): string;
|
|
86
|
+
toAST(): ExpressionNode;
|
|
87
|
+
toPMF(eps?: number): PMF;
|
|
88
|
+
copy(): HalfRollBuilder;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* A roll whose result is scaled by `numerator / denominator` and rounded — the composable
|
|
92
|
+
* generalization of {@link HalfRollBuilder}. Renders as `N * (inner)`, `(inner) // D`, or
|
|
93
|
+
* `(inner) * N // D`. Terminal (like `half`): use {@link sumRolls} to combine with other rolls.
|
|
94
|
+
*/
|
|
95
|
+
export declare class ScaleRollBuilder extends RollBuilder {
|
|
96
|
+
private readonly innerRoll;
|
|
97
|
+
private readonly numerator;
|
|
98
|
+
private readonly denominator;
|
|
99
|
+
private readonly rounding;
|
|
100
|
+
constructor(innerRoll: RollBuilder, numerator: number, denominator?: number, rounding?: "floor" | "round" | "ceil");
|
|
101
|
+
hasHiddenState(): boolean;
|
|
102
|
+
get lastConfig(): RollConfig;
|
|
103
|
+
getSubRollConfigs(): readonly RollConfig[];
|
|
104
|
+
toExpression(): string;
|
|
105
|
+
toAST(): ExpressionNode;
|
|
106
|
+
toPMF(eps?: number): PMF;
|
|
107
|
+
copy(): ScaleRollBuilder;
|
|
108
|
+
}
|
|
109
|
+
export declare class MaxOfRollBuilder extends RollBuilder {
|
|
110
|
+
private readonly innerRoll;
|
|
111
|
+
private readonly count;
|
|
112
|
+
private readonly diceCount?;
|
|
113
|
+
private readonly diceSides?;
|
|
114
|
+
constructor(innerRoll: RollBuilder, count: number, diceCount?: number | undefined, diceSides?: number | undefined);
|
|
115
|
+
hasHiddenState(): boolean;
|
|
116
|
+
get lastConfig(): RollConfig;
|
|
117
|
+
getSubRollConfigs(): readonly RollConfig[];
|
|
118
|
+
toExpression(): string;
|
|
119
|
+
toAST(): ExpressionNode;
|
|
120
|
+
toPMF(eps?: number): PMF;
|
|
121
|
+
copy(): MaxOfRollBuilder;
|
|
122
|
+
}
|
|
123
|
+
export declare class AlwaysHitBuilder extends RollBuilder {
|
|
124
|
+
readonly attackConfig: CritConfig;
|
|
125
|
+
constructor(baseRoll: RollBuilder, attackConfig?: CritConfig);
|
|
126
|
+
protected create(configs: readonly RollConfig[]): RollBuilder;
|
|
127
|
+
onHit(val: number): AttackBuilder;
|
|
128
|
+
onHit(val: string): AttackBuilder;
|
|
129
|
+
onHit(val: RollBuilder): AttackBuilder;
|
|
130
|
+
onHit(count: number, die: RollBuilder): AttackBuilder;
|
|
131
|
+
onHit(count: number, sides: number): AttackBuilder;
|
|
132
|
+
onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;
|
|
133
|
+
onHit(count: number, sides: number, modifier: number): AttackBuilder;
|
|
134
|
+
get critThreshold(): number;
|
|
135
|
+
critOn(critThreshold: number): AlwaysHitBuilder;
|
|
136
|
+
alwaysCrits(): AlwaysCritBuilder;
|
|
137
|
+
toExpression(): string;
|
|
138
|
+
toPMF(): PMF;
|
|
139
|
+
copy(): AlwaysHitBuilder;
|
|
140
|
+
}
|
|
141
|
+
export declare class AlwaysCritBuilder extends RollBuilder {
|
|
142
|
+
readonly attackConfig: CritConfig & {
|
|
143
|
+
ac?: number;
|
|
144
|
+
};
|
|
145
|
+
readonly fromAlwaysHit: boolean;
|
|
146
|
+
constructor(baseRoll: RollBuilder, attackConfig?: CritConfig & {
|
|
147
|
+
ac?: number;
|
|
148
|
+
}, fromAlwaysHit?: boolean);
|
|
149
|
+
protected create(configs: readonly RollConfig[]): RollBuilder;
|
|
150
|
+
onHit(val: number): AttackBuilder;
|
|
151
|
+
onHit(val: string): AttackBuilder;
|
|
152
|
+
onHit(val: RollBuilder): AttackBuilder;
|
|
153
|
+
onHit(count: number, die: RollBuilder): AttackBuilder;
|
|
154
|
+
onHit(count: number, sides: number): AttackBuilder;
|
|
155
|
+
onHit(count: number, die: RollBuilder, modifier: number): AttackBuilder;
|
|
156
|
+
onHit(count: number, sides: number, modifier: number): AttackBuilder;
|
|
157
|
+
get critThreshold(): number;
|
|
158
|
+
critOn(critThreshold: number): AlwaysCritBuilder;
|
|
159
|
+
toExpression(): string;
|
|
160
|
+
toPMF(): PMF;
|
|
161
|
+
copy(): AlwaysCritBuilder;
|
|
162
|
+
}
|
|
163
|
+
export declare class ParsedRollBuilder extends RollBuilder {
|
|
164
|
+
private readonly cachedPMF;
|
|
165
|
+
private readonly originalExpression;
|
|
166
|
+
constructor(expression: string);
|
|
167
|
+
hasHiddenState(): boolean;
|
|
168
|
+
protected create(configs: readonly RollConfig[]): RollBuilder;
|
|
169
|
+
toPMF(_eps?: number): PMF;
|
|
170
|
+
toExpression(): string;
|
|
171
|
+
toAST(): ExpressionNode;
|
|
172
|
+
copy(): ParsedRollBuilder;
|
|
173
|
+
doubleDice(): ParsedRollBuilder;
|
|
174
|
+
}
|
|
175
|
+
export declare class PooledRollBuilder extends RollBuilder {
|
|
176
|
+
private readonly baseAST;
|
|
177
|
+
private readonly baseExpression;
|
|
178
|
+
constructor(baseAST: ExpressionNode, baseExpression: string, configs?: readonly RollConfig[]);
|
|
179
|
+
protected create(configs: readonly RollConfig[]): PooledRollBuilder;
|
|
180
|
+
hasHiddenState(): boolean;
|
|
181
|
+
d(_sides: number | undefined): RollBuilder;
|
|
182
|
+
reroll(_value: number): RollBuilder;
|
|
183
|
+
explode(_count?: number | undefined): RollBuilder;
|
|
184
|
+
minimum(_val: number | undefined): RollBuilder;
|
|
185
|
+
bestOf(_count: number | undefined): RollBuilder;
|
|
186
|
+
keepHighest(_total: number, _count: number): RollBuilder;
|
|
187
|
+
keepLowest(_total: number, _count: number): RollBuilder;
|
|
188
|
+
withAdvantage(): RollBuilder;
|
|
189
|
+
withDisadvantage(): RollBuilder;
|
|
190
|
+
withElvenAccuracy(): RollBuilder;
|
|
191
|
+
toAST(): ExpressionNode;
|
|
192
|
+
toExpression(): string;
|
|
193
|
+
copy(): PooledRollBuilder;
|
|
194
|
+
scaleDice(scale: number): RollBuilder;
|
|
195
|
+
times(count: number): PooledRollBuilder;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Combine several rolls into one additive payload whose PMF is their convolution and whose
|
|
199
|
+
* expression is them joined with ` + `. Unlike `a.plus(b)`, this preserves parts that carry
|
|
200
|
+
* hidden state (e.g. `roll.scaleResult(1, 2)` / `roll.half()`), so per-damage-type resistance
|
|
201
|
+
* and vulnerability survive into both the distribution and the rendered expression.
|
|
202
|
+
* Empty parts collapse to `0`; a single part is returned unwrapped.
|
|
203
|
+
*/
|
|
204
|
+
export declare function sumRolls(parts: readonly RollBuilder[]): RollBuilder;
|
|
205
|
+
//# sourceMappingURL=roll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../../src/builder/roll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PMF } from "../pmf/pmf.js";
|
|
2
|
+
import type { DiceQuery } from "../pmf/query.js";
|
|
3
|
+
import type { DCBuilder } from "./dc.js";
|
|
4
|
+
import { type RollBuilder } from "./roll.js";
|
|
5
|
+
import type { CheckBuilder, SaveResolution } from "./types.js";
|
|
6
|
+
export type SaveOutcome = "normal" | "half";
|
|
7
|
+
export declare class SaveBuilder implements CheckBuilder {
|
|
8
|
+
readonly check: DCBuilder;
|
|
9
|
+
private readonly failureEffect?;
|
|
10
|
+
private readonly saveOutcome;
|
|
11
|
+
constructor(check: DCBuilder, failureEffect?: RollBuilder | undefined, saveOutcome?: SaveOutcome);
|
|
12
|
+
saveHalf(): SaveBuilder;
|
|
13
|
+
toExpression(): string;
|
|
14
|
+
resolve(eps?: number): SaveResolution;
|
|
15
|
+
toPMF(eps?: number): PMF;
|
|
16
|
+
get pmf(): PMF;
|
|
17
|
+
toQuery(eps?: number): DiceQuery;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/builder/save.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5C,qBAAa,WAAY,YAAW,YAAY;IAE5C,QAAQ,CAAC,KAAK,EAAE,SAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAH9B,YACW,KAAK,EAAE,SAAS,EACR,aAAa,CAAC,EAAE,WAAW,YAAA,EAC3B,WAAW,GAAE,WAAsB,EAClD;IAEJ,QAAQ,IAAI,WAAW,CAEtB;IAED,YAAY,IAAI,MAAM,CAOrB;IAED,OAAO,CAAC,GAAG,GAAE,MAAY,GAAG,cAAc,CA8BzC;IAGD,KAAK,CAAC,GAAG,GAAE,MAAU,GAAG,GAAG,CAE1B;IAED,IAAI,GAAG,QAEN;IAGD,OAAO,CAAC,GAAG,GAAE,MAAU,GAAG,SAAS,CAElC;CACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { PMF } from "../pmf/pmf.js";
|
|
2
|
+
import type { RollType } from "../common/types.js";
|
|
3
|
+
import type { RollBuilder } from "./roll.js";
|
|
4
|
+
export type { RollType };
|
|
5
|
+
export type RollFactory = {
|
|
6
|
+
(count: number, sides?: number, modifier?: number): RollBuilder;
|
|
7
|
+
(count: number, die: RollBuilder, modifier?: number): RollBuilder;
|
|
8
|
+
d(sides: number | string): RollBuilder;
|
|
9
|
+
hd20(): RollBuilder;
|
|
10
|
+
d4(): RollBuilder;
|
|
11
|
+
d6(): RollBuilder;
|
|
12
|
+
d8(): RollBuilder;
|
|
13
|
+
d10(): RollBuilder;
|
|
14
|
+
d12(): RollBuilder;
|
|
15
|
+
d20(): RollBuilder;
|
|
16
|
+
d100(): RollBuilder;
|
|
17
|
+
flat(n: number): RollBuilder;
|
|
18
|
+
};
|
|
19
|
+
export type KeepMode = "highest" | "lowest";
|
|
20
|
+
export type RollConfig = {
|
|
21
|
+
count: number;
|
|
22
|
+
sides: number;
|
|
23
|
+
modifier: number;
|
|
24
|
+
reroll: number;
|
|
25
|
+
explode: number;
|
|
26
|
+
minimum: number;
|
|
27
|
+
bestOf: number;
|
|
28
|
+
keep: {
|
|
29
|
+
total: number;
|
|
30
|
+
count: number;
|
|
31
|
+
mode: KeepMode;
|
|
32
|
+
} | undefined;
|
|
33
|
+
rollType: RollType;
|
|
34
|
+
isSubtraction?: boolean;
|
|
35
|
+
};
|
|
36
|
+
export type Resolution = {
|
|
37
|
+
pmf: PMF;
|
|
38
|
+
check: PMF;
|
|
39
|
+
weights: {
|
|
40
|
+
[key: string]: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type AttackResolution = Resolution & {
|
|
44
|
+
hit: PMF;
|
|
45
|
+
crit: PMF;
|
|
46
|
+
miss: PMF;
|
|
47
|
+
weights: {
|
|
48
|
+
hit: number;
|
|
49
|
+
crit: number;
|
|
50
|
+
miss: number;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type SaveResolution = Resolution & {
|
|
54
|
+
saveFail: PMF;
|
|
55
|
+
saveSuccess: PMF;
|
|
56
|
+
weights: {
|
|
57
|
+
success: number;
|
|
58
|
+
fail: number;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export interface CheckBuilder {
|
|
62
|
+
resolve(eps?: number): Resolution;
|
|
63
|
+
toExpression(): string;
|
|
64
|
+
readonly pmf: PMF;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builder/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAChE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAClE,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACvC,IAAI,IAAI,WAAW,CAAC;IACpB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,EAAE,IAAI,WAAW,CAAC;IAClB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,WAAW,CAAC;IACnB,IAAI,IAAI,WAAW,CAAC;IACpB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IACnE,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACxC,QAAQ,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,YAAY,IAAI,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounce odds — the "birthday problem" for bouncing damage dice (e.g. Chromatic
|
|
3
|
+
* Orb): the probability that at least two of K dice with S faces show the same
|
|
4
|
+
* value, which is what lets the spell jump to another target.
|
|
5
|
+
*
|
|
6
|
+
* Accounts for two modifiers:
|
|
7
|
+
* - **Elemental Adept** (`minimumDieRoll >= 2`): rolls below the minimum are
|
|
8
|
+
* bumped up to it, collapsing the low faces onto a single heavier value.
|
|
9
|
+
* - **Empowered Spell** (`rerollDamageDice > 0`): a number of dice may be
|
|
10
|
+
* rerolled once, giving a second chance at a match.
|
|
11
|
+
*
|
|
12
|
+
* The base and Elemental-Adept cases are computed exactly (see
|
|
13
|
+
* {@link pAllDistinct}); the Empowered-Spell reroll is an explicit model layered
|
|
14
|
+
* on the exact base match probability.
|
|
15
|
+
*/
|
|
16
|
+
/** Options that modify bounce odds via metamagic / feats. */
|
|
17
|
+
export interface BounceOddsOptions {
|
|
18
|
+
/** Minimum die roll — e.g. 2 for Elemental Adept, 3 for Great Weapon Fighting 2024. */
|
|
19
|
+
minimumDieRoll?: number;
|
|
20
|
+
/** Number of dice that may be rerolled once — e.g. CHA modifier for Empowered Spell. */
|
|
21
|
+
rerollDamageDice?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* P(at least two of `diceCount` dice with `dieFaces` faces match), honoring
|
|
25
|
+
* Elemental Adept and Empowered Spell. Returns a probability in [0, 1].
|
|
26
|
+
*
|
|
27
|
+
* @param diceCount Number of dice rolled.
|
|
28
|
+
* @param dieFaces Faces per die (e.g. 8 for d8).
|
|
29
|
+
* @param options Optional metamagic / feat modifiers.
|
|
30
|
+
*/
|
|
31
|
+
export declare function calculateBounceOdds(diceCount: number, dieFaces: number, options?: BounceOddsOptions): number;
|
|
32
|
+
//# sourceMappingURL=bounce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounce.d.ts","sourceRoot":"","sources":["../../src/common/bounce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuDD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAgCR"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when a dice expression cannot be parsed.
|
|
3
|
+
*
|
|
4
|
+
* Extends the built-in {@link Error}, so existing `catch (e)` / message checks
|
|
5
|
+
* continue to work, while callers can now narrow with `instanceof DiceParseError`.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* try {
|
|
9
|
+
* parse("d6@3");
|
|
10
|
+
* } catch (e) {
|
|
11
|
+
* if (e instanceof DiceParseError) {
|
|
12
|
+
* // e.expression === "d6@3"
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
export declare class DiceParseError extends Error {
|
|
17
|
+
/** The original expression that failed to parse, when available. */
|
|
18
|
+
readonly expression?: string;
|
|
19
|
+
/** The underlying error that triggered this one, when available. */
|
|
20
|
+
readonly cause?: unknown;
|
|
21
|
+
constructor(message: string, options?: {
|
|
22
|
+
expression?: string;
|
|
23
|
+
cause?: unknown;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/common/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAQnD;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple LRU cache implementation
|
|
3
|
+
*/
|
|
4
|
+
export declare class LRUCache<K, V> {
|
|
5
|
+
private readonly maxSize;
|
|
6
|
+
private cache;
|
|
7
|
+
constructor(maxSize?: number);
|
|
8
|
+
get(key: K): V | undefined;
|
|
9
|
+
delete(key: K): void;
|
|
10
|
+
set(key: K, value: V): this;
|
|
11
|
+
clear(): void;
|
|
12
|
+
get size(): number;
|
|
13
|
+
has(key: K): boolean;
|
|
14
|
+
keys(): IterableIterator<K>;
|
|
15
|
+
values(): IterableIterator<V>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=lru-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/common/lru-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC;IAGZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,KAAK,CAAmB;IAEhC,YAA6B,OAAO,SAAO,EAAI;IAE/C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAOzB;IAED,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAEnB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAQ1B;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE1B;IAED,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE5B;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Mapping from outcome label to probability mass or damage attribution. */
|
|
2
|
+
export type OutcomeLabelMap = Partial<Record<string, number>>;
|
|
3
|
+
/** Computational epsilon for pruning negligible probabilities. */
|
|
4
|
+
export declare const EPS = 1e-12;
|
|
5
|
+
/** A probability bin for a specific damage value. */
|
|
6
|
+
export interface Bin {
|
|
7
|
+
/** Total probability mass at this damage value. */
|
|
8
|
+
p: number;
|
|
9
|
+
/** Per-outcome probability mass contributions at this damage. */
|
|
10
|
+
count: OutcomeLabelMap;
|
|
11
|
+
/** Optional per-outcome damage attribution at this damage. */
|
|
12
|
+
attr?: OutcomeLabelMap;
|
|
13
|
+
}
|
|
14
|
+
export interface CritConfig {
|
|
15
|
+
critThreshold: number;
|
|
16
|
+
}
|
|
17
|
+
/** Simple mapping from damage value to probability. */
|
|
18
|
+
export type DamageDistribution = Record<number, number>;
|
|
19
|
+
/** Canonical outcome labels supported by the query helpers. */
|
|
20
|
+
export type OutcomeType = "crit" | "hit" | "missNone" | "missDamage" | "saveHalf" | "saveFail" | "pc";
|
|
21
|
+
export type Rounding = "none" | "floor" | "round" | "ceil";
|
|
22
|
+
/** How a d20 attack roll resolves: single die, keep-highest of 2/3, or keep-lowest of 2. */
|
|
23
|
+
export type RollType = "flat" | "advantage" | "disadvantage" | "elven accuracy";
|
|
24
|
+
/**
|
|
25
|
+
* P(critical hit) for the given crit window and d20 {@link RollType}.
|
|
26
|
+
*
|
|
27
|
+
* `critRange` is the number of top faces that crit (1 for a natural 20, 2 for
|
|
28
|
+
* 19–20, …), so a single die crits with probability `critRange / 20`. Advantage
|
|
29
|
+
* rolls two d20s / elven accuracy three, keeping the best; disadvantage keeps
|
|
30
|
+
* the worst of two.
|
|
31
|
+
*/
|
|
32
|
+
export declare function critProbability(critRange: number, rollType?: RollType): number;
|
|
33
|
+
/**
|
|
34
|
+
* The canonical "clean miss" outcome — a point of zero damage with no rider.
|
|
35
|
+
* This is the {@link OutcomeType} that attribution charts and outcome stats key
|
|
36
|
+
* on, and is distinct from the builder's attack-resolution `miss` weight label.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MISS_NONE_OUTCOME: OutcomeType;
|
|
39
|
+
/**
|
|
40
|
+
* All outcome types in canonical severity order — clean miss → crit. This is
|
|
41
|
+
* also the natural stacking order for attribution charts (least- to
|
|
42
|
+
* most-impactful, bottom → top). Enumerates every {@link OutcomeType} exactly
|
|
43
|
+
* once; use it instead of hand-maintained per-consumer outcome tables.
|
|
44
|
+
*/
|
|
45
|
+
export declare const ALL_OUTCOME_TYPES: OutcomeType[];
|
|
46
|
+
/**
|
|
47
|
+
* Outcome types in display order for stats / breakdown rows — most prominent
|
|
48
|
+
* first (crit, hit, …) down to the clean miss.
|
|
49
|
+
*/
|
|
50
|
+
export declare const OUTCOME_DISPLAY_ORDER: OutcomeType[];
|
|
51
|
+
/**
|
|
52
|
+
* Sort outcome labels by a canonical order (defaults to {@link ALL_OUTCOME_TYPES}).
|
|
53
|
+
* Labels not present in `order` sort after known ones, alphabetically — so
|
|
54
|
+
* ad-hoc/test labels outside the {@link OutcomeType} union stay stable.
|
|
55
|
+
*/
|
|
56
|
+
export declare function sortOutcomes<T extends string>(outcomes: Iterable<T>, order?: readonly string[]): T[];
|
|
57
|
+
export declare const onAnyHit: OutcomeType[];
|
|
58
|
+
export declare const onCritOnly: OutcomeType[];
|
|
59
|
+
export declare const onHitOnly: OutcomeType[];
|
|
60
|
+
export declare const onMissOnly: OutcomeType[];
|
|
61
|
+
export declare const onMissDamageOnly: OutcomeType[];
|
|
62
|
+
export declare const onSaveHalfOnly: OutcomeType[];
|
|
63
|
+
export declare const onSaveFailOnly: OutcomeType[];
|
|
64
|
+
export declare const onPotentCantripOnly: OutcomeType[];
|
|
65
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/common/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,kEAAkE;AAClE,eAAO,MAAM,GAAG,QAAQ,CAAC;AAEzB,qDAAqD;AACrD,MAAM,WAAW,GAAG;IAClB,mDAAmD;IACnD,CAAC,EAAE,MAAM,CAAC;IACV,iEAAiE;IACjE,KAAK,EAAE,eAAe,CAAC;IACvB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACvB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxD,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,KAAK,GACL,UAAU,GACV,YAAY,GACZ,UAAU,GACV,UAAU,GACV,IAAI,CAAC;AAET,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEhF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,GAAG,MAAM,CAatF;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAwB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAQ1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAQ9C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,KAAK,GAAE,SAAS,MAAM,EAAsB,GAC3C,CAAC,EAAE,CAUL;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAAoB,CAAC;AACvD,eAAO,MAAM,UAAU,EAAE,WAAW,EAAa,CAAC;AAClD,eAAO,MAAM,SAAS,EAAE,WAAW,EAAY,CAAC;AAChD,eAAO,MAAM,UAAU,EAAE,WAAW,EAA+B,CAAC;AACpE,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAAmB,CAAC;AAC9D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,WAAW,EAAiB,CAAC;AAC1D,eAAO,MAAM,mBAAmB,EAAE,WAAW,EAAW,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,111 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
* - **Elemental Adept** (`minimumDieRoll >= 2`): rolls below the minimum are
|
|
11
|
-
* bumped up to it, collapsing the low faces onto a single heavier value.
|
|
12
|
-
* - **Empowered Spell** (`rerollDamageDice > 0`): a number of dice may be
|
|
13
|
-
* rerolled once, giving a second chance at a match.
|
|
14
|
-
*
|
|
15
|
-
* The base and Elemental-Adept cases are computed exactly (see
|
|
16
|
-
* {@link pAllDistinct}); the Empowered-Spell reroll is an explicit model layered
|
|
17
|
-
* on the exact base match probability.
|
|
18
|
-
*/
|
|
19
|
-
/** Options that modify bounce odds via metamagic / feats. */
|
|
20
|
-
interface BounceOddsOptions {
|
|
21
|
-
/** Minimum die roll — e.g. 2 for Elemental Adept, 3 for Great Weapon Fighting 2024. */
|
|
22
|
-
minimumDieRoll?: number;
|
|
23
|
-
/** Number of dice that may be rerolled once — e.g. CHA modifier for Empowered Spell. */
|
|
24
|
-
rerollDamageDice?: number;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* P(at least two of `diceCount` dice with `dieFaces` faces match), honoring
|
|
28
|
-
* Elemental Adept and Empowered Spell. Returns a probability in [0, 1].
|
|
29
|
-
*
|
|
30
|
-
* @param diceCount Number of dice rolled.
|
|
31
|
-
* @param dieFaces Faces per die (e.g. 8 for d8).
|
|
32
|
-
* @param options Optional metamagic / feat modifiers.
|
|
33
|
-
*/
|
|
34
|
-
declare function calculateBounceOdds(diceCount: number, dieFaces: number, options?: BounceOddsOptions): number;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Error thrown when a dice expression cannot be parsed.
|
|
38
|
-
*
|
|
39
|
-
* Extends the built-in {@link Error}, so existing `catch (e)` / message checks
|
|
40
|
-
* continue to work, while callers can now narrow with `instanceof DiceParseError`.
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* try {
|
|
44
|
-
* parse("d6@3");
|
|
45
|
-
* } catch (e) {
|
|
46
|
-
* if (e instanceof DiceParseError) {
|
|
47
|
-
* // e.expression === "d6@3"
|
|
48
|
-
* }
|
|
49
|
-
* }
|
|
50
|
-
*/
|
|
51
|
-
declare class DiceParseError extends Error {
|
|
52
|
-
/** The original expression that failed to parse, when available. */
|
|
53
|
-
readonly expression?: string;
|
|
54
|
-
/** The underlying error that triggered this one, when available. */
|
|
55
|
-
readonly cause?: unknown;
|
|
56
|
-
constructor(message: string, options?: {
|
|
57
|
-
expression?: string;
|
|
58
|
-
cause?: unknown;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Enable or disable the internal parse cache. */
|
|
63
|
-
declare function setCachingEnabled(enabled: boolean): void;
|
|
64
|
-
/** Returns whether the internal parse cache is currently enabled. */
|
|
65
|
-
declare function getCachingEnabled(): boolean;
|
|
66
|
-
/** Clears the internal parse cache. */
|
|
67
|
-
declare function clearParserCache(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Parse a dice expression into a PMF.
|
|
70
|
-
*
|
|
71
|
-
* - Expression is case-insensitive and ignores spaces.
|
|
72
|
-
*/
|
|
73
|
-
declare function parse(expression: string, n?: number): PMF;
|
|
74
|
-
|
|
75
|
-
/** A labeled mixture builder that preserves provenance in Bin.count. */
|
|
76
|
-
declare class Mixture<L extends string = string> {
|
|
77
|
-
private readonly totals;
|
|
78
|
-
private readonly labelMass;
|
|
79
|
-
private readonly eps;
|
|
80
|
-
constructor(eps?: number);
|
|
81
|
-
/** Remove all accumulated state. */
|
|
82
|
-
clear(): this;
|
|
83
|
-
/** Number of distinct outcome values currently accumulated. */
|
|
84
|
-
size(): number;
|
|
85
|
-
/** Whether a label was ever added. */
|
|
86
|
-
hasLabel(label: L): boolean;
|
|
87
|
-
/**
|
|
88
|
-
* Add a labeled component with a mixture weight.
|
|
89
|
-
* Weight can be any positive finite number. Very small contributions are pruned by eps.
|
|
90
|
-
*/
|
|
91
|
-
add(label: L, pmf: PMF, weight?: number): this;
|
|
92
|
-
buildPMF(eps?: number): PMF;
|
|
93
|
-
/**
|
|
94
|
-
* Produce normalized *per-label* PMFs (labels independent).
|
|
95
|
-
* These are unlabeled PMFs built from the raw mass of that label alone.
|
|
96
|
-
*/
|
|
97
|
-
byOutcome(): Record<L, PMF>;
|
|
98
|
-
/**
|
|
99
|
-
* Mixture weights per label, normalized to sum to 1 over labels that appeared.
|
|
100
|
-
* Uses raw mass before per-outcome normalization.
|
|
101
|
-
*/
|
|
102
|
-
weights(): Record<L, number>;
|
|
103
|
-
toJSON(): {
|
|
104
|
-
totals: Array<[number, number]>;
|
|
105
|
-
labels: Array<[number, Record<L, number>]>;
|
|
106
|
-
eps: number;
|
|
107
|
-
};
|
|
108
|
-
static mix<L extends string = string>(items: Array<[label: L, pmf: PMF, weight: number]>, eps?: number): PMF;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export { type BounceOddsOptions, DiceParseError, Mixture, PMF, calculateBounceOdds, clearParserCache, getCachingEnabled, parse, setCachingEnabled };
|
|
1
|
+
export * from "./common/bounce.js";
|
|
2
|
+
export * from "./common/errors.js";
|
|
3
|
+
export * from "./common/lru-cache.js";
|
|
4
|
+
export * from "./common/types.js";
|
|
5
|
+
export * from "./parser/parser.js";
|
|
6
|
+
export * from "./pmf/mixture.js";
|
|
7
|
+
export * from "./pmf/pmf.js";
|
|
8
|
+
export * from "./pmf/query.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|