build method

({State initialState, Transitions transitions}) build()

Implementation

({State initialState, Transitions transitions}) build() {
  final usedEvents = <String>{};
  final usedStates = <String>{};
  final fromState = <State, Set<Event>>{};
  final toState = <State, Set<Event>>{};
  final initialState = _states[this.initialState];
  if (initialState == null) {
    throw StateError('Initial state not defined: ${this.initialState}');
  }

  usedStates.add(initialState.name);
  for (final entry in _transitions.entries) {
    final transition = entry.value;
    final event = transition.event;
    final source = transition.source;
    final target = transition.target;
    usedEvents.add(event.name);
    usedStates.add(source.name);
    usedStates.add(target.name);
    (fromState[source] ??= {}).add(event);
    (toState[target] ??= {}).add(event);
  }

  final unusedEvents = {..._events.keys}.difference(usedEvents);
  if (unusedEvents.isNotEmpty) {
    throw StateError('Found unreferenced events: ${unusedEvents.join(', ')}');
  }

  final unusedStates = {..._states.keys}.difference(usedStates);
  if (unusedStates.isNotEmpty) {
    throw StateError('Found unreferenced states: ${unusedStates.join(', ')}');
  }

  return (initialState: initialState, transitions: _transitions);
}