test_class.file: api/src/test/java/edu/wpi/first/shuffleboard/api/util/PropertyUtilsTest.java
test_class.identifier: PropertyUtilsTest
test_class.superclass: extends UtilityClassTest<PropertyUtils>
test_case.body: @Test
    public void testBindBidirectionalWithConverterNullSecondInitialValue() {
      // given
      Property<String> str = new SimpleStringProperty("41");
      Property<Number> num = new SimpleObjectProperty<>(null);
  
      // when
      PropertyUtils.bindBidirectionalWithConverter(str, num, Double::parseDouble, Object::toString);
  
      // then
      assertAll(
          () -> assertEquals(null, str.getValue(), "String should not have changed"),
          () -> assertEquals(null, num.getValue(), "Binding target should not have changed")
      );
    }
test_case.class_method_signature: PropertyUtilsTest.testBindBidirectionalWithConverterNullSecondInitialValue()
test_case.full_signature: @Test public void testBindBidirectionalWithConverterNullSecondInitialValue()
test_case.identifier: testBindBidirectionalWithConverterNullSecondInitialValue
test_case.invocations: bindBidirectionalWithConverter assertAll assertEquals getValue assertEquals getValue
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testBindBidirectionalWithConverterNullSecondInitialValue()
focal_class.declarator: bindings = new WeakHashMap<>()
focal_class.modifier: private static final
focal_class.original_string: private static final Map<Property, Binding> bindings = new WeakHashMap<>();
focal_class.type: Map<Property, Binding>
focal_class.var_name: bindings
focal_class.file: api/src/main/java/edu/wpi/first/shuffleboard/api/util/PropertyUtils.java
focal_class.identifier: PropertyUtils
focal_class.class_method_signature: PropertyUtils.PropertyUtils()
focal_class.full_signature: private  PropertyUtils()
focal_class.identifier: PropertyUtils
focal_class.modifiers: private
focal_class.parameters: ()
focal_class.signature:  PropertyUtils()
focal_class.class_method_signature: PropertyUtils.bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_class.full_signature: public static void bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_class.identifier: bindBidirectionalWithConverter
focal_class.modifiers: public static
focal_class.parameters: (
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_class.return: void
focal_class.signature: void bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_class.class_method_signature: PropertyUtils.bindWithConverter(
        Property<T> firstProperty,
        Property<U> secondProperty,
        Function<U, T> u2tConverter)
focal_class.full_signature: public static void bindWithConverter(
        Property<T> firstProperty,
        Property<U> secondProperty,
        Function<U, T> u2tConverter)
focal_class.identifier: bindWithConverter
focal_class.modifiers: public static
focal_class.parameters: (
        Property<T> firstProperty,
        Property<U> secondProperty,
        Function<U, T> u2tConverter)
focal_class.return: void
focal_class.signature: void bindWithConverter(
        Property<T> firstProperty,
        Property<U> secondProperty,
        Function<U, T> u2tConverter)
focal_class.class_method_signature: PropertyUtils.bindToMapBidirectionally(Property<T> property,
                                                                    ObservableMap<K, V> map,
                                                                    K key,
                                                                    Function<V, T> v2t)
focal_class.full_signature: public static void bindToMapBidirectionally(Property<T> property,
                                                                    ObservableMap<K, V> map,
                                                                    K key,
                                                                    Function<V, T> v2t)
focal_class.identifier: bindToMapBidirectionally
focal_class.modifiers: public static
focal_class.parameters: (Property<T> property,
                                                                    ObservableMap<K, V> map,
                                                                    K key,
                                                                    Function<V, T> v2t)
focal_class.return: void
focal_class.signature: void bindToMapBidirectionally(Property<T> property,
                                                                    ObservableMap<K, V> map,
                                                                    K key,
                                                                    Function<V, T> v2t)
focal_class.class_method_signature: PropertyUtils.combineLists(ObservableList<T> first, ObservableList<T> second)
focal_class.full_signature: public static ObservableList<T> combineLists(ObservableList<T> first, ObservableList<T> second)
focal_class.identifier: combineLists
focal_class.modifiers: public static
focal_class.parameters: (ObservableList<T> first, ObservableList<T> second)
focal_class.return: ObservableList<T>
focal_class.signature: ObservableList<T> combineLists(ObservableList<T> first, ObservableList<T> second)
focal_method.body: public static <T, U> void bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter) {
      U targetValue = bindingTarget.getValue();
      sourceProperty.setValue(targetValue == null ? null : u2tConverter.apply(targetValue));
      sourceProperty.addListener((__, old, newValue) -> {
        U newMappedValue = newValue == null ? null : t2uConverter.apply(newValue);
        if (EqualityUtils.isDifferent(bindingTarget.getValue(), newMappedValue)) {
          bindingTarget.setValue(newMappedValue);
        }
      });
      bindingTarget.addListener((__, old, newValue) -> {
        T newMappedValue = newValue == null ? null : u2tConverter.apply(newValue);
        if (EqualityUtils.isDifferent(sourceProperty.getValue(), newMappedValue)) {
          sourceProperty.setValue(newMappedValue);
        }
      });
    }
focal_method.class_method_signature: PropertyUtils.bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_method.full_signature: public static void bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_method.identifier: bindBidirectionalWithConverter
focal_method.invocations: getValue setValue apply addListener apply isDifferent getValue setValue addListener apply isDifferent getValue setValue
focal_method.modifiers: public static
focal_method.parameters: (
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)
focal_method.return: void
focal_method.signature: void bindBidirectionalWithConverter(
        Property<T> sourceProperty,
        Property<U> bindingTarget,
        Function<? super T, ? extends U> t2uConverter,
        Function<? super U, ? extends T> u2tConverter)