/Source/ReactiveProperty.Portable-NET45+WINRT+WP8/ReactiveCollection.cs

# · C# · 117 lines · 83 code · 16 blank · 18 comment · 0 complexity · 1ecad30f4b6efa6cac5d42abb4b4e4ad MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using System.Collections.ObjectModel;
  4. using System.Collections.Specialized;
  5. using System.Collections.Generic;
  6. using System.Diagnostics.Contracts;
  7. using System.Reactive;
  8. using System.Reactive.Linq;
  9. using System.Reactive.Concurrency;
  10. using System.Reactive.Disposables;
  11. namespace Codeplex.Reactive
  12. {
  13. /// <summary>
  14. /// ObservableCollection that operate on scheduler use by ***OnScheduler methods.
  15. /// </summary>
  16. public class ReactiveCollection<T> : ObservableCollection<T>, IDisposable
  17. {
  18. readonly IDisposable subscription;
  19. readonly IScheduler scheduler;
  20. /// <summary>Operate scheduler is UIDispatcherScheduler.</summary>
  21. public ReactiveCollection()
  22. : this(UIDispatcherScheduler.Default)
  23. { }
  24. /// <summary>Operate scheduler is argument's scheduler.</summary>
  25. public ReactiveCollection(IScheduler scheduler)
  26. {
  27. this.scheduler = scheduler;
  28. this.subscription = Disposable.Empty;
  29. }
  30. /// <summary>Source sequence as ObservableCollection. Operate scheduler is UIDispatcherScheduler.</summary>
  31. public ReactiveCollection(IObservable<T> source)
  32. : this(source, UIDispatcherScheduler.Default)
  33. {
  34. }
  35. /// <summary>Source sequence as ObservableCollection. Operate scheduler is argument's scheduler.</summary>
  36. public ReactiveCollection(IObservable<T> source, IScheduler scheduler)
  37. {
  38. this.scheduler = scheduler;
  39. this.subscription = source.ObserveOn(scheduler).Subscribe(this.Add);
  40. }
  41. /// <summary>Add called on scheduler</summary>
  42. public void AddOnScheduler(T item)
  43. {
  44. scheduler.Schedule(() => Add(item));
  45. }
  46. /// <summary>Clear called on scheduler</summary>
  47. public void ClearOnScheduler()
  48. {
  49. scheduler.Schedule(() => Clear());
  50. }
  51. /// <summary>Get(indexer get) called on scheduler, IObservable length is one.</summary>
  52. public IObservable<T> GetOnScheduler(int index)
  53. {
  54. var result = Observable.Start(() => this[index], scheduler);
  55. return result;
  56. }
  57. /// <summary>Insert called on scheduler</summary>
  58. public void InsertOnScheduler(int index, T item)
  59. {
  60. scheduler.Schedule(() => Insert(index, item));
  61. }
  62. /// <summary>Move called on scheduler</summary>
  63. public void MoveOnScheduler(int oldIndex, int newIndex)
  64. {
  65. scheduler.Schedule(() => Move(oldIndex, newIndex));
  66. }
  67. /// <summary>Remove called on scheduler</summary>
  68. public void RemoveOnScheduler(T item)
  69. {
  70. scheduler.Schedule(() => Remove(item));
  71. }
  72. /// <summary>RemoveAt called on scheduler</summary>
  73. public void RemoveAtOnScheduler(int index)
  74. {
  75. scheduler.Schedule(() => RemoveAt(index));
  76. }
  77. /// <summary>Set(indexer set) called on scheduler</summary>
  78. public void SetOnScheduler(int index, T value)
  79. {
  80. scheduler.Schedule(() => this[index] = value);
  81. }
  82. /// <summary>Unsubcribe source sequence.</summary>
  83. public void Dispose()
  84. {
  85. subscription.Dispose();
  86. }
  87. }
  88. public static class ReactiveCollectionObservableExtensions
  89. {
  90. /// <summary>Source sequence as ObservableCollection. Operate scheduler is UIDispatcherScheduler.</summary>
  91. public static ReactiveCollection<T> ToReactiveCollection<T>(this IObservable<T> source)
  92. {
  93. return new ReactiveCollection<T>(source);
  94. }
  95. /// <summary>Source sequence as ObservableCollection. Operate scheduler is argument's scheduler.</summary>
  96. public static ReactiveCollection<T> ToReactiveCollection<T>(this IObservable<T> source, IScheduler scheduler)
  97. {
  98. return new ReactiveCollection<T>(source, scheduler);
  99. }
  100. }
  101. }