More tolerant predicate. Add `dropWhile()` and `dropLastWhile()`.
This commit is contained in:
parent
4597e0d42a
commit
55e1bbda22
|
@ -199,7 +199,7 @@ PHP_METHOD(Collection, all)
|
||||||
CALLBACK_PASS_PAIR(bucket);
|
CALLBACK_PASS_PAIR(bucket);
|
||||||
zend_call_function(&fci, &fcc);
|
zend_call_function(&fci, &fcc);
|
||||||
zval_ptr_dtor(¶ms[0]);
|
zval_ptr_dtor(¶ms[0]);
|
||||||
if (Z_TYPE(retval) == IS_FALSE)
|
if (!zend_is_true(&retval))
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
ZEND_HASH_FOREACH_END();
|
ZEND_HASH_FOREACH_END();
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
|
@ -219,7 +219,7 @@ PHP_METHOD(Collection, any)
|
||||||
CALLBACK_PASS_PAIR(bucket);
|
CALLBACK_PASS_PAIR(bucket);
|
||||||
zend_call_function(&fci, &fcc);
|
zend_call_function(&fci, &fcc);
|
||||||
zval_ptr_dtor(¶ms[0]);
|
zval_ptr_dtor(¶ms[0]);
|
||||||
if (Z_TYPE(retval) == IS_TRUE)
|
if (zend_is_true(&retval))
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
ZEND_HASH_FOREACH_END();
|
ZEND_HASH_FOREACH_END();
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
|
@ -434,8 +434,7 @@ PHP_METHOD(Collection, copyOf)
|
||||||
ERR_BAD_SIZE();
|
ERR_BAD_SIZE();
|
||||||
RETURN_NULL();
|
RETURN_NULL();
|
||||||
}
|
}
|
||||||
if (new_size == 0)
|
if (new_size == 0) {
|
||||||
{
|
|
||||||
ARRAY_NEW(new_collection, 0);
|
ARRAY_NEW(new_collection, 0);
|
||||||
RETURN_NEW_COLLECTION(new_collection);
|
RETURN_NEW_COLLECTION(new_collection);
|
||||||
}
|
}
|
||||||
|
@ -545,12 +544,48 @@ PHP_METHOD(Collection, dropLast)
|
||||||
|
|
||||||
PHP_METHOD(Collection, dropLastWhile)
|
PHP_METHOD(Collection, dropLastWhile)
|
||||||
{
|
{
|
||||||
|
zend_fcall_info fci;
|
||||||
|
zend_fcall_info_cache fcc;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||||
|
Z_PARAM_FUNC(fci, fcc)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
INIT_FCI();
|
||||||
|
zval* current = COLLECTION_FETCH_EX();
|
||||||
|
ARRAY_CLONE(new_collection, current);
|
||||||
|
ZEND_HASH_REVERSE_FOREACH_BUCKET(new_collection, Bucket* bucket)
|
||||||
|
ZVAL_COPY_VALUE(¶ms[0], &bucket->val);
|
||||||
|
CALLBACK_PASS_PAIR(bucket);
|
||||||
|
zend_call_function(&fci, &fcc);
|
||||||
|
zval_ptr_dtor(¶ms[0]);
|
||||||
|
if (zend_is_true(&retval))
|
||||||
|
zend_hash_del_bucket(new_collection, bucket);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_NEW_COLLECTION(new_collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, dropWhile)
|
PHP_METHOD(Collection, dropWhile)
|
||||||
{
|
{
|
||||||
|
zend_fcall_info fci;
|
||||||
|
zend_fcall_info_cache fcc;
|
||||||
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||||
|
Z_PARAM_FUNC(fci, fcc)
|
||||||
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
INIT_FCI();
|
||||||
|
zval* current = COLLECTION_FETCH_EX();
|
||||||
|
ARRAY_CLONE(new_collection, current);
|
||||||
|
ZEND_HASH_FOREACH_BUCKET(new_collection, Bucket* bucket)
|
||||||
|
ZVAL_COPY_VALUE(¶ms[0], &bucket->val);
|
||||||
|
CALLBACK_PASS_PAIR(bucket);
|
||||||
|
zend_call_function(&fci, &fcc);
|
||||||
|
zval_ptr_dtor(¶ms[0]);
|
||||||
|
if (zend_is_true(&retval))
|
||||||
|
zend_hash_del_bucket(new_collection, bucket);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
ZEND_HASH_FOREACH_END();
|
||||||
|
RETVAL_NEW_COLLECTION(new_collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, fill)
|
PHP_METHOD(Collection, fill)
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
--TEST--
|
||||||
|
Test Collection::dropWhile() and Collection::dropLastWhile().
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$collection = Collection::init([5, 7, 1, 4, 3]);
|
||||||
|
$collection1 = $collection->dropWhile(function ($value) {
|
||||||
|
return $value % 2;
|
||||||
|
});
|
||||||
|
if ($collection1->toArray() != [3 => 4, 4 => 3])
|
||||||
|
echo 'Collection::dropWhile() failed.', PHP_EOL;
|
||||||
|
$collection2 = $collection->dropLastWhile(function ($value) {
|
||||||
|
return $value < 6;
|
||||||
|
});
|
||||||
|
if ($collection2->toArray() != [5, 7])
|
||||||
|
echo 'Collection::dropLastWhile() failed.', PHP_EOL;
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
Reference in New Issue