class ParsingState { final Set<Mite> mites final Set<Mite> active //... ParsingState apply(update) { ParsingState state = copyWith(mites: mites + update) state = state.copyWith(active: state.suggestActive(update)) // try possible alternatives for (mite in update) { if (!(mite in state.active)) { state = state.tryAlternative(mite) } } return state } }