class Comp { static final Comp _singleton = Comp._internal(); int _pc; int _acc; Set _loopTest; int _swapJmp = -1; int _swapNop = -1; factory Comp() { return _singleton; } // singleton's constructor Comp._internal() { reset(); } void reset() { _pc = 0; _acc = 0; _loopTest = {}; } void swapJmp(int index) { _swapJmp = index; _swapNop = -1; } void swapNop(int index) { _swapNop = index; _swapJmp = -1; } int get pc => _pc; int get acc => _acc; bool execute(String command) { var _newPC = _pc; var _newAcc = _acc; // print(command); var parse = command.split(' '); var _val = int.parse(parse[1]); var instruction = parse[0]; if (_swapJmp >= 0 && _swapJmp == _pc) { instruction = 'nop'; } if (_swapNop >= 0 && _swapNop == _pc) { instruction = 'jmp'; } // print('$instruction:$_val pc=$_pc swpJmp=$_swapJmp swpNop=$_swapNop'); switch (instruction) { case 'nop': _newPC++; break; case 'acc': _newAcc += _val; _newPC++; break; case 'jmp': _newPC += _val; break; default: print('********** ERROR **********'); break; } if (_loopTest.contains(_newPC)) { return false; } _pc = _newPC; _acc = _newAcc; _loopTest.add(_pc); return true; } @override String toString() => 'pc:$_pc -- acc:$_acc'; }