D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 9591 - std.typetuple.staticApplyMap
Summary: std.typetuple.staticApplyMap
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P2 enhancement
Assignee: No Owner
URL:
Keywords: pull
Depends on:
Blocks:
 
Reported: 2013-02-25 18:14 UTC by bearophile_hugs
Modified: 2020-03-21 03:56 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2013-02-25 18:14:31 UTC
This is an usage example of std.typetuple.staticMap from the online docs:

alias T = staticMap!(Unqual, int, const int, immutable int);
static assert(is(T == TypeTuple!(int, int, int)));

staticMap is similar to map, it maps a given template on a sequence of items. Using Haskell syntax (http://www.haskell.org/haskellwiki/Kind ) it has kind:

staticMap :: (* -> *) -> [*] -> [*]


In some cases it's also useful a related higher order TypeTuple template like this, kind of the opposite of staticMap:

import std.string: leftJustify, center, rightJustify;
alias U = staticApplyMap!(string, leftJustify, center, rightJustify);
static assert(is(U == TypeTuple!(leftJustify!string, center!string, rightJustify!string)));

With kind:

staticApplyMap :: * -> [* -> *] -> [*]

So the first argument of staticApplyMap is seen as an item, and the following ones as templates that accept an argument. It returns a TypeTuple of all the templates applied on the first given item.
Comment 1 basile-z 2017-09-15 03:45:32 UTC
std.typetuple doesn't exist anymore and the idea had never been expressed in a pull request.
Comment 2 Steven Schveighoffer 2017-09-15 12:46:35 UTC
std.typetuple was moved to std.meta, so the request is still valid.

We have ApplyLeft and ApplyRight, which take a template as the first parameter, and combined with staticMap, could work as long as the parameters are reversed (the template comes last). Having something that applies a single parameter (or even multipe ones) to a list of templates would be useful as well, and is difficult to do directly.

However, I don't think we need a specific function, a helper like this would work:

template ApplyWith(Args...)
{
   alias ApplyWith = ApplyLeft!(Args[$-1], Args[0 .. $-1]);
}

alias T = staticMap!(ApplyLeft!(ApplyWith, string), leftJustify, center, rightJustify);

void main()
{
   foreach(f; T)
      writeln(f("hello", 20));
}

It's not perfect. The resulting T isn't a tuple of instantiated templates, it's a tuple of ApplyLeft aliases, awaiting instantiation.

But a helper like the above would be useful. Is there an "Instantiate" template that could be used in place of ApplyLeft inside the ApplyWith template? That might be more proper.
Comment 3 Steven Schveighoffer 2017-09-15 12:51:33 UTC
(In reply to Steven Schveighoffer from comment #2)
> Is there an "Instantiate"
> template that could be used in place of ApplyLeft inside the ApplyWith
> template? That might be more proper.

There is, it's just private: https://github.com/dlang/phobos/blob/master/std/meta.d#L1670
Comment 4 Steven Schveighoffer 2017-09-15 13:46:55 UTC
PR: https://github.com/dlang/phobos/pull/5738
Comment 5 Steven Schveighoffer 2017-09-17 16:35:49 UTC
As David Nadlinger pointed out, this can already be solved with Instantiate and ApplyRight. I added a PR to make Instantiate public, and add the solution to this issue as a documented unit test.

https://github.com/dlang/phobos/pull/5739
Comment 6 github-bugzilla 2017-09-20 09:23:12 UTC
Commits pushed to master at https://github.com/dlang/phobos

https://github.com/dlang/phobos/commit/f3cec8bdd38529848c5c1bed1f5a2a9817e07203
Fix issue 9591 - Allow Instantiate template to be public, give example
of how Instantiate + ApplyRight can be used to solve the problem.

https://github.com/dlang/phobos/commit/efae08503d9a83d6abdf29270e4c363c393e53de
Merge pull request #5739 from schveiguy/fix9591

Fix issue 9591 - Allow Instantiate template to be public
Comment 7 github-bugzilla 2017-10-16 09:58:03 UTC
Commits pushed to stable at https://github.com/dlang/phobos

https://github.com/dlang/phobos/commit/f3cec8bdd38529848c5c1bed1f5a2a9817e07203
Fix issue 9591 - Allow Instantiate template to be public, give example

https://github.com/dlang/phobos/commit/efae08503d9a83d6abdf29270e4c363c393e53de
Merge pull request #5739 from schveiguy/fix9591