require "./parser.cr" module Parcom # `Peek` is a `Parser` that runs another `Parser` while # leaving the input stream unmodified. class Peek(T, V) < Parser(T, V) # Accepts the parser to run. def initialize(@p : Parser(T, V)) end # Runs the parser it was initialized with, and returns # that parser's result along with the original input. # # Re-raises a `ParserFail` exception if the other parser fails. def parse(tokens : Tokens(T)) : Result(T, V) result = @p.parse(tokens) Result.new(tokens, result.value) rescue ex : ParserFail raise ParserFail.new("Peek: #{ex.message}") end end end