using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Netcode; using StardewModdingAPI.Framework.StateTracking.Comparers; namespace StardewModdingAPI.Framework.StateTracking.FieldWatchers { /// Provides convenience wrappers for creating watchers. internal static class WatcherFactory { /********* ** Public methods *********/ /// Get a watcher which compares values using their method. This method should only be used when won't work, since this doesn't validate whether they're comparable. /// The value type. /// Get the current value. public static ComparableWatcher ForGenericEquality(Func getValue) where T : struct { return new ComparableWatcher(getValue, new GenericEqualsComparer()); } /// Get a watcher for an value. /// The value type. /// Get the current value. public static ComparableWatcher ForEquatable(Func getValue) where T : IEquatable { return new ComparableWatcher(getValue, new EquatableComparer()); } /// Get a watcher which detects when an object reference changes. /// The value type. /// Get the current value. public static ComparableWatcher ForReference(Func getValue) { return new ComparableWatcher(getValue, new ObjectReferenceComparer()); } /// Get a watcher for an observable collection. /// The value type. /// The observable collection. public static ObservableCollectionWatcher ForObservableCollection(ObservableCollection collection) { return new ObservableCollectionWatcher(collection); } /// Get a watcher for a net collection. /// The value type. /// The net field instance type. /// The net collection. public static NetValueWatcher ForNetValue(NetFieldBase field) where TSelf : NetFieldBase { return new NetValueWatcher(field); } /// Get a watcher for a net collection. /// The value type. /// The net collection. public static NetCollectionWatcher ForNetCollection(NetCollection collection) where T : INetObject { return new NetCollectionWatcher(collection); } /// Get a watcher for a net dictionary. /// The dictionary key type. /// The dictionary value type. /// The net type equivalent to . /// The serializable dictionary type that can store the keys and values. /// The net field instance type. /// The net field. public static NetDictionaryWatcher ForNetDictionary(NetDictionary field) where TField : class, INetObject, new() where TSerialDict : IDictionary, new() where TSelf : NetDictionary { return new NetDictionaryWatcher(field); } } }