These two functions look good, however, I think that when possible, we should prefer internal forks over overloads, eg:
```D
R find(alias pred = "a == b", R, E)(R haystack, E needle)
if (isInputRange!R &&
        is(typeof(binaryFun!pred(haystack.front, needle)) : bool))
{
    static if (isNarrowString!R && isSomeChar!E)
        //encode + find(R, R) here
    else
        //Standard code here
}
```

The fact that we have different implementations is really just an implementation detail, and users should not have to know about it.