Add algorithm.iteration.foldl

This commit is contained in:
Eugen Wissner 2019-04-16 07:20:52 +02:00
parent f66935f40d
commit f214f3baa2
8 changed files with 60 additions and 7 deletions

View File

@ -79,7 +79,7 @@
} }
], ],
"dflags": ["-dip1000"], "dflags-dmd": ["-dip1000"],
"libs-windows": ["advapi32"], "libs-windows": ["advapi32"],
"libs-windows-x86_mscoff": ["iphlpapi"], "libs-windows-x86_mscoff": ["iphlpapi"],

View File

@ -13,5 +13,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }

View File

@ -9,5 +9,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }

View File

@ -19,5 +19,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }

View File

@ -13,5 +13,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }

View File

@ -727,3 +727,56 @@ auto singleton(E)(return ref E element)
singleChar.popFront(); singleChar.popFront();
assert(singleChar.empty); assert(singleChar.empty);
} }
/**
* Accumulates all elements of a range using a function.
*
* $(D_PSYMBOL foldl) takes a function, an input range and the initial value.
* The function takes this initial value and the first element of the range (in
* this order), puts them together and returns the result. The return
* type of the function should be the same as the type of the initial value.
* This is than repeated for all the remaining elements of the range, whereby
* the value returned by the passed function is used at the place of the
* initial value.
*
* $(D_PSYMBOL foldl) accumulates from left to right.
*
* Params:
* F = Callable accepting the accumulator and a range element.
*/
template foldl(F...)
if (F.length == 1)
{
/**
* Params:
* R = Input range type.
* T = Type of the accumulated value.
* range = Input range.
* init = Initial value.
*
* Returns: Accumulated value.
*/
T foldl(R, T)(R range, auto ref T init)
if (isInputRange!R && !isInfinite!R)
{
if (range.empty)
{
return init;
}
else
{
auto acc = F[0](init, range.front);
range.popFront;
return foldl(range, acc);
}
}
}
///
@nogc nothrow pure @safe unittest
{
int[3] range = [1, 2, 3];
const actual = foldl!((acc, x) => acc + x)(range[], 0);
assert(actual == 6);
}

View File

@ -9,5 +9,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }

View File

@ -13,5 +13,5 @@
"importPaths": [ "importPaths": [
"." "."
], ],
"dflags": ["-dip1000"] "dflags-dmd": ["-dip1000"]
} }