public bool CanMergeWith(IVDomNodeProperty property) { var propertyName = propertyInfo.Name; return(property is VDomNodeChildNodeProperty <TParent, TMessage, TValue> p && Equals(propertyInfo, p.propertyInfo)); }
public Func <TParent, ISub <TMessage> > MergeWith(IVDomNodeProperty property) { return(Optional(property) .TryCast <IVDomNodeProperty <TParent, TMessage, IVDomNode <TMessage> > >() .Some(typedProperty => { var mergeNode = Value.MergeWith(Optional(typedProperty.Value)); return new Func <TParent, ISub <TMessage> >(o => { var(p, d) = mergeNode(propertyInfo.GetValue(o)); p .IfSome(v => propertyInfo.SetValue(o, v)); return d; }); }) .None(() => { var mergeNode = Value.MergeWith(None); return new Func <TParent, ISub <TMessage> >(o => { var(p, d) = mergeNode(None); p .IfSome(v => propertyInfo.SetValue(o, v)); return d; }); })); }
public Func <TParent, ISub <TMessage> > MergeWith(IVDomNodeProperty property) { var items = Optional(property) // Use IReadOnlyList<T> instead of IImmutableList<T> because T is covariant for IReadOnlyList .TryCast <IVDomNodeProperty <TParent, TMessage, IReadOnlyList <object> > >() .Some(oldProperty => oldProperty.Value) .None(() => ImmutableList <object> .Empty); var replaceActions = Value .Take(items.Count) .Select((value, i) => { if (items[i] is TValue item && equalityComparer.Equals(value, item)) { return(None); }
public Func <TParent, ISub <TMessage> > MergeWith(IVDomNodeProperty property) { return(Optional(property) .TryCast <IVDomNodeProperty <TParent, TMessage, TValue> >() .Bind(p => equalityComparer.Equals(p.Value, Value) ? Some(Unit.Default) : None ) .Some(_ => new Func <TParent, ISub <TMessage> >(o => Sub.None <TMessage>())) .None(() => new Func <TParent, ISub <TMessage> >(o => { o.SetValue(dependencyProperty, Value); return Sub.None <TMessage>(); }))); }
public Func <TParent, ISub <TMessage> > MergeWith(IVDomNodeProperty property) { var items = Optional(property) // Use IReadOnlyList<T> instead of IImmutableList<T> because T is covariant for IReadOnlyList .TryCast <IVDomNodeProperty <TParent, TMessage, IReadOnlyList <TValue> > >() .Some(oldProperty => oldProperty.Value) .None(() => ImmutableList <TValue> .Empty); if (items.SequenceEqual(Value, equalityComparer)) { return(new Func <TParent, ISub <TMessage> >(_ => Sub.None <TMessage>())); } else { return(new Func <TParent, ISub <TMessage> >(o => { propertyInfo.SetValue(o, Value); return Sub.None <TMessage>(); })); } }
public bool CanMergeWith(IVDomNodeProperty property) { return(property is VDomNodeAttachedProperty <TParent, TMessage, TValue> p && dependencyProperty.GlobalIndex == p.dependencyProperty.GlobalIndex); }
public bool CanMergeWith(IVDomNodeProperty property) { return(property is VDomNodeSimpleProperty <TParent, TMessage, TValue> p && Equals(propertyInfo, p.propertyInfo)); }
public bool CanMergeWith(IVDomNodeProperty property) { return(property is VDomNodeChildNodeCollectionProperty <TParent, TMessage> p && Equals(propertyInfo, p.propertyInfo)); }
public Func <TParent, ISub <TMessage> > MergeWith(IVDomNodeProperty property) { var listProperty = Optional(property) // Use IReadOnlyList<T> instead of IImmutableList<T> because T is covariant for IReadOnlyList .TryCast <IVDomNodeProperty <TParent, TMessage, IReadOnlyList <object> > >(); // can't use IReadOnlyList<IVDomNode<T, TMessage>> because T is not covariant for IVDomNode var items = listProperty .Some(oldProperty => oldProperty.Value) .None(() => ImmutableList <object> .Empty); var replaceActions = Value .Take(items.Count) .Select((value, i) => { var apply = value.MergeWith(Optional(items[i] as IVDomNode <TMessage>)); return(new Func <System.Collections.IList, ISub <TMessage> >(o => { var(p, d) = apply(o[i]); p .IfSome(newItem => { o.RemoveAt(i); o.Insert(i, newItem); }); return d; })); }); var addActions = Value .Skip(items.Count) .Select(value => { var apply = value.MergeWith(None); return(new Func <System.Collections.IList, ISub <TMessage> >(o => { var(p, d) = apply(None); p .IfSome(newItem => o.Add(newItem)); return d; })); }); var removeActions = items .Skip(Value.Count) .Select(_ => { return(new Func <System.Collections.IList, ISub <TMessage> >(o => { o.RemoveAt(o.Count - 1); return Sub.None <TMessage>(); })); }); var actions = replaceActions .Concat(removeActions) .Concat(addActions) .ToList(); var act = new Func <System.Collections.IList, ISub <TMessage> >(o => Sub.Batch(actions.Select(a => a(o)))); return(new Func <TParent, ISub <TMessage> >(o => { return act((System.Collections.IList)propertyInfo.GetValue(o)); })); }
public IVDomNode <T, TMessage> AddProperty(IVDomNodeProperty <T, TMessage> property) { return(new VDomNode <T, TMessage>(factory, properties.Add(property), subscribe)); }