public static ICell <T3> Merge <T, T2, T3>(this ICell <T> cell, ICell <T2> cell2, Func <T, T2, T3> func) { Func <T3> curr = () => func(cell.value, cell2.value); return(new AnonymousCell <T3>((Action <T3> reaction, Priority p) => { var disp = new CellJoinDisposable <T3>(); disp.lastValue = func(cell.value, cell2.value); disp.Add(cell.ListenUpdates(val => { T3 newCurr = curr(); if (!object.Equals(newCurr, disp.lastValue)) { disp.lastValue = newCurr; reaction(newCurr); } }, p)); disp.Add(cell2.ListenUpdates(val => { T3 newCurr = curr(); if (!object.Equals(newCurr, disp.lastValue)) { disp.lastValue = newCurr; reaction(newCurr); } }, p)); return disp; }, curr)); }
public static ICell <IEnumerable <T> > ToCellOfCollection <T>(this IEnumerable <ICell <T> > cells) { Func <IEnumerable <T> > values = () => cells.Select(cell => cell.value); return(new AnonymousCell <IEnumerable <T> >((Action <IEnumerable <T> > reaction, Priority p) => { CellJoinDisposable <T> group = new CellJoinDisposable <T> { }; foreach (var cell in cells) { group.Add(cell.ListenUpdates(_ => reaction(values()), p)); } return group; }, values)); }