using System.Collections.Generic; namespace Robust.Shared.Serialization.Manager.Result { public sealed class DeserializedCollection : DeserializationResult where TCollection : IReadOnlyCollection { public delegate TCollection Create(List elements); public DeserializedCollection( TCollection value, IEnumerable mappings, Create createDelegate) { Value = value; Mappings = mappings; CreateDelegate = createDelegate; } public override TCollection Value { get; } public IEnumerable Mappings { get; } public override object RawValue => Value; private Create CreateDelegate { get; } public override DeserializationResult PushInheritanceFrom(DeserializationResult source) { var sourceCollection = source.Cast>(); var valueList = new List(); var resList = new List(); foreach (var oldRes in sourceCollection.Mappings) { var newRes = oldRes.Copy().Cast>(); valueList.Add(newRes.Value!); resList.Add(newRes); } foreach (var oldRes in Mappings) { var newRes = oldRes.Copy().Cast>(); valueList.Add(newRes.Value!); resList.Add(newRes); } return new DeserializedCollection(CreateDelegate(valueList), resList, CreateDelegate); } public override DeserializationResult Copy() { var valueList = new List(); var resList = new List(); foreach (var oldRes in Mappings) { var newRes = oldRes.Copy(); valueList.Add((TElement) newRes.RawValue!); resList.Add(newRes); } return new DeserializedCollection(CreateDelegate(valueList), resList, CreateDelegate); } public override void CallAfterDeserializationHook() { foreach (var val in Mappings) { val.CallAfterDeserializationHook(); } } } }