Login   Register  
PHP Classes
elePHPant
Icontem

File: FuncUtility.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Stanislav Shramko  >  FuncUtility  >  FuncUtility.php  >  Download  
File: FuncUtility.php
Role: Class source
Content type: text/plain
Description: The code
Class: FuncUtility
Manipulate values in iterable data sets
Author: By
Last change:
Date: 2009-06-20 17:47
Size: 3,796 bytes
 

Contents

Class file image Download
<?php
/**
 * Allows to use FP-like features for arrays, strings, SPL iterators and even results
 * returned from callbacks
 *
 * This class adds a lot of syntax sugar to your recordset processing routines or other
 * similar tasks when you don't want to write a loop construct. You will never see the
 * calls of FuncUtility methods in the Frontier's core. It uses call_user_func(),
 * which is slow. But I hope, it's performance will be improved someday though.
 *
 * @author Stanis Shramko <stanislav.shramko@gmail.com>
 */
class FuncUtility
{

  
/**
   * Filters all elements of $set using the $callback
   *
   * @return array
   * @throws InvalidArgumentException
   */
  
public static function filter($callback$set)
  {
    if (!
is_callable($callback))
    {
      throw new 
InvalidArgumentException(
        
'The first argument is not callable');
    }
    
$values = array();
    if (
is_callable($set))
    {
      while (
$value call_user_func($set))
      {
        if (
call_user_func($callback$value))
        {
          
$values[] = $value;
        }
      }
    }
    else
    {
      foreach ((
$set self::prepareIterable($set)) as $value)
      {
        if (
call_user_func($callback$value))
          
$values[] = $value;
      }
    }
    return 
$values;
  }

  
/**
   * Applies the $callback to all elements of $set
   *
   * @return void
   * @throws InvalidArgumentException
   */
  
public static function each($callback$set)
  {
    if (!
is_callable($callback))
    {
      throw new 
InvalidArgumentException(
        
'The first argument is not callable');
    }
    if (
is_callable($set))
    {
      while (
$value call_user_func($set))
      {
        
call_user_func($callback$value);
      }
    }
    else
    {
      foreach ((
$set self::prepareIterable($set)) as $value)
      {
        
call_user_func($callback$value);
      }
    }
  }

  
/**
   * Applies the $callback to all elements of $set
   *
   * @return array
   * @throws InvalidArgumentException
   */
  
public static function map($callback$set)
  {
    if (!
is_callable($callback))
    {
      throw new 
InvalidArgumentException(
        
'The first argument is not callable');
    }
    
$values = array();
    if (
is_callable($set))
    {
      while (
$value call_user_func($set))
      {
        
$values[] = call_user_func($callback$value);
      }
    }
    else
    {
      foreach ((
$set self::prepareIterable($set)) as $value)
      {
        
$values[] = call_user_func($callback$value);
      }
    }
    return 
$values;
  }

  
/**
   * Reduces the $set using $result
   *
   * @return array
   * @throws InvalidArgumentException
   */
  
public static function reduce($callback$set)
  {
    if (!
is_callable($callback))
    {
      throw new 
InvalidArgumentException(
        
'The first argument is not callable');
    }
    if (
is_callable($set))
    {
      
$result call_user_func($set);
      while (
$value call_user_func($set))
      {
        
$result call_user_func($callback$result$value);
      }
    }
    else
    {
      
$first true;
      foreach ((
$set self::prepareIterable($set)) as $value)
      {
        if (!
$first)
        {
          
$result call_user_func($callback$result,
            
$value);
        }
        else
        {
          
$result $value;
          
$first false;
        }
      }
    }
    return 
$result;
  }

  
/**
   * Prepares "something iterable"
   *
   * @param mixed $set
   * @return mixed array or Iterator
   */
  
protected static function prepareIterable($set)
  {
    if (
is_array($set) || $set instanceof Iterator)
    {
      return 
$set;
    }
    if (
is_string($set))
    {
      return 
str_split($set);
    }
    throw new 
InvalidArgumentException('The second argument is not iterable');
  }

}