code: public static <I, S, A extends MutableDFA<S, I>> A combine(DFA<?, I> dfa1,
                                                                 DFA<?, I> dfa2,
                                                                 Collection<? extends I> inputs,
                                                                 A out,
                                                                 AcceptanceCombiner combiner) {
          DeterministicAcceptorTS<?, I> acc = Acceptors.combine(dfa1, dfa2, combiner);
  
          TSCopy.copy(TSTraversalMethod.DEPTH_FIRST, acc, -1, inputs, out);
          return out;
      }
docs: Most general way of combining two DFAs. The {@link AcceptanceCombiner} specified via the {@code combiner}
  parameter specifies how acceptance values of the DFAs will be combined to an acceptance value in the result DFA.
  
  @param dfa1
  the first DFA
  @param dfa2
  the second DFA
  @param inputs
  the input symbols to consider
  @param out
  the mutable DFA for storing the result
  @param combiner
  combination method for acceptance values
  
  @return {@code out}, for convenience