code: public static <T> ObservableList<T> wrapList(com.canoo.platform.remoting.ObservableList<T> dolphinList) {
          Assert.requireNonNull(dolphinList, "dolphinList");
          final ObservableList<T> list = FXCollections.observableArrayList(dolphinList);
  
          list.addListener((ListChangeListener<T>) c -> {
              if (listenToFx) {
                  listenToDolphin = false;
                  while (c.next()) {
                      if (c.wasAdded() || c.wasRemoved() || c.wasReplaced()) {
                          for (T removed : c.getRemoved()) {
                              dolphinList.remove(removed);
                          }
                          for (T added : c.getAddedSubList()) {
                              dolphinList.add(list.indexOf(added), added);
                          }
                      }
                  }
                  listenToDolphin = true;
              }
          });
  
          dolphinList.onChanged(e -> {
              if (listenToDolphin) {
                  listenToFx = false;
                  for (ListChangeEvent.Change<? extends T> c : e.getChanges()) {
                      if (c.isAdded()) {
                          for (int i = c.getFrom(); i < c.getTo(); i++) {
                              list.add(i, dolphinList.get(i));
                          }
                      } else if (c.isRemoved()) {
                          final int index = c.getFrom();
                          list.remove(index, index + c.getRemovedElements().size());
                      }
                  }
                  listenToFx = true;
              }
          });
  
          return list;
      }
docs: Create a JavaFX {@link javafx.collections.ObservableList} wrapper for a dolphin platform list
  
  @param dolphinList the dolphin platform list
  @param <T>         type of the list content
  @return the JavaFX list