Reply to Bill,
> Using ~ works, but it's slower than using memmorve (what's in Cashew
> utils).
>
Good point. OTOH if you want to keep the source untouched, you need to allocate
anyway. Thinking of that, a dup is needed to keep things consistent
T[] Remove(T)(T[] arr, int i)
{
return i==arr.length-1 ? arr[0..$-1].dup : arr[0..i] ~ arr[i+1 .. $];
}