All files / src/schemes/unfold annotate.ts

100% Statements 34/34
100% Branches 5/5
100% Functions 3/3
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 441x 1x 1x 1x 1x               1x 1x 11x   11x 11x 11x 11x 11x 11x 11x 11x 11x 11x   11x 11x 11x 11x 11x 4x 4x 4x 4x 4x 4x 4x 11x 11x 11x 11x  
import * as TreeF from '#treeF'
import {pair, square} from '#Pair'
import {Array, Effect, flow, pipe} from 'effect'
import {getValue, match} from '../../tree/index.js'
import {getForest} from '../../tree/data.js'
import type {Tree} from '../../tree/types.js'
import type {TreeEffectUnfolder} from './types.js'
 
/**
 * @category unfold
 * @function
 */
export const annotateEffectUnfolder =
  <A, B, E = never, R = never>(
    ψ: TreeEffectUnfolder<A, Tree<B>, E, R>,
  ): TreeEffectUnfolder<[B, A], [Tree<B>, A], E, R> =>
  ([self, value]) =>
    pipe(
      self,
      ψ,
      Effect.map((unfolded: TreeF.TreeF<A, Tree<B>>) => {
        const [b, a] = pipe(
          self,
          getValue,
          pipe(unfolded, TreeF.getValue, pair.withSecond),
        )
 
        return pipe(
          self,
          match({
            onLeaf: () => TreeF.leafF([b, a]),
            onBranch: (_, forest) =>
              TreeF.branchF(
                [b, a],
                Array.map(
                  forest,
                  square.mapSecond(flow(getForest, TreeF.treeF.flipped(value))),
                ),
              ),
          }),
        )
      }),
    )