Description
Yesterday i noticed that a Filterable
instance could be useful for ParserT
Let's say you want to sometimes discard a parse based on some condition or predicate. For example, let's say you have a parseCSV :: Parser String (List (List String))
, which parses a CSV input to a list of lines (lines being lists of strings, one string per value between commas or newlines). The first row of the CSV is usually just all the column names, so let's say i want to remove that line using tail :: forall a. List a -> Maybe (List a)
. I could then use filterMap :: forall a b f. Filterable f => (a -> Maybe b) -> f a -> f b
to remove that like this: filterMap tail parseCSV
. The result of this would be a parser that ignores the first line of the CSV, and only gives the rest. It would also fail if the CSV input only has one line. Additionally, a custom error message can be provided like this (i think): filterMap tail parseCSV <?> "CSV does not contain any data, only column names!"
The implementation would be similar to the Filterable
instance for Maybe
and Either
, in the sense that it's only got one item to filter (as opposed to a list).
I could write up a PR for this, just wanted to hear some opinions first.