-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
Scenario: Tagging Items
2 caches: SourceCache, SourceCache
When item changes, it needs to go thru the list of tags to determine which one applies to it.
Similarly, when tag changes, retagging needs to occur.
First not so reactive attempt:
var disposable = tagsCache.Connect().Flatten().Subscribe(change =>
{
Tag tag = change.Current;
_itemCache.Edit(u => {
if (change.Reason == ChangeReason.Remove)
{
foreach (Item item in _itemCache.Items.Where(b => b.Tags.Contains(tag)))
{
item.Tags.Remove(tag);
u.AddOrUpdate(item);
}
}
else
{
foreach (Item item in _itemCache.Items)
{
Tag existingTag = item.Tags.FirstOrDefault(t => t.Id == tag.Id);
if (existingTag != null)
{
item.Tags.Remove(existingTag);
u.AddOrUpdate(item);
}
bool applies = tag.Applies(item);
if (applies)
{
item.Tags.Add(tag);
u.AddOrUpdate(item);
}
}
}
});
});
var disposable2 = _itemCache.Connect().WhereReasonsAre(ChangeReason.Add, ChangeReason.Update).Flatten().Subscribe(change =>
{
Item item = change.Current;
instance.Tags.Connect().Flatten().Select(i => i.Current).Subscribe(tag =>
{
if (!item.Tags.Contains(tag) && tag.Applies(item))
{
item.Tags.Add(tag);
}
});
});
Metadata
Metadata
Assignees
Labels
No labels