private static object StepObject(EachStorage/*!*/ storage, BlockParam/*!*/ block, Range/*!*/ self, object begin, object end, int step) {
Assert.NotNull(storage, block, self);
CheckStep(storage, step);
CheckBegin(storage, self.Begin);
object item = begin, result;
int comp;
var succSite = storage.SuccSite;
while ((comp = Protocols.Compare(storage, item, end)) < 0) {
if (block.Yield(item, out result)) {
return result;
}
for (int i = 0; i < step; ++i) {
item = succSite.Target(succSite, item);
}
}
if (comp == 0 && !self.ExcludeEnd) {
if (block.Yield(item, out result)) {
return result;
}
}
return self;
}