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);
}
});
});
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;
});
var disposable2 = _itemCache.Connect().WhereReasonsAre(ChangeReason.Add, ChangeReason.Update).Flatten().Subscribe(change =>
{
Item item = change.Current;
});