Does anyone know a way to write a mapProblems
function for elm/parser that works like mapError
does for Result
? The closest thing I can figure out (see below) seems complicated and probably expensive. My read after doing some digging is that the parser library doesn’t expose all the stuff necessary to write something more concise (it exposes the Parser
type but not as Parser(..)
, and I can’t just copy the whole Parser library into my app and edit it there because it has Kernel
code in it). But maybe I’m wrong? Any ideas?
mapProblem : (problem1 -> problem2) -> problem1 -> Parser context problem1 data -> Parser context problem2 data
mapProblem problemFunc defaultProblem parser =
withOffsetAndSource <|
\( offset, source ) ->
case parseStartingAt offset source parser of
Ok okResult ->
succeed okResult
Err deadEnds ->
deadEnds
|> List.head
|> Maybe.map .problem
|> Maybe.withDefault defaultProblem
|> problemFunc
|> problem
parseStartingAt : Int -> String -> Parser context problem resultType -> Result (List (DeadEnd context problem)) resultType
parseStartingAt offset source parser =
source
|> String.dropLeft offset
|> run parser
withOffsetAndSource : (( Int, String ) -> Parser context problem data) -> Parser context problem data
withOffsetAndSource decoder =
succeed Tuple.pair
|= getOffset
|= getSource
|> andThen decoder