Containers

Containers are object wrappers that allow for fluent operations over contained data.

Containers are a hierarchical tree-like structure. Each container can have multiple child containers and one parent container. This allows for searching all containers in a hierarchy.

Creating containers

All containers inherit from a BaseContainer class. BaseContainer can hold any php object. One container should hold only one type of data.

use TournamentGenerator\Containers\BaseContainer;

$container = new BaseContainer($id);

$container->insert($object1, $object2);

This initiates a container, containing 2 objects: $object1 and $object2.

use TournamentGenerator\Containers\BaseContainer;

$container2 = new BaseContainer($id2);

$container2->insert($object3, $object4, $object5);

$container->addChild($container2);

This creates another container with the ID of $id2 with 3 objects: $object3, $object4 and $object5. The addChild() method appends the $container2 to $container1 as a child creating a tree-like structure:

{
    // $container
    "id": $id,
    "values": [
        $object1,
        $object2
    ],
    "children": [
        {
            // $container2
            "id": $id2,
            "values": [
                $object3,
                $object4,
                $object5
            ],
            children: []
        }
    ]
}

Creating from an array

Container allows for creation right from an array.

use TournamentGenerator\Containers\BaseContainer;

$data = [1, 2, 3, 4];
$container = BaseContainer::fromArray($data);

Inserting values

The insert() method is used to insert any value into the container.

use TournamentGenerator\Containers\BaseContainer;

$container = new BaseContainer($id);
$container->insert(1, 2, 3);

It also works with a class instances.

use TournamentGenerator\Containers\BaseContainer;
use TournamentGenerator\Team;

$container = new BaseContainer($id);
$container->insert(new Team('Team 1'), new Team('Team 2'));

If the class has a container-getter method getContainer(), the insert() method will also add its container as a child to itself.

use TournamentGenerator\Containers\BaseContainer;

class MyClass {

  public BaseContainer $container;
  public string $name;

  public function __construct(string $name) {
    $this->name = $name;
    $this->container = new BaseContainer($name);
  }

  public function getContainer() : BaseContainer {
    return $this->container;
  }
}

$container = new BaseContainer(1);

$container->insert(new MyClass('First'), new MyClass('Second'));

#
# container:
#   - id: 1
#   - values: [
#               MyClass('First'), 
#               MyClass('Second'),
#             ]
#   - children: [
#                 MyClass('First')->container,
#                 MyClass('Second')->container,
#               ]
#

If you want to insert the objects without adding the child containers, you can use the insertFlat() method.

use TournamentGenerator\Containers\BaseContainer;

class MyClass {

  public BaseContainer $container;
  public string $name;

  public function __construct(string $name) {
    $this->name = $name;
    $this->container = new BaseContainer($name);
  }

  public function getContainer() : BaseContainer {
    return $this->container;
  }
}

$container = new BaseContainer(1);

$container->insertFlat(new MyClass('First'), new MyClass('Second'));

#
# container:
#   - id: 1
#   - values: [
#               MyClass('First'), 
#               MyClass('Second'),
#             ]
#   - children: []
#