include "NSLog.incl" local fn Comparator( obj1 as CFTypeRef, obj2 as CFTypeRef, userData as ptr ) as NSComparisonResult end fn = fn NumberCompare( obj1, obj2 ) local fn Bins( limits as CFArrayRef, dta as CFArrayRef ) as CFArrayRef long count = len(limits) CFMutableArrayRef result = fn MutableArrayWithCapacity( count + 1 ) long i for i = 0 to count MutableArrayAddObject( result, @0 ) next NSBinarySearchingOptions options = NSBinarySearchingInsertionIndex + NSBinarySearchingLastEqual CFNumberRef n for n in dta i = fn ArrayIndexOfObjectInSortedRangeUsingComparator( limits, n, fn CFRangeMake( 0, count ), options, @fn Comparator, NULL ) mid( result, i ) = @( intval(result[i]) + 1 ) next end fn = result void local fn PrintBins( limits as CFArrayRef, bins as CFArrayRef ) long n = len(limits) if ( n == 0 ) then return NSLog(@" < %3ld: %2ld", intval(limits[0]), intval(bins[0])) long i for i = 1 to n - 1 NSLog(@">= %3ld and < %3ld: %2ld", intval(limits[i-1]), intval(limits[i]), intval(bins[i])) next NSLog(@">= %3ld : %2ld", intval(limits[n-1]), intval(bins[n])) end fn void local fn Doit CFArrayRef limits = @[@23, @37, @43, @53, @67, @83] CFArrayRef dta = @[ @95, @21, @94, @12, @99, @4, @70, @75, @83, @93, @52, @80, @57, @5, @53, @86, @65, @17, @92, @83, @71, @61, @54, @58, @47, @16, @8, @9, @32, @84, @7, @87, @46, @19, @30, @37, @96, @6, @98, @40, @79, @97, @45, @64, @60, @29, @49, @36, @43, @55] NSLog(@"Example 1:") fn PrintBins( limits, fn Bins(limits, dta) ) limits = @[@14, @18, @249, @312, @389, @392, @513, @591, @634, @720] dta = @[ @445, @814, @519, @697, @700, @130, @255, @889, @481, @122, @932, @77, @323, @525, @570, @219, @367, @523, @442, @933, @416, @589, @930, @373, @202, @253, @775, @47, @731, @685, @293, @126, @133, @450, @545, @100, @741, @583, @763, @306, @655, @267, @248, @477, @549, @238, @62, @678, @98, @534, @622, @907, @406, @714, @184, @391, @913, @42, @560, @247, @346, @860, @56, @138, @546, @38, @985, @948, @58, @213, @799, @319, @390, @634, @458, @945, @733, @507, @916, @123, @345, @110, @720, @917, @313, @845, @426, @9, @457, @628, @410, @723, @354, @895, @881, @953, @677, @137, @397, @97, @854, @740, @83, @216, @421, @94, @517, @479, @292, @963, @376, @981, @480, @39, @257, @272, @157, @5, @316, @395, @787, @942, @456, @242, @759, @898, @576, @67, @298, @425, @894, @435, @831, @241, @989, @614, @987, @770, @384, @692, @698, @765, @331, @487, @251, @600, @879, @342, @982, @527, @736, @795, @585, @40, @54, @901, @408, @359, @577, @237, @605, @847, @353, @968, @832, @205, @838, @427, @876, @959, @686, @646, @835, @127, @621, @892, @443, @198, @988, @791, @466, @23, @707, @467, @33, @670, @921, @180, @991, @396, @160, @436, @717, @918, @8, @374, @101, @684, @727, @749] NSLog(@"") NSLog(@"Example 2:") fn PrintBins(limits, fn Bins(limits, dta)) end fn fn DoIt HandleEvents