<?php
namespace Ulrichsg\Collections;
/**
* A map that contains only numeric values, and supports mathematical operations.
*
* @version 1.0.0
* @license MIT
* @link https://github.com/ulrichsg/php-collections
*/
class NumberMap extends Map {
/** @internal */
private $default;
/**
* Creates a new NumberMap with the given array as its contents. Omitting the argument creates an empty map.
* @param array $data
* @param mixed $default
* @throws \InvalidArgumentException if $default or one of the array values is not numeric
*/
public function __construct(array $data = array(), $default = 0) {
parent::__construct();
foreach ($data as $key => $value) {
$this->set($key, $value);
}
if (is_numeric($default)) {
$this->default = $default;
} else {
throw new \InvalidArgumentException("Expected number, found ".gettype($default));
}
}
/**
* Puts the given key-value pair into the map.
* @param mixed $key
* @param mixed $value
* @throws \InvalidArgumentException if $value is not numeric
*/
public function set($key, $value) {
$this->assertIsNumeric($value);
parent::set($key, $value);
}
/**
* Adds the given value to the one associated to the given key.
* If the key is not in the map yet, put it in and assume the map-wide default value.
* @param mixed $key
* @param mixed $value
* @throws \InvalidArgumentException if $value is not numeric
*/
public function add($key, $value) {
$this->assertIsNumeric($value);
$oldValue = $this->hasKey($key) ? $this->get($key) : $this->default;
$this->set($key, $oldValue + $value);
}
/**
* Returns the sum of all values in the map.
* @return mixed
*/
public function sum() {
return array_sum($this->data);
}
/** @internal */
private function assertIsNumeric($value) {
if (!is_numeric($value)) {
throw new \InvalidArgumentException("Expected number, found ".gettype($value));
}
}
}