public function testFnCacheResult() { $data = array(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3); $count = 0; $scale = 2; $fn = FnGen::fnCacheResult(function ($value) use(&$count, $scale) { $count += 1; return $value * $scale; }); foreach ($data as $value) { $this->assertEquals($value * $scale, $fn($value)); } $this->assertEquals(count(array_unique($data)), $count); $data = array('one', 'One', 'oNe', 'onE', 'two', 'tWo'); $count = 0; $scale = 2; $fnToUpper = FnString::fnToUpper(); $fn = FnGen::fnCacheResult(function ($value) use(&$count, $scale, $fnToUpper) { $count += 1; return $fnToUpper($value); }, $fnToUpper); foreach ($data as $value) { $this->assertEquals($fnToUpper($value), $fn($value)); } $this->assertEquals(count(array_unique(array_map($fnToUpper, $data))), $count); }