Skip to content

jojo1981/typed-collection

Repository files navigation

A typed collection data structure

Build Status Coverage Status Latest Stable Version Total Downloads License

Author: Joost Nijhuis <jnijhuis81@gmail.com>

The typed collection is an ordered mutable sequence.

It is a data structure which is in fact a wrapper around an indexed array.
When a new collection is created the type for the collection MUST be given. The collection is of a certain type and will guarantee all elements in the collection are of the same type.
The type can be a primitive type or a class/interface type set for the collection.

Available types are:

  • int (alias integer),
  • float (aliases real, double or number)
  • string (alias text)
  • array
  • object
  • callable (alias callback)
  • iterable
  • class (class or interface name)

The \Jojo1981\TypedCollection\Collection class is countable and is traversable (iterable). The collection has the following convenient instance methods:

  • getType(): string
  • isEqualType(Collection $otherCollection): bool
  • isEmpty(): bool
  • isNonEmpty(): bool
  • unshiftElement($element): void
  • pushElement($element): void
  • shiftElement()
  • popElement()
  • hasElement($element): bool
  • pushElements(array $elements): void
  • unshiftElements(array $elements): void
  • setElements(array $elements): void
  • removeElement($element): void
  • indexOfElement($element): ?int
  • getElementByIndex(int $index)
  • getFirstElement()
  • getLastElement()
  • getFirstElementAsCollection(): Collection
  • toArray(): array
  • sortBy(callable $comparator): Collection
  • map(string $type, callable $mapper): Collection
  • flatMap(string $type, callable $mapper): Collection
  • merge(Collection $otherCollection, Collection ...$otherCollections): void
  • all(callable $predicate): bool
  • some(callable $predicate): bool
  • none(callable $predicate): bool
  • forEach(callable $callback): void
  • foldLeft(callable $callback, $initial = null)
  • foldRight(callable $callback, $initial = null)
  • filter(callable $predicate): Collection
  • find(callable $predicate)
  • group(callable $predicate, callable ...$predicates): Collection
  • partition(callable $predicate): Collection
  • slice(int $offset, ?int $length = null): Collection
  • clear(): void
  • count(): int
  • getIterator(): CollectionIterator
  • isEqualCollection(Collection $otherCollection, ?callable $predicate = null, bool $strict = false): bool

The \Jojo1981\TypedCollection\Collection has a static method createFromCollections.
Multiple collection of the same type can be merged together into one collection.

Installation

Library

git clone https://github.com/jojo1981/typed-collection.git

Composer

Install PHP Composer

composer require jojo1981/typed-collection

Basic usage

<?php

require 'vendor/autoload.php';

// Create an empty collection of type `string`
$collection1 = new \Jojo1981\TypedCollection\Collection('string');

// Create a collection of type `integer` with some elements
$collection2 = new \Jojo1981\TypedCollection\Collection('int', [1, 2, 3]);

// Will throw an exception, because an invalid type has been given
try {
    $collection = new \Jojo1981\TypedCollection\Collection('invalid');
} catch (\Jojo1981\TypedCollection\Exception\CollectionException $exception) {
  echo $exception->getMessage() . PHP_EOL;
}

// Create a collection of class type \stdClass
$collection3 = new \Jojo1981\TypedCollection\Collection(\stdClass::class);
$collection3->pushElement(new \stdClass());

try {
    $collection3->pushElement('element');
} catch (\Jojo1981\TypedCollection\Exception\CollectionException $exception) {
    echo $exception->getMessage() . PHP_EOL;
}

echo 'Collection count: ' . $collection3->count() . PHP_EOL; // Will be 1

About

Typed collection

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages