// ets_tracing: off import type { Either } from "../../../Either/index.js" import type { ChunkURI } from "../../../Modules/index.js" import * as O from "../../../Option/index.js" import type { URI } from "../../../Prelude/index.js" import { getApplicativeF } from "../../../Prelude/index.js" import * as P from "../../../Prelude/index.js" import type { PredicateWithIndex } from "../../../Utils/index.js" import * as Chunk from "./operations.js" export const Collection = P.instance]>>({ builder: Chunk.builder }) export const Any = P.instance]>>({ any: () => Chunk.single({}) }) export const AssociativeBothZip = P.instance]>>({ both: Chunk.zip }) export const AssociativeFlatten = P.instance]>>({ flatten: Chunk.flatten }) export const Covariant = P.instance]>>({ map: Chunk.map }) export const ApplyZip = P.instance]>>({ ...Covariant, ...AssociativeBothZip }) export const Monad = P.instance]>>({ ...Any, ...Covariant, ...AssociativeFlatten }) export const Applicative = getApplicativeF(Monad) export const ForEach = P.instance]>>({ map: Chunk.map, forEachF: Chunk.forEachF }) export const ForEachWithIndex = P.instance]>>({ map: Chunk.map, forEachWithIndexF: Chunk.forEachWithIndexF }) export const Wiltable = P.instance]>>({ separateF: Chunk.separateF }) export const WiltableWithIndex = P.instance]>>({ separateWithIndexF: Chunk.separateWithIndexF }) export const Witherable = P.instance]>>({ compactF: Chunk.compactF }) export const WitherableWithIndex = P.instance]>>({ compactWithIndexF: Chunk.compactWithIndexF }) export const Compact = P.instance]>>({ compact: Chunk.compact }) export const Separate = P.instance]>>({ separate: Chunk.separate }) export const Extend = P.instance]>>({ extend: (f) => (fa) => Chunk.single(f(fa)) }) export const Reduce = P.instance]>>({ reduce: Chunk.reduce }) export const ReduceWithIndex = P.instance]>>({ reduceWithIndex: (b, f) => (fa) => Chunk.reduce_(Chunk.zipWithIndex(fa), b, (b, { tuple: [a, i] }) => f(i, b, a)) }) export const ReduceRightWithIndex = P.instance]>>( { reduceRightWithIndex: (b, f) => (fa) => Chunk.reduceRight_(Chunk.zipWithIndex(fa), b, ({ tuple: [a, i] }, b) => f(i, a, b) ) } ) export const ReduceRight = P.instance]>>({ reduceRight: Chunk.reduceRight }) export const FoldMap = P.instance]>>({ foldMap: Chunk.foldMap }) export const FoldMapWithIndex = P.instance]>>({ foldMapWithIndex: Chunk.foldMapWithIndex }) export const Foldable = P.instance]>>({ ...FoldMap, ...Reduce, ...ReduceRight }) export const FoldableWithIndex = P.instance]>>({ ...FoldMapWithIndex, ...ReduceWithIndex, ...ReduceRightWithIndex }) export const Filter = P.instance]>>({ filter: Chunk.filter }) export const FilterWithIndex = P.instance]>>({ filterWithIndex: (predicate: PredicateWithIndex) => (fa: Chunk.Chunk): Chunk.Chunk => Chunk.collect_(Chunk.zipWithIndex(fa), ({ tuple: [a, i] }) => predicate(i, a) ? O.some(a) : O.none ) }) export const FilterMap = P.instance]>>({ filterMap: Chunk.collect }) export const FilterMapWithIndex = P.instance]>>({ filterMapWithIndex: (f) => (fa) => Chunk.collect_(Chunk.zipWithIndex(fa), ({ tuple: [a, i] }) => f(i, a)) }) export const Partition = P.instance]>>({ partition: Chunk.partition }) export const PartitionWithIndex = P.instance]>>({ partitionWithIndex: Chunk.partitionWithIndex }) export const PartitionMap = P.instance]>>({ partitionMap: Chunk.partitionMap }) export const PartitionMapWithIndex = P.instance< P.PartitionMapWithIndex<[URI]> >({ partitionMapWithIndex: Chunk.partitionMapWithIndex }) export const Filterable = P.instance]>>({ ...Filter, ...FilterMap, ...Partition, ...PartitionMap }) export const FilterableWithIndex = P.instance]>>({ ...FilterWithIndex, ...FilterMapWithIndex, ...PartitionWithIndex, ...PartitionMapWithIndex }) /** * Exposing depth first recursion */ export const DepthFirstChainRec = P.instance]>>({ chainRec: (f: (a: A) => Chunk.Chunk>) => (a: A): Chunk.Chunk => { let todo = f(a) let result = Chunk.empty() while (Chunk.size(todo) > 0) { const e = Chunk.unsafeHead(todo) todo = Chunk.unsafeTail(todo) if (e._tag === "Left") { todo = Chunk.concat_(f(e.left), todo) } else { result = Chunk.append_(result, e.right) } } return result } }) export const depthFirstChainRec = DepthFirstChainRec.chainRec /** * Exposing breadth first recursion */ export const BreadthFirstChainRec = P.instance]>>({ chainRec: (f: (a: A) => Chunk.Chunk>) => (a: A): Chunk.Chunk => { let todo = f(a) let result = Chunk.empty() while (Chunk.size(todo) > 0) { const e = Chunk.unsafeHead(todo) todo = Chunk.unsafeTail(todo) if (e._tag === "Left") { todo = Chunk.concat_(todo, f(e.left)) } else { result = Chunk.append_(result, e.right) } } return result } }) export const breadthFirstChainRec = BreadthFirstChainRec.chainRec