From c02b63b393ec05d0fa55c9eff64023618bf3ebfa Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Sun, 24 Aug 2014 21:59:36 +0300 Subject: [PATCH] fluent api for arrays --- src/array.php | 80 +++++++++++++++++++++++++++++++++++++++++++++++++- src/symbol.php | 45 ++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/symbol.php diff --git a/src/array.php b/src/array.php index e11671c..f2f38f7 100644 --- a/src/array.php +++ b/src/array.php @@ -2,8 +2,86 @@ namespace PFF; -final class Arr +use \PFF\Symbol as S; + +final class Arr implements \ArrayAccess { + private $arr; + + public function __construct($arr) + { + $this->arr = $arr; + } + + public static function create($arr) + { + return new self($arr); + } + + public function arr() + { + return $this->arr; + } + + public function map(/* $func, ... $args */) + { + $args = func_get_args(); + $func = array_unshift($args); + $pos = array_search(S::_(), $args, true); + if (!$pos) + $pos = 0; + + $result = array(); + foreach ($this->arr as $item) { + $args[$pos] = $item; + $result[] = call_user_func_array($func, $args); + } + + return new self($result); + } + + public function pluck($key) + { + $result = array(); + foreach ($this->arr as $item) + $result[] = is_object($item) ? $item->$key : $item[$key]; + return new self($result); + } + + /* strings */ + + public function join($separator) + { + return implode($separator, $this->arr); + } + + /* ArrayAccess */ + + public function offsetSet($offset, $value) + { + if (is_null($offset)) + $this->arr[] = $value; + else + $this->arr[$offset] = $value; + } + + public function offsetExists($offset) + { + return isset($this->arr[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->arr[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->arr[$offset]) ? $this->arr[$offset] : null; + } + + /* */ + public static function get($array, $key, $default=null) { if (array_key_exists($key, $array)) diff --git a/src/symbol.php b/src/symbol.php new file mode 100644 index 0000000..8c140b0 --- /dev/null +++ b/src/symbol.php @@ -0,0 +1,45 @@ +name; + } + + public static function intern($name) + { + if (array_key_exists($name, self::$symbols)) + return self::$symbols[$name]; + + $symbol = new self; + $symbol->name = $name; + self::$symbols[$name] = $symbol; + return $symbol; + } + + public static function __callStatic($name, $args) + { + return self::intern($name); + } +} + -- 2.49.0