You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.5 KiB
76 lines
1.5 KiB
using System.Collections;
|
|
using System.Collections.Immutable;
|
|
using Connected.Interop;
|
|
|
|
namespace Connected.Collections.Iterators;
|
|
|
|
internal class DictionaryIterator : IIterator
|
|
{
|
|
private readonly object _value;
|
|
private IDictionary _result;
|
|
public DictionaryIterator(object value)
|
|
{
|
|
_value = value;
|
|
|
|
if (value is not IDictionary dictionary)
|
|
return;
|
|
|
|
Enumerator = dictionary.GetEnumerator();
|
|
|
|
CreateResult();
|
|
}
|
|
|
|
public static bool CanHandle(object value)
|
|
{
|
|
var arguments = value.GetType().GetGenericArguments();
|
|
var kvp = typeof(KeyValuePair<,>).MakeGenericType(arguments);
|
|
var en = typeof(IEnumerable<>).MakeGenericType(kvp);
|
|
|
|
return value.GetType() == en;
|
|
}
|
|
private void CreateResult()
|
|
{
|
|
if (_value.GetType() == typeof(IImmutableDictionary<,>))
|
|
_result = _value.GetType().MakeGenericType(_value.GetType().GenericTypeArguments).CreateInstance<IDictionary>();
|
|
}
|
|
|
|
private IDictionaryEnumerator? Enumerator { get; }
|
|
public object? Current => Enumerator?.Value;
|
|
|
|
public object? Result
|
|
{
|
|
get
|
|
{
|
|
if (_value is null)
|
|
return null;
|
|
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public bool MoveNext()
|
|
{
|
|
if (Enumerator is null)
|
|
return false;
|
|
|
|
return Enumerator.MoveNext();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
if (Enumerator is null)
|
|
return;
|
|
|
|
Enumerator.Reset();
|
|
}
|
|
|
|
|
|
public void Add(object value)
|
|
{
|
|
if (Current is null || Enumerator is null)
|
|
throw new InvalidOperationException(SR.ErrIteratorCurrentNull);
|
|
|
|
_result.Add(Enumerator.Key, value);
|
|
}
|
|
}
|