On Saturday, 3 July 2021 at 00:29:23 UTC, Kevin Bailey wrote:
Unfortunately, ldc2 is saying:

```
split.d(8): Error: template std.algorithm.searching.findSplit cannot deduce function from argument types !()(ByLineImpl!(char, char), string), candidates are:
/usr/lib/ldc/x86_64-linux-gnu/include/d/std/algorithm/searching.d(2882):        
findSplit(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle)
  with pred = "a == b",
       R1 = ByLineImpl!(char, char),
       R2 = string
  must satisfy the following constraint:
       isForwardRange!R1
```

The error message here is actually telling you exactly what the problem is: `findSplit` requires a forward range, but the range returned by `File.byLine` is not a forward range, just an input range.

    import std.range;
pragma(msg, isForwardRange!(typeof(File("somefile").byLine())));
    // prints "false"

The difference between an forward range and an input range is that forward ranges implement `.save`, a method that allows you to save your place in the range and return to it later. The range returned by `File.byLine` doesn't have this method because it's not always possible to save your place in a file (for example, if you're reading from a pipe).

To work around this, you can either (a) read the whole file into memory before using `findSplit` on it, or (b) redesign your algorithm to work in a single pass over the input file.

Reply via email to