// 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
})