// ets_tracing: off import type { Either } from "@effect-ts/system/Either" import type { ArrayURI } from "../../../Modules/index.js" import type { URI } from "../../../Prelude/index.js" import { getApplicativeF } from "../../../Prelude/index.js" import * as P from "../../../Prelude/index.js" import * as A from "./operations.js" export const Any = P.instance]>>({ any: () => [{}] }) export const AssociativeBothZip = P.instance]>>({ both: A.zip }) export const AssociativeFlatten = P.instance]>>({ flatten: A.flatten }) export const Covariant = P.instance]>>({ map: A.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: A.map, forEachF: A.forEachF }) export const ForEachWithIndex = P.instance]>>({ map: A.map, forEachWithIndexF: A.forEachWithIndexF }) export const Wiltable = P.instance]>>({ separateF: A.separateF }) export const WiltableWithIndex = P.instance]>>({ separateWithIndexF: A.separateWithIndexF }) export const Witherable = P.instance]>>({ compactF: A.compactF }) export const WitherableWithIndex = P.instance]>>({ compactWithIndexF: A.compactWithIndexF }) export const Compact = P.instance]>>({ compact: A.compact }) export const Separate = P.instance]>>({ separate: A.separate }) export const Extend = P.instance]>>({ extend: A.extend }) export const Reduce = P.instance]>>({ reduce: A.reduce }) export const ReduceWithIndex = P.instance]>>({ reduceWithIndex: A.reduceWithIndex }) export const ReduceRightWithIndex = P.instance]>>( { reduceRightWithIndex: A.reduceRightWithIndex } ) export const ReduceRight = P.instance]>>({ reduceRight: A.reduceRight }) export const FoldMap = P.instance]>>({ foldMap: A.foldMap }) export const FoldMapWithIndex = P.instance]>>({ foldMapWithIndex: A.foldMapWithIndex }) export const Foldable = P.instance]>>({ ...FoldMap, ...Reduce, ...ReduceRight }) export const FoldableWithIndex = P.instance]>>({ ...FoldMapWithIndex, ...ReduceWithIndex, ...ReduceRightWithIndex }) export const Filter = P.instance]>>({ filter: A.filter }) export const FilterWithIndex = P.instance]>>({ filterWithIndex: A.filterWithIndex }) export const FilterMap = P.instance]>>({ filterMap: A.collect }) export const FilterMapWithIndex = P.instance]>>({ filterMapWithIndex: A.collectWithIndex }) export const Partition = P.instance]>>({ partition: A.partition }) export const PartitionWithIndex = P.instance]>>({ partitionWithIndex: A.partitionWithIndex }) export const PartitionMap = P.instance]>>({ partitionMap: A.partitionMap }) export const PartitionMapWithIndex = P.instance< P.PartitionMapWithIndex<[URI]> >({ partitionMapWithIndex: A.partitionMapWithIndex }) export const Filterable = P.instance]>>({ ...Filter, ...FilterMap, ...Partition, ...PartitionMap }) export const FilterableWithIndex = P.instance]>>({ ...FilterWithIndex, ...FilterMapWithIndex, ...PartitionWithIndex, ...PartitionMapWithIndex }) export const depthFirstChainRec: P.ChainRec<[URI]>["chainRec"] = ( f: (a: A) => ReadonlyArray> ): ((a: A) => ReadonlyArray) => { return (a) => { // tslint:disable-next-line: readonly-array const todo: Array> = [...f(a)] // tslint:disable-next-line: readonly-array const result: Array = [] while (todo.length > 0) { const e = todo.shift()! if (e._tag === "Left") { todo.unshift(...f(e.left)) } else { result.push(e.right) } } return result } } export function breadthFirstChainRec( f: (a: A) => ReadonlyArray> ): (a: A) => ReadonlyArray { return (a) => { const initial = f(a) // tslint:disable-next-line: readonly-array const todo: Array> = [] // tslint:disable-next-line: readonly-array const result: Array = [] function go(e: Either): void { if (e._tag === "Left") { f(e.left).forEach((v) => todo.push(v)) } else { result.push(e.right) } } for (const e of initial) { go(e) } while (todo.length > 0) { go(todo.shift()!) } return result } } /** * Exposing depth first recursion */ export const DepthFirstChainRec = P.instance]>>({ chainRec: depthFirstChainRec }) /** * Exposing breadth first recursion */ export const BreadthFirstChainRec = P.instance]>>({ chainRec: breadthFirstChainRec })