public static void Items( ILi <ITodoItem> target, IEl <int> nextId, IMultiOp <string> newItem_, IOp <Empty> deleteCompletedItems_, IMultiOp <string> deleteItem_, ITodoItemFactory factory) { var newItem = newItem_.Read(); Empty tmp; bool deleteCompletedItems = deleteCompletedItems_.TryRead(out tmp); var deleteItem = deleteItem_.Read(); if (newItem.Count <= 0 && !deleteCompletedItems && deleteItem.Count <= 0) { return; } var items = target.AsWrite(); if (newItem.Count > 0) { for (int i = 0, n = newItem.Count; i < n; ++i) { items.Add(factory.Create((nextId.Read() + i).ToString(), newItem[i])); } nextId.Write(nextId.Read() + newItem.Count); } if (deleteCompletedItems) { items.RemoveAll(it => { if (it.IsCompleted.Read()) { factory.Dispose(it); return(true); } return(false); }); } if (deleteItem.Count > 0) { items.RemoveAll(it => { if (deleteItem.Contains(it.Id)) { factory.Dispose(it); return(true); } return(false); }); } }
public State(CompositeDisposable cd, IEngine engine) { NextId = engine.El(1); CreateNewItem = engine.MultiOp <string>(); Items = engine.Li(new List <ITodoItem>()); ToggleItemComplete = engine.MultiOp <string>(); UncompletedCount = engine.El(0); DeleteCompletedItems = engine.Op <Empty>(); DeleteItem = engine.MultiOp <string>(); EditItem = engine.Op <string>(); EditingItemId = engine.El <string>(null); FinishEditItem = engine.Op <string>(); ItemFactory = new TodoItem.Factory(cd, engine, ToggleItemComplete, EditingItemId, FinishEditItem); engine.Computer(cd, new object[] { Items, ToggleItemComplete, }, () => Computers.UncompletedCount( UncompletedCount, Items ) ); engine.Computer(cd, new object[] { CreateNewItem, DeleteCompletedItems, DeleteItem }, () => Computers.Items( Items, NextId, CreateNewItem, DeleteCompletedItems, DeleteItem, ItemFactory ) ); engine.Computer(cd, new object[] { EditItem, FinishEditItem }, () => Computers.EditingItemId( EditingItemId, EditItem, FinishEditItem ) ); }