{"id":4692,"date":"2021-03-11T19:16:51","date_gmt":"2021-03-11T18:16:51","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4692"},"modified":"2022-07-25T08:31:51","modified_gmt":"2022-07-25T07:31:51","slug":"c-observable","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-observable\/","title":{"rendered":"C# Observable"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public interface ISubscription : IDisposable\n{\n    void Unsubscribe();\n}\n\npublic interface IObservable&lt;T>\n{\n    ISubscription Subscribe(Action&lt;T> action);\n}<\/pre>\n\n\n\n<p><strong>Implementation<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">internal class Subscription : ISubscription\n{\n    private bool disposedValue;\n    private readonly Func&lt;bool> UnsubscribeFn;\n\n    public Subscription(Func&lt;bool> unsubscribe) => UnsubscribeFn = unsubscribe;\n\n    public void Unsubscribe()\n    {\n        UnsubscribeFn();\n    }\n\n    protected virtual void Dispose(bool disposing)\n    {\n        if (disposedValue) return;\n        if (disposing)\n            Unsubscribe();\n        disposedValue = true;\n    }\n\n    public void Dispose()\n    {\n        Dispose(disposing: true);\n        GC.SuppressFinalize(this);\n    }\n}\n\npublic class Observable&lt;T> : IObservable&lt;T>\n{\n    private readonly ICollection&lt;Action&lt;T>> subscriptions = new List&lt;Action&lt;T>>();\n    public ISubscription Subscribe(Action&lt;T> subscription)\n    {\n        subscriptions.Add(subscription);\n        return new Subscription(() => subscriptions.Remove(subscription));\n    }\n\n    public void Next(T value)\n    {\n        foreach (var subscription in subscriptions)\n            subscription(value); \/\/ Not exception safe, possible to wrap in Task.Run()\n    }\n}<\/pre>\n\n\n\n<p><strong>Usage<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Program\n{\n    static void Main(string[] args)\n    {\n        var observable = new Observable&lt;int>();\n\n        using (var a = observable.Subscribe((int state) => Console.WriteLine($\"Observer A received: {state}\")))\n        {\n            using (var b = observable.Subscribe((int state) => Console.WriteLine($\"Observer B received: {state}\")))\n            {\n                observable.Next(10);\n                observable.Next(20);\n            }\n            observable.Next(30);\n        }\n    }\n}    <\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Implementation Usage<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6,4,1],"tags":[],"class_list":["post-4692","post","type-post","status-publish","format-standard","hentry","category-dotnet","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4692"}],"version-history":[{"count":2,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4692\/revisions"}],"predecessor-version":[{"id":4695,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4692\/revisions\/4695"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}