package com.yoursway.commons.dependencies; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import com.yoursway.commons.dependencies.internal.AutoCollection; import com.yoursway.commons.dependencies.internal.DependencyCollector; import com.yoursway.commons.dependencies.internal.NullableObservableValue; import com.yoursway.commons.dependencies.internal.ObservableList; import com.yoursway.commons.dependencies.internal.ObservableMap; import com.yoursway.commons.dependencies.internal.ObservableValue; import com.yoursway.utils.AutoThreadLocal; import com.yoursway.utils.disposable.Disposer; public class Dependencies { private static AutoThreadLocal<DependencyCollector> currentChangeListener = AutoThreadLocal .create(); static void run(Runnable runnable, DependencyCollector collector) { currentChangeListener.runWith(runnable, collector); } static void reading(Mutable observable) { DependencyCollector collector = currentChangeListener.get(); if (collector != null) collector.dependency(observable); } public static <K, V> Map<K, V> automap(IdentityObject owner, Collection<K> keys, Mapping<K, V> mapping) { return new AutoMapper<K, V>(owner, keys, mapping).map(); } public static <T extends Disposer> Collection<T> compositionCollection( IdentityObject owner, Collection<T> storage) { return new AutoCollection<T>(owner, storage); } public static <T extends Disposer> Collection<T> compositionCollection( IdentityObject owner) { return compositionCollection(owner, new ArrayList<T>()); } public static <T> List<T> observableList(IdentityObject owner) { return observableList(owner, new ArrayList<T>()); } public static <T> List<T> observableList(IdentityObject owner, List<T> list) { return new ObservableList<T>(owner, list); } public static <K, V> Map<K, V> observable(IdentityObject owner, Map<K, V> map) { return new ObservableMap<K, V>(owner, map); } public static <T> Value<T> observableValue(IdentityObject owner, T initial) { return new ObservableValue<T>(owner, initial); } public static <T> NullableValue<T> observableNullableValue( IdentityObject owner) { return observableNullableValue(owner, null); } public static <T> NullableValue<T> observableNullableValue( IdentityObject owner, T initial) { return new NullableObservableValue<T>(owner, initial); } }