<?php
require_once '../debug.inc.php';
require_once 
'_array.inc.php';
require_once 
'../testik.php';

function 
keyval($val$key) {
    return 
"[$key:$val]";
}

// test the documentation first 
testik('_array.inc.php''doc');

// then run tests from this file
testik();

//////////////////////////////////////////////////////////////////////////

// construct

$a _array(11, array(123), 22);
$a->join('-'); # "11-Array-22"

$a _a(55);
$a->join('-'); # "55"
$a _a(array(123));
$a->join('-'); # "1-2-3"

$a _array();
$a->join('-'); # ""

$a _w("aa bb cc");
$a->join('-'); # "aa-bb-cc"

function tgen($z) {
    static 
$x 0;
    if(++
$x >= 10) return false;
    return 
$z.$x;
}

$a _a()->from_call("tgen""wow");
$a->join('-'); # "wow1-wow2-wow3-wow4-wow5-wow6-wow7-wow8-wow9"

// array access

$a _array(0112233);
$a.''# "0, 11, 22, 33"
$a[] = 44;
$a.''# "0, 11, 22, 33, 44"
unset($a[1]);
$a.''# "0, 22, 33, 44"
isset($a[1]); # false
isset($a[2]); # true

$a _array(0112233);
count($a); # 4
$a->count(); # 4

$a _array(0_array(1122), 33);
count($a);    # 3
// this doesn't work with spl countable
count($a1); # 3
$a->count($a1); # 4



// iterator

$a _array(0112233);
$s '';
foreach(
$a as $k => $v
    
$s .= "$k-$v-";
$s# "0-0-1-11-2-22-3-33-"

// toString
    
$a _array(0112233);
$a ''# "0, 11, 22, 33"
$a _array(0, array(1122), 33_array(4455));
$a ''# "0, 11, 22, 33, 44, 55"    
    
// copy/clone/ref

$a _array(0112233);
$a->set(array(5566));
$a->join("-"); # "55-66"

$a _array(0112233);
implode('/'$a->a()); # "0/11/22/33"

$a _array(0112233);
$a[2] = 'new';
$a[2]; # 'new'

$b $a;
$b[2] = 'new2';
$b[2]; # 'new2'
$a[2]; # 'new2'

$b $a->copy();
$b[2] = 999;
$b[2]; # 999
$a[2]; # 'new2'

$a _array(0112233);
$b $a->filter('strlen');
$a[2] = 'new';
$b[2] = 999;
$a[2]; # 'new'
$b[2]; # 999


$a _array(0112233);
$b $a->sort();
$a ""# $b . ""
$a[2] = 'new';
$b[2] = 999;
$a[2]; # 'new'
$b[2]; # 999

// keys

$a _array(0112233);
unset(
$a[1]);
$a->keys()->join('-'); # "0-2-3"


// elements

$a _a(array('foo' => 11'bar' => 22'baz' => 33));
$a->e('foo'); # "11"
$a->e('ZZZ'); # null
$a->n(0);  # 11
$a->n(-1); # 33

$a _array(112233);
$a->find(33); # 2
$a->find(99); # null
$a->contains(33); # true
$a->contains(99); # false


// iterators

function square($a) { return $a $a; }
function 
moreThan10($a) { return $a 10; }

_array(12345)->map('square')->join('-'); # "1-4-9-16-25"
_array(1203405)->filter('moreThan10')->join('-'); # "20-40"

// map casts subarrays

function tmap($s$d) { return sprintf("(%s)%s%d"strval($s), $dstrlen(strval($s))); }

$a _array('a''bb'_array('ccc''dddd'), array('x''y'), 'eeeee');
$a->map('tmap''=').''# "(a)=1, (bb)=2, (ccc, dddd)=9, (Array)=5, (eeeee)=5"

// rmap handles subarrays

$a _array('a''bb'_array('ccc''dddd'), array('x''y'), 'eeeee');
$a->rmap('tmap''=').''# "(a)=1, (bb)=2, (ccc)=3, (dddd)=4, (x)=1, (y)=1, (eeeee)=5"

$a _array(
    
'1',
    
_array(
        
'2.1',
        
'2.2',
        
_array('2.3.1''2.3.2')
    ),
    
'3'
);

function 
li($s) { 
    return 
is_scalar($s) ? "<li>$s</li>" 
        
"<ul>" $s->map('li')->join() . "</ul>"
}

echo 
li($a); # "<ul><li>1</li><ul><li>2.1</li><li>2.2</li><ul><li>2.3.1</li><li>2.3.2</li></ul></ul><li>3</li></ul>"    

function conc() {
    
$a func_get_args();
    return 
implode("="$a);
}

_w('aa bb cc')->kmap('conc''ex1''ex2')->join("|"); # "aa=0=ex1=ex2|bb=1=ex1=ex2|cc=2=ex1=ex2"


// sort

$a _array(17233846559444);
$a->sort()->join(', '); # "9, 17, 23, 38, 46, 55, 444"
$a->sort(-1)->join(', '); # "444, 55, 46, 38, 23, 17, 9"
$a->sort(_array::ALPHA)->join(', '); # "17, 23, 38, 444, 46, 55, 9"
$a->sort(-_array::ALPHA)->join(', '); # "9, 55, 46, 444, 38, 23, 17"

function cmp_mod($a$b) { return $a 10 $b 10; }

$a->sort('cmp_mod')->join(', '); # "23, 444, 55, 46, 17, 38, 9"

$a _array('img3''img1''img2''img10''img21');
$a->sort(_array::NATURAL)->join(', '); # "img1, img2, img3, img10, img21"

$a _array('img3''img1''img2''img10''img21');
$a->sort(-_array::NATURAL)->join(', '); # "img21, img10, img3, img2, img1"

$a _w('A c B b C a');
$a->sort(_array::ALPHA)->join(); # "ABCabc"
$a->sort(_array::NOCASE)->map('strtolower')->join(); # "aabbcc"

$a _w('A c B b C a')->flip();
$a->ksort()->kmap('keyval')->join(); # "[A:0][B:2][C:4][a:5][b:3][c:1]"



// structural

$a _array(01122334455); 
$a->slice(3)->join('-'); # "33-44-55"
$a->slice(14)->join('-'); # "11-22-33-44"

$a _array(0112233445566); 
$a->sub(4)->join('-'); # "44-55-66"
$a->sub(25)->join('-'); # "22-33-44-55"
$a->sub(-3)->join('-'); # "44-55-66"
$a->sub(-5, -2)->join('-'); # "22-33-44-55"

$a _array(0123456);
$a $a->splice(5);
$a->join(','); # "0,1,2,3,4"
$a $a->splice(12, array(112233));
$a->join(','); # "0,11,22,33,3,4"

// stack

$a _array(1234);
$a->push(102030)->unshift(9988)->join('-'); # "99-88-1-2-3-4-10-20-30"
$a->pop(); # 30
$a->shift(); # 99
strval($a) ; # "88, 1, 2, 3, 4, 10, 20"


// sets

$a _array(112233);
$b $a->union(array(5544), _array(667788), 99);
$b ''# "11, 22, 33, 55, 44, 66, 77, 88, 99"

$a _array(112233445566);
$b $a->intersect(array(4499), _array(668844), array(344));
$b ''# "44"

$a _array(112233445566);
$b $a->diff(array(4499), _array(668844), array(3344));
$b ''# "11, 22, 55"

// arrays of arrays

$a _w('a b c');
$a->combine(_w('1 2 3')    )->kmap('keyval')->join(); # "[a:1][b:2][c:3]"
$a->combine(_w('1')        )->kmap('keyval')->join(); # "[a:1][b:][c:]"
$a->combine(_w('1 2 3 4 5'))->kmap('keyval')->join(); # "[a:1][b:2][c:3][0:4][1:5]"


// misc

$a _array(011, array(22, array(3344), 55), 66);
$a->flatten()->join(","); # "0,11,22,33,44,55,66"

_array(1122992211)->unique()->join("-"); # "11-22-99"
_array(1122334455)->reverse()->join("-"); # "55-44-33-22-11"

$data _array(_w('A B C'), _w('0 1 2'));
$q _w('a b c')->apply('zip'$data_w('x y z'));
$q->map('implode'"-")->join(","); # "a-A-0-x,b-B-1-y,c-C-2-z"