Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std.range.countFrom() too #9924

Open
dlangBugzillaToGithub opened this issue Apr 5, 2012 · 5 comments
Open

std.range.countFrom() too #9924

dlangBugzillaToGithub opened this issue Apr 5, 2012 · 5 comments

Comments

@dlangBugzillaToGithub
Copy link

bearophile_hugs reported this on 2012-04-05T17:59:57Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=7839

CC List

Description

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); }
@dlangBugzillaToGithub
Copy link
Author

bearophile_hugs commented on 2012-04-23T13:54:31Z

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.

@dlangBugzillaToGithub
Copy link
Author

bearophile_hugs commented on 2012-04-24T19:43:36Z

std.algorithm has a function named count(), so this range will need a different name. Maybe countFrom()?

@dlangBugzillaToGithub
Copy link
Author

bearophile_hugs commented on 2012-04-24T19:47:13Z

Changed the name of this issue from "std.range.count() too" to "std.range.countFrom() too".

@dlangBugzillaToGithub
Copy link
Author

greensunny12 commented on 2017-07-12T17:16:28Z

Wouldn't it make sense to add support for BigInt to iota instead of creating yet another range?

@dlangBugzillaToGithub
Copy link
Author

me commented on 2018-01-26T21:03:31Z

(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?

@LightBender LightBender removed the P4 label Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants