import std.traits : isSomeFunction;
bool isStronglyPure(F...)()
if (F.length == 1 && isSomeFunction!F)
import std.traits : arity, isFunctionPointer, isDelegate,
isAssociativeArray, isPointer, Parameters;
import std.algorithm : canFind;
static if (!__traits(getFunctionAttributes, F).canFind("pure"))
static foreach (i; 0 .. length) {
if (__traits(getParameterStorageClasses, F, i).canFind("ref", "out"))
if (is(Parameters!F[i] == class)
|| isFunctionPointer!(Parameters!F[i])
|| isDelegate!(Parameters!F[i])
|| isAssociativeArray!(Parameters!F[i])
|| isPointer!(Parameters!F[i]))
static assert(isStronglyPure!f);
static assert(!isStronglyPure!g);
static assert(!isStronglyPure!h);
static assert(!isStronglyPure!(Test.i));