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);
                }
示例#4
0
 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>();
     })));
 }
示例#5
0
        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>();
                }));
            }
        }
示例#6
0
 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));
            }));
        }
示例#10
0
 public IVDomNode <T, TMessage> AddProperty(IVDomNodeProperty <T, TMessage> property)
 {
     return(new VDomNode <T, TMessage>(factory, properties.Add(property), subscribe));
 }