using System.Collections.Generic; using System.Linq; using Unity.UIWidgets.animation; namespace UIWidgets.Tests.demo_charts { public interface MergeTweenable { T empty { get; } Tween tweenTo(T other); bool less(T other); } public class MergeTween : Tween> where T : MergeTweenable { public MergeTween(List begin, List end) : base(begin: begin, end: end) { int bMax = begin.Count; int eMax = end.Count; var b = 0; var e = 0; while (b + e < bMax + eMax) { if (b < bMax && (e == eMax || begin[b].less(end[e]))) { this._tweens.Add(begin[b].tweenTo(begin[b].empty)); b++; } else if (e < eMax && (b == bMax || end[e].less(begin[b]))) { this._tweens.Add(end[e].empty.tweenTo(end[e])); e++; } else { this._tweens.Add(begin[b].tweenTo(end[e])); b++; e++; } } } readonly List> _tweens = new List>(); public override List lerp(float t) { return Enumerable.Range(0, this._tweens.Count).Select(i => this._tweens[i].lerp(t)).ToList(); } } }