Doesn’t it strike you as odd, that you can write such code in C#:
if (sequence.Any()) ...
and it is efficient as it can be, but when you rely on
if (sequence.Count() > 0) ...
you may fall into a trap of extensive computation despite you just need confirmation whether the sequence is empty or not. Well, this disparity annoyed me for a long time and all I could think of was passing somehow a predicate to
Count. It is as fishy as it sounds, and it annoyed me even more.
Until the perspective changed — who said
Count should count anything? Why
Count should jump right away with exact answer?
Count should be lazy and it should simply return the instance of some numeric like type, say
SequenceCount — that type should keep reference to the sequence, have implicit conversion to
Int and — what is crucial — it should also overload comparison operators. With all those goodies you could finally write:
// Skila syntax if (1...).count() > 0 then stdOut.writeLine("not empty"); end
to see a printout after a few CPU cycles.
Now when I solved this issue I can think of general lazy evaluation design for Skila…