import { realCause } from "@effect/core/io/Cause/definition" /** * Finds something and extracts some details from it. * * @tsplus static effect/core/io/Cause.Aspects find * @tsplus pipeable effect/core/io/Cause find */ export function find(f: (cause: Cause) => Maybe) { return (self: Cause): Maybe => findSafe(self, f).run } function findSafe( self: Cause, f: (cause: Cause) => Maybe ): Eval> { const result = f(self) if (result._tag === "Some") { return Eval.succeed(result) } realCause(self) switch (self._tag) { case "Both": case "Then": { return Eval.suspend(findSafe(self.left, f)).flatMap((leftResult) => leftResult._tag === "Some" ? Eval.succeedNow(leftResult) : findSafe(self.right, f) ) as Eval> } case "Stackless": { return Eval.suspend(findSafe(self.cause, f)) } default: { return Eval.succeed(result) } } }