package rabbitescape.engine.solution;
import java.util.ArrayList;
import java.util.List;
public class SolutionRecorder implements SolutionRecorderTemplate
{
private List<CommandAction> commandInProgress;
private final List<SolutionCommand> solutionInProgress;
public SolutionRecorder()
{
commandInProgress = new ArrayList<CommandAction>();
solutionInProgress = new ArrayList<SolutionCommand>();
}
@Override
public void append( CommandAction a )
{
commandInProgress.add( a );
}
@Override
public void append( SolutionCommand newCmd )
{
int prevCmdIndex = solutionInProgress.size() - 1;
SolutionCommand prevCmd = prevCmdIndex >= 0
? solutionInProgress.get( prevCmdIndex )
: null ;
SolutionCommand combCmd = SolutionCommand.tryToSimplify( prevCmd, newCmd );
if( null == combCmd)
{
solutionInProgress.add( newCmd );
}
else
{ // Replace previous with combined
solutionInProgress.set( prevCmdIndex, combCmd );
}
}
@Override
public void append( Solution solution )
{
for ( SolutionCommand command : solution.commands )
{
append( command );
}
}
@Override
public void appendStepEnd()
{
CommandAction[] aA = new CommandAction[commandInProgress.size()];
aA = commandInProgress.toArray( aA );
append( new SolutionCommand( aA ) );
// Prepare to collect actions in the next step.
commandInProgress = new ArrayList<CommandAction>();
}
@Override
public String getRecord()
{
SolutionCommand[] cA = new SolutionCommand[solutionInProgress.size()];
Solution s = new Solution( solutionInProgress.toArray( cA ) );
return SolutionParser.serialise( s );
}
}