public void Unsubscribe <T>(ITinySubscriber <T> subscriber)
        {
            lock (subscribersMap)
            {
                if (!subscribersMap.TryGetValue(typeof(T), out var subscribers))
                {
                    return;
                }

                foreach (var weakReference in subscribers.ToArray())
                {
                    if (weakReference.TryGetTarget(out var tinySubscriber))
                    {
                        if (tinySubscriber.Equals(subscriber))
                        {
                            subscribers.Remove(weakReference);
                            Debug.WriteLine($"remove subscriber type={typeof(T)} total={subscribers.Count}");
                        }
                    }
                }

                if (!subscribers.Any())
                {
                    subscribersMap.Remove(typeof(T));
                    Debug.WriteLine($"remove empty subscribers list type={typeof(T)}");
                }
            }
        }
        public void Subscribe <T>(ITinySubscriber <T> subscriber)
        {
            lock (subscribersMap)
            {
                if (!subscribersMap.TryGetValue(typeof(T), out var subscribers))
                {
                    subscribers = new List <WeakReference <ITinySubscriber> >();
                    subscribersMap.Add(typeof(T), subscribers);
                }

                var weakSubscriber = new WeakReference <ITinySubscriber>(subscriber);
                subscribers.Add(weakSubscriber);
                Debug.WriteLine($"add subscriber type={typeof(T)} total={subscribers.Count}");
            }
        }