digitalmars.D.learn - construct range from tuple?
- Lutger (13/13) Sep 18 2016 I have a tuple of strings generated at compile time, for example:
- Nicholas Wilson (2/11) Sep 18 2016
- e-y-e (10/24) Sep 18 2016 Use std.range's 'only' function [1], it takes variadic arguments
- e-y-e (2/14) Sep 18 2016 [1] https://dlang.org/phobos/std_range.html#only
- Jonathan M Davis via Digitalmars-d-learn (7/16) Sep 18 2016 You can also just stick them in an array. e.g.
- Lutger (2/14) Sep 18 2016 That's *exactly* what I was looking for, thanx!
I have a tuple of strings generated at compile time, for example:
alias names = AliasSeq!("Alice", "Bob");
How is it possible to construct a range of strings from this, in
order to use it at runtime with other range algorithms?
For example, this
chain(names, ["Chuck"])
doesn't work as intended because it expands to
chain("Alice", "Bob", ["Chuck"])
I want some function makeRange that works like this:
assert(chain(makeRange(names), ["Chuck"]).fold!( (x,y) => x ~ " "
~ y) ==
"Alice Bob Chuck");
What would be a good way to do that?
Sep 18 2016
On Sunday, 18 September 2016 at 08:06:54 UTC, Lutger wrote:I have a tuple of strings generated at compile time, for example: alias names = AliasSeq!("Alice", "Bob"); How is it possible to construct a range of strings from this, in order to use it at runtime with other range algorithms? For example, this chain(names, ["Chuck"])Trychain([names], ["Chuck"])[...]
Sep 18 2016
On Sunday, 18 September 2016 at 08:06:54 UTC, Lutger wrote:
I have a tuple of strings generated at compile time, for
example:
alias names = AliasSeq!("Alice", "Bob");
How is it possible to construct a range of strings from this,
in order to use it at runtime with other range algorithms?
For example, this
chain(names, ["Chuck"])
doesn't work as intended because it expands to
chain("Alice", "Bob", ["Chuck"])
I want some function makeRange that works like this:
assert(chain(makeRange(names), ["Chuck"]).fold!( (x,y) => x ~ "
" ~ y) ==
"Alice Bob Chuck");
What would be a good way to do that?
Use std.range's 'only' function [1], it takes variadic arguments
of the same type and constructs a range consisting of them.
Example:
import std.meta : AliasSeq;
import std.range : only;
import std.algorithm.comparison : equal;
alias names = AliasSeq!("Alice", "Bob");
auto range = only(names, "Chuck");
assert(range.equal(["Alice", "Bob", "Chuck"]));
Sep 18 2016
On Sunday, 18 September 2016 at 09:36:13 UTC, e-y-e wrote:On Sunday, 18 September 2016 at 08:06:54 UTC, Lutger wrote:[1] https://dlang.org/phobos/std_range.html#only[...]Use std.range's 'only' function [1], it takes variadic arguments of the same type and constructs a range consisting of them. Example: import std.meta : AliasSeq; import std.range : only; import std.algorithm.comparison : equal; alias names = AliasSeq!("Alice", "Bob"); auto range = only(names, "Chuck"); assert(range.equal(["Alice", "Bob", "Chuck"]));
Sep 18 2016
On Sunday, September 18, 2016 09:36:13 e-y-e via Digitalmars-d-learn wrote:
Use std.range's 'only' function [1], it takes variadic arguments
of the same type and constructs a range consisting of them.
Example:
import std.meta : AliasSeq;
import std.range : only;
import std.algorithm.comparison : equal;
alias names = AliasSeq!("Alice", "Bob");
auto range = only(names, "Chuck");
assert(range.equal(["Alice", "Bob", "Chuck"]));
You can also just stick them in an array. e.g.
auto namesArr = [names];
But obviously, that allocates memory. So, whether using only or allocating
an array would make more sense depends on what you want to do with the
resulting range.
- Jonathan M Davis
Sep 18 2016
On Sunday, 18 September 2016 at 09:36:13 UTC, e-y-e wrote:On Sunday, 18 September 2016 at 08:06:54 UTC, Lutger wrote:That's *exactly* what I was looking for, thanx![...]Use std.range's 'only' function [1], it takes variadic arguments of the same type and constructs a range consisting of them. Example: import std.meta : AliasSeq; import std.range : only; import std.algorithm.comparison : equal; alias names = AliasSeq!("Alice", "Bob"); auto range = only(names, "Chuck"); assert(range.equal(["Alice", "Bob", "Chuck"]));
Sep 18 2016









Nicholas Wilson <iamthewilsonator hotmail.com> 