| Thread overview | ||||||||
|---|---|---|---|---|---|---|---|---|
|
September 18, 2016 construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
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?
| ||||
September 18, 2016 Re: construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Lutger | 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"]) > Try > chain([names], ["Chuck"]) > [...] | |||
September 18, 2016 Re: construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Lutger | 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"]));
| |||
September 18, 2016 Re: construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to e-y-e | 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: >> [...] > > 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"])); [1] https://dlang.org/phobos/std_range.html#only | |||
September 18, 2016 Re: construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to e-y-e | 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
| |||
September 18, 2016 Re: construct range from tuple? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to e-y-e | 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:
>> [...]
>
> 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"]));
That's *exactly* what I was looking for, thanx!
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply