public ObservableRadioGroup(IEnumerable <Observable <T, bool> > tabs = null, int defaultIndex = 0, Action <UnityAction> onTryChange = null)
        {
            _defaultIndex = defaultIndex;
            _onTryChange  = onTryChange;
            _tabs         = tabs?.ToList() ?? new List <Observable <T, bool> >();
            _currentIndex = defaultIndex;

            if (!_tabs.Any())
            {
                return;
            }

            // set current tab on
            Observable <T, bool> current = _tabs[defaultIndex];

            current.Value = true;

            for (var i = 0; i < _tabs.Count; i++)
            {
                var index = i; // store in local variable to access in closure
                Observable <T, bool>            tab      = _tabs[i];
                ObservableValueChange <T, bool> listener = (sender, value) => TabValueChanged(index, value);
                _listeners.Add(listener);
                tab.Changed += listener;
            }
        }
 public void Dispose()
 {
     for (var index = 0; index < _tabs.Count; index++)
     {
         Observable <T, bool>            tab      = _tabs[index];
         ObservableValueChange <T, bool> listener = _listeners[index];
         tab.Changed -= listener;
     }
 }
        public void Add(Observable <T, bool> tab)
        {
            if (_tabs.Count == _defaultIndex)
            {
                tab.Value = true;
            }

            var index = _tabs.Count;

            _tabs.Add(tab);
            ObservableValueChange <T, bool> listener = (sender, value) => TabValueChanged(index, value);

            _listeners.Add(listener);
            tab.Changed += listener;
        }