package com.ashardalon.pratt.commands.impls; import java.util.function.UnaryOperator; import com.ashardalon.pratt.ParserContext; import com.ashardalon.pratt.commands.AbstractInitialCommand; import com.ashardalon.pratt.commands.CommandResult; import com.ashardalon.pratt.commands.InitialCommand; import com.ashardalon.pratt.commands.CommandResult.Status; import com.ashardalon.pratt.tokens.Token; import bjc.data.Tree; import bjc.utils.parserutils.ParserException; /** * An initial command that transforms the result of another command. * * @author bjculkin * * @param * The key type of the tokens. * * @param * The value type of the tokens. * * @param * The state type of the parser. */ public class TransformingInitialCommand extends AbstractInitialCommand { private final InitialCommand internl; private final UnaryOperator>> transfrm; /** * Create a new transforming initial command. * * @param internal * The initial command to delegate to. * * @param transform * The transform to apply to the returned tree. */ public TransformingInitialCommand(final InitialCommand internal, final UnaryOperator>> transform) { super(); internl = internal; transfrm = transform; } @Override protected CommandResult intNullDenotation(final Token operator, final ParserContext ctx) throws ParserException { CommandResult result = internl.denote(operator, ctx); if (result.status != Status.SUCCESS) return result; return CommandResult.success(transfrm.apply(result.success())); } }