Current section
Files
Jump to
Current section
Files
lib/minipeg/combinators/mapping.ex
defmodule Minipeg.Combinators.Mapping do
@moduledoc false
alias Minipeg.{Failure, Parser, Success, Types}
use Types
import Parser, only: [new: 2, parse: 3]
def map(parser, mapper_fun, name \\ nil) do
name1 = name || parser.name
new(
name1,
fn input, cache, _ ->
case parse(parser, input, cache) do
%Failure{} = f -> f
%Success{ast: ast} = s -> %{s | ast: mapper_fun.(ast)}
end
end
)
end
def map_error(parser, error_fun, name) do
name1 = name || parser.name
new(
name1,
fn input, cache, _ ->
case parse(parser, input, cache) do
%Failure{} = f -> error_fun.(f)
%Success{} = s -> s
end
end
)
end
def mapp(parser, mapper_fun, name) do
name1 = name || parser.name
new(
name1,
fn input, cache, _ ->
case parse(parser, input, cache) do
%Failure{} = f -> f
%Success{ast: ast, parsed_at: position} = s -> %{s | ast: mapper_fun.(ast, position)}
end
end
)
end
def map_to_string(parser, name) do
name1 = name || "map_to_string(#{parser.name})"
parser
|> map(&IO.chardata_to_string/1, name1)
end
def with_pos(parser, name) do
name1 = name || "with_pos(#{parser.name})"
mapp(parser, &{&1, &2}, name1)
end
end
# SPDX-License-Identifier: Apache-2.0