/** Extensions to std.parallelism.
*/

module nxt.parallelism_ex;

/** See_Also: http://forum.dlang.org/thread/irlkdkrgrnadgsgkvcjt@forum.dlang.org#post-vxbhxqgfhuwytdqkripq:40forum.dlang.org
 */
private auto pmap(alias fun, R)(R range) if(isInputRange!R)
{
    import std.parallelism;
    import core.sync.mutex;

    static __gshared Mutex mutex;
    if (mutex is null) mutex = new Mutex;

    typeof (fun(range.front))[] values;

    foreach (i, value; range.parallel)
    {
        auto newValue = fun(value);
        synchronized (mutex)
        {
            if (values.length < i + 1) values.length = i + 1;
            values[i] = newValue;
        }
    }

    return values;
}