我需要有一个类似于 Haskell 的 ReactiveCocoa 函数break
:
break :: (a -> Bool) -> [a] -> ([a],[a])
break _ xs@[] = (xs, xs)
break p xs@(x:xs')
| p x = ([],xs)
| otherwise = let (ys,zs) = break p xs' in (x:ys,zs)
基本上返回一个元组,其第一个组件是所有不匹配且在第一个匹配之前出现的项目。第二个组件是匹配的项目和列表的尾部(无论它们是否匹配)。
ReactiveCocoa 的直接翻译是
- (RACTuple *)breakSequence:(RACSequence *)seq withBlock:(BOOL(^)(NSString *))matchBlock
{
id head = [seq head];
if (matchBlock(head)) {
return [RACTuple tupleWithObjects:[RACSequence empty], seq, nil];
} else {
RACTuple *t = [self breakSequence:[seq tail] withBlock:matchBlock];
return [RACTuple tupleWithObjects:[RACSequence sequenceWithHeadBlock:^id{
return head;
} tailBlock:^RACSequence *{
return [t first];
}], [t second], nil];
}
}
显然它可以工作,但由于breakSequence:seq withBlock:
.
在 ReactiveCocoa 中实现此功能的最佳方法是什么?
谢谢 :-)