public void Dispose()
        {
            foreach (var data in _leftJoiners)
            {
                data.Dispose();
            }
            _rightJoiner?.Dispose();

            _leftJoiners.Clear();

            _rightJoiner = null;
        }
        public void SetRight(int rightSourceIndex)
        {
            HasRight = true;

            _rightJoiner = CreateJoinerData(false);

            _rightJoiner.SourceIndex = rightSourceIndex;

            JoinerAdded?.Invoke(_rightJoiner);

            if (_leftJoiners.Count == 0)
            {
                _rightJoiner.Set(_right);
            }
        }
        private void RemoveLeft(ActiveListJoinerData <TLeft, TRight, TResult, TKey> data)
        {
            try
            {
                data.Clear();
            }
            finally
            {
                JoinerRemoved.Invoke(data);
                data.Dispose();

                if (_leftJoiners.Count == 0)
                {
                    _rightJoiner?.Set(_right);
                }

                if (_leftJoiners.Count == 0 && !HasRight)
                {
                    SetEmptied?.Invoke(this);
                }
            }
        }
        public void ClearRight()
        {
            HasRight = false;

            var data = _rightJoiner;

            _rightJoiner = null;

            try
            {
                data.Clear();
            }
            finally
            {
                JoinerRemoved.Invoke(data);
                data.Dispose();

                if (_leftJoiners.Count == 0 && !HasRight)
                {
                    SetEmptied?.Invoke(this);
                }
            }
        }