code: public List<Map<String, String>> pipelinePossibleStates(SetAssignTag action,
                                                              List<Map<String, String>> possibleStateList) {
          if (action == null) {
              throw new NullActionException("Called with a null action, and possibleStateList = "
                      + possibleStateList.toString());
          }
  
          String variable = action.getName();
          String set = action.getSet();
  
          String[] domain;
  
          if (set == null) {
              throw new NullSetException("Called with a null set, action name=" + action.getName()
                      + " and possibleStateList = " + possibleStateList.toString());
          }
  
          if (StringUtils.splitByWholeSeparator(set, action.getSeparator()).length == 0) {
              domain = new String[]{""};
          } else {
              domain = StringUtils.splitByWholeSeparator(set, action.getSeparator());
          }
  
          //take the product
          List<Map<String, String>> productTemp = new LinkedList<>();
          for (Map<String, String> p : possibleStateList) {
              for (String value : domain) {
                  HashMap<String, String> n = new HashMap<>(p);
                  n.put(variable, value);
                  productTemp.add(n);
              }
          }
  
          return productTemp;
      }
docs: Performs variable assignments from a set of values
  
  @param action            a SetAssignTag Action
  @param possibleStateList a current list of possible states produced so far from expanding a model state
  @return the cartesian product of every current possible state and the set of values specified by action