// ets_tracing: off import * as T from "../../Effect/index.js" import { flow } from "../../Function/index.js" import * as BA from "../BoolAlgebra/index.js" export class BoolAlgebraM { readonly [T._R]: (_: R) => void; readonly [T._E]: () => E; readonly [T._A]: () => A constructor(readonly run: T.Effect>) {} } export function and_( self: BoolAlgebraM, that: BoolAlgebraM ): BoolAlgebraM { return new BoolAlgebraM(T.zipWith_(self.run, that.run, BA.and_)) } export function and(that: BoolAlgebraM) { return (self: BoolAlgebraM) => and_(self, that) } export function or_( self: BoolAlgebraM, that: BoolAlgebraM ): BoolAlgebraM { return new BoolAlgebraM(T.zipWith_(self.run, that.run, BA.or_)) } export function or(that: BoolAlgebraM) { return (self: BoolAlgebraM) => or_(self, that) } export function implies_( self: BoolAlgebraM, that: BoolAlgebraM ): BoolAlgebraM { return new BoolAlgebraM(T.zipWith_(self.run, that.run, BA.implies_)) } export function implies(that: BoolAlgebraM) { return (self: BoolAlgebraM) => implies_(self, that) } export function iff_( self: BoolAlgebraM, that: BoolAlgebraM ): BoolAlgebraM { return new BoolAlgebraM(T.zipWith_(self.run, that.run, BA.iff_)) } export function iff(that: BoolAlgebraM) { return (self: BoolAlgebraM) => iff_(self, that) } export function not(self: BoolAlgebraM): BoolAlgebraM { return new BoolAlgebraM(T.map_(self.run, BA.not)) } export function as_( self: BoolAlgebraM, b: B ): BoolAlgebraM { return map_(self, (_) => b) } export function as(b: B) { return (self: BoolAlgebraM) => as_(self, b) } export function chain_( self: BoolAlgebraM, f: (a: A) => BoolAlgebraM ): BoolAlgebraM { return new BoolAlgebraM( T.chain_( self.run, BA.chainM((_) => f(_).run) ) ) } export function chain(f: (a: A) => BoolAlgebraM) { return (self: BoolAlgebraM) => chain_(self, f) } export function isSuccess( self: BoolAlgebraM ): T.Effect { return T.map_(self.run, BA.isSuccess) } export function map_( self: BoolAlgebraM, f: (a: A) => B ): BoolAlgebraM { return chain_(self, flow(f, success)) } export function failure(a: A): BoolAlgebraM { return new BoolAlgebraM(T.succeed(BA.failure(a))) } export function fromEffect(effect: T.Effect): BoolAlgebraM { return new BoolAlgebraM(T.map_(effect, BA.success)) } export function success(a: A): BoolAlgebraM { return new BoolAlgebraM(T.succeed(BA.success(a))) }