MCPcopy Create free account
hub / github.com/datner/react-effect / causesArb

Function causesArb

test/utils/cause.ts:5–49  ·  view source on GitHub ↗
(
  n: number,
  error: fc.Arbitrary<E>,
  defect: fc.Arbitrary<unknown>
)

Source from the content-addressed store, hash-verified

3import * as fc from "fast-check"
4
5export const causesArb = <E>(
6 n: number,
7 error: fc.Arbitrary<E>,
8 defect: fc.Arbitrary<unknown>
9): fc.Arbitrary<Cause.Cause<E>> => {
10 const fiberId: fc.Arbitrary<FiberId.FiberId> = fc.tuple(
11 fc.integer(),
12 fc.integer()
13 ).map(([a, b]) => FiberId.make(a, b))
14
15 const empty = fc.constant(Cause.empty)
16 const failure = error.map(Cause.fail)
17 const die = defect.map(Cause.die)
18 const interrupt = fiberId.map(Cause.interrupt)
19
20 const annotated = (n: number): fc.Arbitrary<Cause.Cause<E>> => {
21 return fc.tuple(causesN(n - 1), fc.anything()).map(
22 ([cause, annotation]) => Cause.annotated(cause, annotation)
23 )
24 }
25
26 const sequential = (n: number): fc.Arbitrary<Cause.Cause<E>> => {
27 return fc.integer({ min: 1, max: n - 1 }).chain((i) =>
28 causesN(i).chain((left) => causesN(n - i).map((right) => Cause.sequential(left, right)))
29 )
30 }
31
32 const parallel = (n: number): fc.Arbitrary<Cause.Cause<E>> => {
33 return fc.integer({ min: 1, max: n - 1 }).chain((i) =>
34 causesN(i).chain((left) => causesN(n - i).map((right) => Cause.parallel(left, right)))
35 )
36 }
37
38 const causesN = (n: number): fc.Arbitrary<Cause.Cause<E>> => {
39 if (n === 1) {
40 return fc.oneof(empty, failure, die, interrupt)
41 }
42 if (n === 2) {
43 return annotated(n)
44 }
45 return fc.oneof(annotated(n), sequential(n), parallel(n))
46 }
47
48 return causesN(n)
49}
50
51export const causes: fc.Arbitrary<Cause.Cause<string>> = causesArb(
52 1,

Callers 1

cause.tsFile · 0.85

Calls 1

causesNFunction · 0.85

Tested by

no test coverage detected