docs: @Override
      public StateObj evaluateRules(final StateObj state) {
          MutableStateObj dataState = States.mutable();
          getRuleSet().stream()
                      //filter rules that apply given the state
                      .filter(i -> i.test(state))
                      //evaluate the applicable rules
                      .map(input -> Optional.ofNullable(input.evaluate(state)))
                      //exclude empty results
                      .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
                      //update the state with each result
                      .forEach(dataState::updateState);
          return dataState;
      }