private IMapWillChange <I, INode> WillChange(IMapWillChange <I, INode> change) { var node = change.Object.GetStateTreeNode() as ObjectNode; node.AssertWritable(); var map = change.Object as IObservableMap <I, INode, T>; switch (change.Type) { case ChangeType.UPDATE: { var oldValue = map.GetValue(change.Name); if (change.NewValue == oldValue) { return(null); } StateTreeUtils.Typecheck(SubType, change.NewValue.StoredValue); change.NewValue = SubType.Reconcile(node.GetChildNode(change.Name.ToString()), change.NewValue.StoredValue); ProcessIdentifier(change.Name.ToString(), change.NewValue); } break; case ChangeType.ADD: { StateTreeUtils.Typecheck(SubType, change.NewValue.StoredValue); change.NewValue = SubType.Instantiate(node, change.Name.ToString(), node.Environment, change.NewValue.StoredValue); ProcessIdentifier(change.Name.ToString(), change.NewValue); } break; } return(change); }