Issue 7839 - std.range.countFrom() too
Summary: std.range.countFrom() too
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P4 enhancement
Assignee: No Owner
URL:
Keywords: bootcamp
Depends on:
Blocks:
 
Reported: 2012-04-05 17:59 UTC by bearophile_hugs
Modified: 2024-12-01 16:14 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2012-04-05 17:59:57 UTC
I'd like a count() in std.range. It's similar to the generator with the same name in the Python itertools module:
http://docs.python.org/library/itertools.html#itertools.count

a count() is also useful with bigints, where you can't replace it with iota(BigInt.max).


A bare-bones implementation that shows it basic semantics (but it's useful to add few more methods):


struct Count(T) {
    T n;
    this(T n_) { this.n = n_; }
    const bool empty = false;
    @property T front() { return n; }
    void popFront() { /* n++; */ n += 1; }
}

// Two helper functions
Count!T count(T)(T start) { return Count!T(start); }
Count!T count(T)() { return Count!T(cast(T)0); }
Comment 1 bearophile_hugs 2012-04-23 13:54:31 UTC
And answer to a question by jerro in D.learn:

http://forum.dlang.org/thread/4F949E90.9060700@webdrake.net#post-evdrwckxsqieyrweuxzp:40forum.dlang.org

> Couldn't it just be iota with no parameters?

The Count range has a helper count() function similar to this, that's meant to have an argument that defaults to zero:

Count!T count(T)(T start=0) if (isIntegral!T) { return Count!T(start); }

The argument allows it to start from another starting point, and it allows you to specify the type of the numbers it yields, while in iota() without arguments it's less easy to specify the type of the numbers it yields.

Count(5) is easy to replace with iota(5, int.max), but count(BigInt(0)) is less easy to replace with iota, because it doesn't give you a way to denote a right-open BigInt interval. And using iota(BigInt(0), BigInt(ulong.max)) is not that good. Currently using BigInt in iota seems to not even being supported.
Comment 2 bearophile_hugs 2012-04-24 19:43:36 UTC
std.algorithm has a function named count(), so this range will need a different name. Maybe countFrom()?
Comment 3 bearophile_hugs 2012-04-24 19:47:13 UTC
Changed the name of this issue from "std.range.count() too" to "std.range.countFrom() too".
Comment 4 Seb 2017-07-12 17:16:28 UTC
Wouldn't it make sense to add support for BigInt to iota instead of creating yet another range?
Comment 5 Francesco Mecca 2018-01-26 21:03:31 UTC
(In reply to Seb from comment #4)
> Wouldn't it make sense to add support for BigInt to iota instead of creating
> yet another range?

From what I understand the itertools.count doesn't accetp an upperbound while iota forces the user to specify the upper bound.

Did I understand that correctly?
Comment 6 dlangBugzillaToGithub 2024-12-01 16:14:57 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/phobos/issues/9924

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB