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);
|
||||
zend_call_function(&fci, &fcc);
|
||||
zval_ptr_dtor(¶ms[0]);
|
||||
if (Z_TYPE(retval) == IS_FALSE)
|
||||
if (!zend_is_true(&retval))
|
||||
RETURN_FALSE;
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETURN_TRUE;
|
||||
|
@ -219,7 +219,7 @@ PHP_METHOD(Collection, any)
|
|||
CALLBACK_PASS_PAIR(bucket);
|
||||
zend_call_function(&fci, &fcc);
|
||||
zval_ptr_dtor(¶ms[0]);
|
||||
if (Z_TYPE(retval) == IS_TRUE)
|
||||
if (zend_is_true(&retval))
|
||||
RETURN_TRUE;
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETURN_FALSE;
|
||||
|
@ -434,8 +434,7 @@ PHP_METHOD(Collection, copyOf)
|
|||
ERR_BAD_SIZE();
|
||||
RETURN_NULL();
|
||||
}
|
||||
if (new_size == 0)
|
||||
{
|
||||
if (new_size == 0) {
|
||||
ARRAY_NEW(new_collection, 0);
|
||||
RETURN_NEW_COLLECTION(new_collection);
|
||||
}
|
||||
|
@ -545,12 +544,48 @@ PHP_METHOD(Collection, dropLast)
|
|||
|
||||
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)
|
||||
{
|
||||
|
||||
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)
|
||||
|
|
|
@ -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