Isn't this whole block of code essentially `canFind!((a, b) => (a.toLower() == b))(needles, hay.toLower)` ?

Or 
```
dchar hLow = td.uni.toLower(hay);
return canFind!((a) => (a.toLower() == hLow))(needles);
```

It would be worth benching, but I think it would be OK for this function to make a single GC allocation, to store needles as an array of lower cases. It seems ridiculous to me to decode and mutate to lower the needles as many times as there are characters in haystack.

I'd recommend Walter's ScopeBuffer, but its not safe, pure or ctfe...