diff --git a/Foundation/CPArray/CPArray.j b/Foundation/CPArray/CPArray.j index 03104bd56..5a27eca97 100755 --- a/Foundation/CPArray/CPArray.j +++ b/Foundation/CPArray/CPArray.j @@ -536,13 +536,21 @@ var concat = Array.prototype.concat, objj_msgSend([self objectAtIndex:index], aSelector); } -- (void)enumerateObjectsUsingBlock:(Function)aFunction +- (void)enumerateObjectsUsingBlock:(Function /*(id anObject, int idx, @ref BOOL stop)*/)aFunction { + // This could have been [self enumerateObjectsWithOptions:CPEnumerationNormal usingBlock:aFunction] + // but this method should be as fast as possible. var index = 0, - count = [self count]; + count = [self count], + shouldStop = NO, + shouldStopRef = AT_REF(shouldStop); for (; index < count; ++index) - aFunction([self objectAtIndex:index], index); + { + aFunction([self objectAtIndex:index], index, shouldStopRef); + if (shouldStop) + return; + } } - (void)enumerateObjectsWithOptions:(CPEnumerationOptions)options usingBlock:(Function /*(id anObject, int idx, @ref BOOL stop)*/)aFunction diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index 90a2a2ad9..e47d73e49 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -511,8 +511,22 @@ [self assert:input1[0] equals:[output valueForKey:"0"] message:@"output[0]"]; [self assert:input1[1] equals:[output valueForKey:"1"] message:@"output[0]"]; [self assert:input1[2] equals:[output valueForKey:"2"] message:@"output[0]"]; + + stoppingFunction = function(anObject, idx, stop) + { + [output setValue:anObject forKey:"" + idx]; + if ([output count] > 1) + stop(YES); // AT_DEREF(stop, YES) - FIXME Replace with proper @ref @deref when in ObjJ. + } + output = [CPMutableDictionary dictionary]; + + [input1 enumerateObjectsUsingBlock:stoppingFunction]; + [self assert:2 equals:[output count] message:@"output when enumerating input1 and stopping after 2"]; + [self assert:input1[0] equals:[output valueForKey:"0"] message:@"output[0]"]; + [self assert:input1[1] equals:[output valueForKey:"1"] message:@"output[0]"]; } + @end @implementation AlwaysEqual : CPObject