std.range.Lockstep/lockstep  - multiple declarations
				Function lockstep
Iterate multiple ranges in lockstep using a foreach loop. In contrast to
   zip it allows reference access to its elements. If only a single
   range is passed in, the Lockstep aliases itself away.  If the
   ranges are of different lengths and s == StoppingPolicy
   stop after the shortest range is empty.  If the ranges are of different
   lengths and s == StoppingPolicy, throw an
   exception.  s may not be StoppingPolicy, and passing this
   will throw an exception.
						
				Lockstep!Ranges lockstep(Ranges...)
				(
				
				  Ranges ranges
				
				)
				
				if (allSatisfy!(isInputRange, Ranges));
				
				
				Lockstep!Ranges lockstep(Ranges...)
				(
				
				  Ranges ranges,
				
				  StoppingPolicy s
				
				)
				
				if (allSatisfy!(isInputRange, Ranges));
						
					
				Iterating over Lockstep in reverse and with an index is only possible
   when s == StoppingPolicy, in order to preserve
   indexes. If an attempt is made at iterating in reverse when s ==
   StoppingPolicy, an exception will be thrown.
   By default StoppingPolicy is set to StoppingPolicy.
Limitations
The pure, @safe, @nogc, or nothrow attributes cannot be
   inferred for lockstep iteration. zip can infer the first two due to
   a different implementation.
See Also
       lockstep is similar to zip, but zip bundles its
       elements and returns a range.
       lockstep also supports reference access.
       Use zip if you want to pass the result to a range function.
Example
auto arr1 = [1,2,3,4,5,100];
auto arr2 = [6,7,8,9,10];
foreach (ref a, b; lockstep(arr1, arr2))
{
    a += b;
}
writeln(arr1); // [7, 9, 11, 13, 15, 100]
/// Lockstep also supports iterating with an index variable:
foreach (index, a, b; lockstep(arr1, arr2))
{
    writeln(arr1[index]); // a
    writeln(arr2[index]); // b
}
Struct Lockstep
Iterate multiple ranges in lockstep using a foreach loop. In contrast to
   zip it allows reference access to its elements. If only a single
   range is passed in, the Lockstep aliases itself away.  If the
   ranges are of different lengths and s == StoppingPolicy
   stop after the shortest range is empty.  If the ranges are of different
   lengths and s == StoppingPolicy, throw an
   exception.  s may not be StoppingPolicy, and passing this
   will throw an exception.
						
				struct Lockstep(Ranges...)
				
				  
				
				if (Ranges
				Iterating over Lockstep in reverse and with an index is only possible
   when s == StoppingPolicy, in order to preserve
   indexes. If an attempt is made at iterating in reverse when s ==
   StoppingPolicy, an exception will be thrown.
   By default StoppingPolicy is set to StoppingPolicy.
Constructors
| Name | Description | 
|---|---|
| this | 
Limitations
The pure, @safe, @nogc, or nothrow attributes cannot be
   inferred for lockstep iteration. zip can infer the first two due to
   a different implementation.
See Also
       lockstep is similar to zip, but zip bundles its
       elements and returns a range.
       lockstep also supports reference access.
       Use zip if you want to pass the result to a range function.
Example
auto arr1 = [1,2,3,4,5,100];
auto arr2 = [6,7,8,9,10];
foreach (ref a, b; lockstep(arr1, arr2))
{
    a += b;
}
writeln(arr1); // [7, 9, 11, 13, 15, 100]
/// Lockstep also supports iterating with an index variable:
foreach (index, a, b; lockstep(arr1, arr2))
{
    writeln(arr1[index]); // a
    writeln(arr2[index]); // b
}
Authors
Andrei Alexandrescu, David Simcha, Jonathan M Davis, and Jack Stouffer. Credit for some of the ideas in building this module goes to Leonardo Maffi.