<?php Chain::addTerminal('join', function ($data, $joiner = '', $terminalJoiner = null, $ifEmpty = '') { if (is_null($terminalJoiner)) { $terminalJoiner = $joiner; } switch (count($data)) { case 0: return $ifEmpty; case 1: return $data[0]; case 2: return join($terminalJoiner, $data); default: $last = array_pop($data); return join($terminalJoiner, [join($joiner, $data), $last]); } });
<?php Chain::addTerminal('sum', function ($data) { return array_sum($data); });
<?php Chain::addTerminal('shift', function ($data) { return array_shift($data); });
<?php Chain::addTerminal('first', function ($data, $ifEmpty = null) { return empty($data) ? $ifEmpty : array_values($data)[0]; });
<?php Chain::addTerminal('reduce', function ($data, $action, $initial = null) { return array_reduce($data, $action, $initial); });
<?php Chain::addTerminal('product', function ($data) { return array_product($data); });
<?php Chain::addTerminal('asEnglish', function ($data, $ifEmpty = '') { return count($data) == 2 ? hooray($data)->join(' and ') : hooray($data)->join(', ', ', and ', $ifEmpty); });
<?php Chain::addTerminal('pop', function ($data) { return array_pop($data); });