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
*********/
/****
** Values
****/
/// 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 IValueWatcher 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 IValueWatcher 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 IValueWatcher ForReference(Func getValue)
{
return new ComparableWatcher(getValue, new ObjectReferenceComparer());
}
/// Get a watcher for a net collection.
/// The value type.
/// The net field instance type.
/// The net collection.
public static IValueWatcher ForNetValue(NetFieldBase field) where TSelf : NetFieldBase
{
return new NetValueWatcher(field);
}
/****
** Collections
****/
/// Get a watcher which detects when an object reference in a collection changes.
/// The value type.
/// The observable collection.
public static ICollectionWatcher ForReferenceList(ICollection collection)
{
return new ComparableListWatcher(collection, new ObjectReferenceComparer());
}
/// Get a watcher for an observable collection.
/// The value type.
/// The observable collection.
public static ICollectionWatcher ForObservableCollection(ObservableCollection collection)
{
return new ObservableCollectionWatcher(collection);
}
/// Get a watcher for a collection that never changes.
/// The value type.
public static ICollectionWatcher ForImmutableCollection()
{
return ImmutableCollectionWatcher.Instance;
}
/// Get a watcher for a net collection.
/// The value type.
/// The net collection.
public static ICollectionWatcher ForNetCollection(NetCollection collection)
where T : class, INetObject
{
return new NetCollectionWatcher(collection);
}
/// Get a watcher for a net list.
/// The value type.
/// The net list.
public static ICollectionWatcher ForNetList(NetList> collection)
where T : class, INetObject
{
return new NetListWatcher(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 TKey : notnull
where TField : class, INetObject, new()
where TSerialDict : IDictionary, new()
where TSelf : NetDictionary
{
return new NetDictionaryWatcher(field);
}
}
}