Overview

Namespaces

  • Net
    • Bazzline
      • UniqueNumberRepository
        • Application
          • Service
        • Domain
          • Model
        • Infrastructure
          • Storage

Classes

  • Net\Bazzline\UniqueNumberRepository\Application\Service\ApplicationLocator
  • Net\Bazzline\UniqueNumberRepository\Application\Service\NumberEnumerator
  • Net\Bazzline\UniqueNumberRepository\Application\Service\UniqueNumberEnumeratorFactory
  • Net\Bazzline\UniqueNumberRepository\Domain\Model\RepositoryRequest
  • Net\Bazzline\UniqueNumberRepository\Domain\Model\UniqueNumberRequest
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\AbstractStorage
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\AbstractStorageFactory
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\RepositoryStorage
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\RepositoryStorageFactory
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\UniqueNumberStorage
  • Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\UniqueNumberStorageFactory

Exceptions

  • Net\Bazzline\UniqueNumberRepository\Application\Service\InvalidArgumentException
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 
<?php
/**
 * @author stev leibelt <artodeto@bazzline.net>
 * @since 2015-09-08
 */
namespace Net\Bazzline\UniqueNumberRepository\Application\Service;

use Net\Bazzline\UniqueNumberRepository\Domain\Model\UniqueNumberRequest;
use Net\Bazzline\UniqueNumberRepository\Infrastructure\Storage\UniqueNumberStorage;

class NumberEnumerator
{
    /**
     * @var UniqueNumberStorage
     */
    private $storage;

    /**
     * @param UniqueNumberStorage $storage
     */
    public function __construct(UniqueNumberStorage $storage)
    {
        $this->storage = $storage;
    }

    /**
     * @param string $repositoryName
     * @return int
     */
    public function increment($repositoryName)
    {
        //begin of dependencies
        $storage        = $this->storage;
        //end of dependencies

        //begin of process
        $collection     = $this->fetchCollection($storage, $repositoryName);
        $numbers        = $this->fetchNumbersFromCollection($collection);
        $orderedNumbers = $this->orderNumbers($numbers);
        $freeNumber     = $this->calculateFreeNumber($orderedNumbers);

        return $freeNumber;
        //end of process
    }

    /**
     * @param UniqueNumberStorage $storage
     * @param string $name
     * @return array|\Net\Bazzline\UniqueNumberRepository\Domain\Model\UniqueNumberRequest[]
     */
    private function fetchCollection(UniqueNumberStorage $storage, $name)
    {
        $storage->filterByRepositoryName($name);

        return $storage->readMany();
    }

    /**
     * @param array $collection
     * @return array
     */
    private function fetchNumbersFromCollection(array $collection)
    {
        $numbers = array();

        foreach ($collection as $request) {
            /** @var UniqueNumberRequest $request */
            $numbers[] = $request->number();
        }

        return $numbers;
    }

    /**
     * @param array $numbers
     * @return array
     */
    private function orderNumbers(array $numbers)
    {
        natsort($numbers);

        return $numbers;
    }

    /**
     * @param array $numbers
     * @return int
     */
    private function calculateFreeNumber(array $numbers)
    {
        $currentMaximum = 0;

        foreach ($numbers as $number) {
            $numberIsHigherThanCurrentNumber = ($number > $currentMaximum);

            if ($numberIsHigherThanCurrentNumber) {
                $numberIsHigherThanCurrentNumberPlusOne = ($number > ($currentMaximum + 1));

                if ($numberIsHigherThanCurrentNumberPlusOne) {
                    break;
                }

                $currentMaximum = $number;
            }
        }

        return (++$currentMaximum);
    }
}
PHP Unique Number Repository (REST based server and cli based client) by bazzline.net API documentation generated by ApiGen