11 releases (7 breaking)

0.8.0 May 11, 2024
0.7.0 Mar 16, 2024
0.6.0 Mar 16, 2024
0.5.0 Mar 16, 2024
0.1.3 May 25, 2022

#573 in Development tools

Download history 4017/week @ 2024-03-13 2858/week @ 2024-03-20 605/week @ 2024-03-27 768/week @ 2024-04-03 551/week @ 2024-04-10 409/week @ 2024-04-17 647/week @ 2024-04-24 851/week @ 2024-05-01 1626/week @ 2024-05-08 936/week @ 2024-05-15 564/week @ 2024-05-22 1383/week @ 2024-05-29 654/week @ 2024-06-05 426/week @ 2024-06-12 287/week @ 2024-06-19 362/week @ 2024-06-26

1,854 downloads per month
Used in 90 crates (2 directly)

MIT license

17KB
410 lines

Module :: for_each

experimental rust-status docs.rs Open in Gitpod discord

Apply a macro for each element of a list.

Macros $Callback is called for each element of the passed list, optionally passing prefix $Prefix as the first argument(s) and postfix $Postfix as the last argument(s). Macros could be invoked in either function call style or map call style. Prefix and postfix could be passed only in map call style. In map call style after passing path to macro pass keyword where and options in format : @KEY Value.

In some cases, the same code may be generated without callback macro, just using prefix and postfix. That's why $Callback is also optional. To invoke for_each without callback use map call style omitting path to callback and keyword where.

Basic Use Case :: function-style call

Apply a macro for each element of a list.

Macro for_each may be called either in function-style way or in map-style way. Pass name of macro to apply to elements as the first arguments and elements after the macro name. Use comma as delimiter.

use for_each::for_each;
for_each!( dbg, "a", "b", "c" );

// generates
dbg!( "a" );
dbg!( "b" );
dbg!( "c" );

Basic Use Case :: map-style call

Macro for_each may be called either in function-style way or in map-style way. Use keys @Prefix @Postfix @Each to pass options as entries of a map. Options @Prefix and @Postfix are optional and their entries could be omitted, but entry @Each is mandatory. Order of options should always be @Prefix, @Postfix, @Each.

use for_each::for_each;

for_each!
{
  dbg where
  @Prefix { "prefix".to_string() + }
  @Postfix { + "postfix" }
  @Each "a" "b" "c"
};

It generates:

// generated
dbg!( "prefix".to_string() + "a" + "postfix" );
dbg!( "prefix".to_string() + "b" + "postfix" );
dbg!( "prefix".to_string() + "c" + "postfix" );

Basic Use Case :: more than single token

Both prefix and postfix have to be token tree ( tt ). But if you need something more complex put it into braces { ... }. Macros for_each will remove outermost braces. Braces are optional in case of prefix/postfix is a single token.

use for_each::for_each;

for_each!
{
  dbg where
  @Prefix { "prefix".to_string() + }
  @Postfix { + "postfix" }
  @Each { "a" + "1" } { "b" + "2" } { "c" + "3" }
};

// generates
dbg!( "prefix".to_string() + "a" + "1" + "postfix" );
dbg!( "prefix".to_string() + "b" + "2" + "postfix" );
dbg!( "prefix".to_string() + "c" + "3" + "postfix" );

Basic Use Case :: callbackless

Callback macro is optional. Use map call style and omit path to callback macro with keyword where to invoke for_each without a callback.

use for_each::for_each;
for_each!
{
  @Prefix { dbg! }
  @Each ( "a" ) ( "b" ) ( "c" )
};
// generates
dbg!( "a" );
dbg!( "b" );
dbg!( "c" );

To add to your project

cargo add for_each

Try out from the repository

git clone https://github.com/Wandalen/wTools
cd wTools
cd examples/for_each_trivial
cargo run
>

No runtime deps