ali-eltaweel/predkit

There is no license information available for the latest version (1.0.0) of this package.

A collection of composable predicate classes for PHP, allowing flexible combination of conditions using binary operations such as AND, OR, and more.

1.0.0 2025-06-14 18:03 UTC

This package is not auto-updated.

Last update: 2025-06-15 11:51:21 UTC


README

Composable predicate classes for PHP, allowing flexible combination of conditions using binary operations.

Installation

Install predkit via Composer:

composer require ali-eltaweel/predkit

Usage

Creating predicates

By extending the Predicate class

use Predkit\Predicate;

class IsEven extends Predicate {

    public function test(mixed $number): bool {

        return $number % 2 === 0;
    }
}

$predicate = new IsEven();

By speciying a callable

use Predkit\Predicate;

$predicate = Predicate::fromCallable(function (mixed $number): bool {
    
    return $number % 2 === 0;
});

Using predicates

$predicate->test(4); // true
$predicate->test(5); // false

$evenNumbers = array_filter([1, 2, 3, 4, 5], $predicate); // [2, 4]

Combining predicates

Predicates can be combined using binary operations. The result is a new predicate that represents the combination of the original predicates.

use Predkit\Predicate;

$evenPredicate = Predicate::fromCallable(function (mixed $number): bool {

    return $number % 2 === 0;
});

$greaterThanFivePredicate = Predicate::fromCallable(function (mixed $number): bool {

    return $number > 5;
});

// and
$evenAndGreaterThanFivePredicate = $evenPredicate->and($greaterThanFivePredicate);
array_filter(range(0, 10), $evenAndGreaterThanFivePredicate); // [6, 8, 10]

// or
$evenOrGreaterThanFivePredicate  = $evenPredicate->or($greaterThanFivePredicate);
array_filter(range(0, 10), $evenOrGreaterThanFivePredicate); // [0, 2, 4, 6, 7, 8, 9, 10]

// not
$oddPredicate = $evenPredicate->not();
array_filter(range(0, 10), $oddPredicate); // [1, 3, 5, 7, 9]

// nand
$evenNandGreaterThanFivePredicate = $evenPredicate->nand($greaterThanFivePredicate);
array_filter(range(0, 10), $evenNandGreaterThanFivePredicate); // [0, 1, 2, 3, 4, 5, 7, 9]

// nor
$evenNorGreaterThanFivePredicate = $evenPredicate->nor($greaterThanFivePredicate);
array_filter(range(0, 10), $evenNorGreaterThanFivePredicate); // [1, 3, 5]

// xor
$evenXorGreaterThanFivePredicate = $evenPredicate->xor($greaterThanFivePredicate);
array_filter(range(0, 10), $evenXorGreaterThanFivePredicate); // [ 0, 2, 4, 7, 9 ]

// xnor
$evenXnorGreaterThanFivePredicate = $evenPredicate->xnor($greaterThanFivePredicate);
array_filter(range(0, 10), $evenXnorGreaterThanFivePredicate); // [ 1, 3, 5, 6, 8, 10 ]