// ets_tracing: off
import type { EitherURI } from "../Modules/index.js"
import type { URI } from "../Prelude/index.js"
import * as P from "../Prelude/index.js"
import type { V } from "./definition.js"
import * as E from "./operations/index.js"
export const Any = P.instance
], V>>({
any: () => E.right({})
})
export const AssociativeBoth = P.instance], V>>({
both: E.zip
})
export const AssociativeEither = P.instance], V>>({
orElseEither: (fb) => (fa) =>
fa._tag === "Right" ? E.right(E.left(fa.right)) : E.map_(fb(), E.right)
})
export const AssociativeFlatten = P.instance], V>>(
{
flatten: E.flatten
}
)
export const Covariant = P.instance], V>>({
map: E.map
})
export const Applicative = P.instance], V>>({
...Any,
...Covariant,
...AssociativeBoth
})
export const Monad = P.instance], V>>({
...Any,
...Covariant,
...AssociativeFlatten
})
export const Fail = P.instance], V>>({
fail: E.left
})
export const Run = P.instance], V>>({
either: E.right
})
export const ForEach = P.instance], V>>({
map: E.map,
forEachF: E.forEachF
})
export const FoldMap = P.instance], V>>({
foldMap: E.foldMap
})
export const Reduce = P.instance], V>>({
reduce: E.reduce
})
export const ReduceRight = P.instance], V>>({
reduceRight: E.reduceRight
})
export const Foldable = P.instance], V>>({
...FoldMap,
...Reduce,
...ReduceRight
})
export const ChainRec = P.instance]>>({
chainRec:
(f: (a: A) => E.Either>) =>
(a: A): E.Either =>
P.tailRec>, E.Either>(f(a), (e) =>
E.isLeft(e)
? E.right(E.left(e.left))
: E.isLeft(e.right)
? E.left(f(e.right.left))
: E.right(E.right(e.right.right))
)
})
export const { chainRec } = ChainRec