(left: Cause.Cause<unknown>, right: Cause.Cause<unknown>)
| 419 | |
| 420 | /** @internal */ |
| 421 | const causeEquals = (left: Cause.Cause<unknown>, right: Cause.Cause<unknown>): boolean => { |
| 422 | let leftStack: Chunk.Chunk<Cause.Cause<unknown>> = Chunk.of(left) |
| 423 | let rightStack: Chunk.Chunk<Cause.Cause<unknown>> = Chunk.of(right) |
| 424 | while (Chunk.isNonEmpty(leftStack) && Chunk.isNonEmpty(rightStack)) { |
| 425 | const [leftParallel, leftSequential] = pipe( |
| 426 | Chunk.headNonEmpty(leftStack), |
| 427 | reduce( |
| 428 | [HashSet.empty<unknown>(), Chunk.empty<Cause.Cause<unknown>>()] as const, |
| 429 | ([parallel, sequential], cause) => { |
| 430 | const [par, seq] = evaluateCause(cause) |
| 431 | return Option.some( |
| 432 | [ |
| 433 | pipe(parallel, HashSet.union(par)), |
| 434 | pipe(sequential, Chunk.appendAll(seq)) |
| 435 | ] as const |
| 436 | ) |
| 437 | } |
| 438 | ) |
| 439 | ) |
| 440 | const [rightParallel, rightSequential] = pipe( |
| 441 | Chunk.headNonEmpty(rightStack), |
| 442 | reduce( |
| 443 | [HashSet.empty<unknown>(), Chunk.empty<Cause.Cause<unknown>>()] as const, |
| 444 | ([parallel, sequential], cause) => { |
| 445 | const [par, seq] = evaluateCause(cause) |
| 446 | return Option.some( |
| 447 | [ |
| 448 | pipe(parallel, HashSet.union(par)), |
| 449 | pipe(sequential, Chunk.appendAll(seq)) |
| 450 | ] as const |
| 451 | ) |
| 452 | } |
| 453 | ) |
| 454 | ) |
| 455 | if (!Equal.equals(leftParallel, rightParallel)) { |
| 456 | return false |
| 457 | } |
| 458 | leftStack = leftSequential |
| 459 | rightStack = rightSequential |
| 460 | } |
| 461 | return true |
| 462 | } |
| 463 | |
| 464 | // ----------------------------------------------------------------------------- |
| 465 | // Flattening |
no test coverage detected