/** * @since 0.24.0 */ import { constFalse, constTrue } from "effect/Function" import * as Predicate from "effect/Predicate" import * as contravariant from "../Contravariant.js" import type * as invariant from "../Invariant.js" import * as monoid from "../Monoid.js" import type * as of_ from "../Of.js" import type * as product_ from "../Product.js" import * as semigroup from "../Semigroup.js" import type { Semigroup } from "../Semigroup.js" import type * as semiProduct from "../SemiProduct.js" const contramap = Predicate.mapInput const imap = contravariant.imap(contramap) const of = (_: A): Predicate.Predicate => Predicate.isUnknown const product = ( self: Predicate.Predicate, that: Predicate.Predicate ): Predicate.Predicate => ([a, b]) => self(a) && that(b) const productAll = ( collection: Iterable> ): Predicate.Predicate> => { return (as) => { let collectionIndex = 0 for (const p of collection) { if (collectionIndex >= as.length) { break } if (p(as[collectionIndex]) === false) { return false } collectionIndex++ } return true } } const productMany = ( self: Predicate.Predicate, collection: Iterable> ): Predicate.Predicate]> => { const rest = productAll(collection) return ([head, ...tail]) => self(head) === false ? false : rest(tail) } /** * @category instances * @since 0.24.0 */ export const Contravariant: contravariant.Contravariant = { imap, contramap } /** * @category instances * @since 0.24.0 */ export const Invariant: invariant.Invariant = { imap } /** * @category instances * @since 0.24.0 */ export const Of: of_.Of = { of } /** * @category instances * @since 0.24.0 */ export const SemiProduct: semiProduct.SemiProduct = { imap, product, productMany } /** * @category instances * @since 0.24.0 */ export const Product: product_.Product = { of, imap, product, productMany, productAll } /** * @category instances * @since 0.24.0 */ export const getSemigroupEqv = (): Semigroup> => semigroup.make>(Predicate.eqv) /** * @category instances * @since 0.24.0 */ export const getMonoidEqv = (): monoid.Monoid> => monoid.fromSemigroup(getSemigroupEqv(), constTrue) /** * @category instances * @since 0.24.0 */ export const getSemigroupXor = (): Semigroup> => semigroup.make>(Predicate.xor) /** * @category instances * @since 0.24.0 */ export const getMonoidXor = (): monoid.Monoid> => monoid.fromSemigroup(getSemigroupXor(), constFalse) /** * @category instances * @since 0.24.0 */ export const getSemigroupSome = (): Semigroup> => semigroup.make>( Predicate.or, (self, collection) => (a) => { if (self(a)) { return true } for (const p of collection) { if (p(a)) { return true } } return false } ) /** * @category instances * @since 0.24.0 */ export const getMonoidSome = (): monoid.Monoid> => monoid.fromSemigroup(getSemigroupSome(), constFalse) /** * @category instances * @since 0.24.0 */ export const getSemigroupEvery = (): Semigroup> => semigroup.make>( Predicate.and, (self, collection) => (a) => { if (!self(a)) { return false } for (const p of collection) { if (!p(a)) { return false } } return true } ) /** * @category instances * @since 0.24.0 */ export const getMonoidEvery = (): monoid.Monoid> => monoid.fromSemigroup(getSemigroupEvery(), constTrue)