Cannot reduce an empty iterable w/o an explicit seed value

Nicholas Wilson iamthewilsonator at hotmail.com
Thu Nov 9 13:24:45 UTC 2017


On Thursday, 9 November 2017 at 12:40:49 UTC, Vino wrote:
> Hi All,
>
>   Request your help, when i execute the below line of code i am 
> getting an error message as "Cannot reduce an empty iterable 
> w/o an explicit seed value" , The below lie of code will 
> iterate several file system and will report the size of the 
> folder (level 1) which is greater than 10GB.
>
>
> Program:
> auto coSizeDirList (string FFs, int SizeDir) {
> 	float subdirTotal;
> 	float subdirTotalGB;
> 	Array!string Result;
> 	auto dFiles = Array!string ((dirEntries(FFs, 
> SpanMode.shallow).filter!(a => a.isDir))[].map!(a => a.name));
> 	foreach (d; parallel(dFiles[], 1)) {
> 	auto SdFiles = Array!float ((dirEntries(join(["\\\\?\\", d]), 
> SpanMode.depth).filter!(a => a.isFile))[].map!(a => 
> to!float(a.size)));
> 	{
> 	subdirTotalGB = ((reduce!((a,b) => a + b)(SdFiles)) / 1024 / 
> 1024 / 1024);
> 				}
>  if (subdirTotalGB > SizeDir) {
> Result.insertBack(d); 
> Result.insertBack(to!string(subdirTotalGB));
> 			}
> 				}
> 			return Result;
> }
>
> From,
> Vino.B

The problem is
subdirTotalGB = ((reduce!((a,b) => a + b)(SdFiles)) / 1024 / 1024 
/ 1024);
with reduce you need to give it a seed (an initial value to start 
with).
See
https://dlang.org/phobos/std_algorithm_iteration.html#.reduce

> int[] arr = [ 1, 2, 3, 4, 5 ];
> // Sum all elements
> auto sum = reduce!((a,b) => a + b)(0, arr);
> writeln(sum); // 15
> 
> // Sum again, using a string predicate with "a" and "b"
> sum = reduce!"a + b"(0, arr);
> writeln(sum); // 15

To your actual use case, you can do:

foreach (d; parallel(dFiles[], 1)) {
float subdirTotalGB = dirEntries(join(["\\\\?\\", d]), 
SpanMode.depth)
     .filter!(a => a.isFile))
     .map!(a => to!float(a.size)))
     .fold!((a, b) => a + b)(0) // Provide an explicit seed.

     if (subdirTotalGB > SizeDir) {
         Result.insertBack(d);
         Result.insertBack(to!string(subdirTotalGB));
     }
}




More information about the Digitalmars-d-learn mailing list