10/02

section.visibleItemsInvalidationHandler = { [weak self] (visibleItems, offset, env) in
            
            if let currentIndex = visibleItems.last?.indexPath.row {
                self?.bannerIndex.accept(currentIndex)
            }
guard let self = self else { return }
            let width = self.storeCollectionView.bounds.width
              let scrollOffset = offset.x
              let modulo = scrollOffset.truncatingRemainder(dividingBy: width)
              let tolerance = width / 3
              if modulo < tolerance {
                  self.bannerIndex.accept(Int(scrollOffset/width))
              }
            
            let bannerIndex = Int(max(0, round(offset.x / env.container.contentSize.width)))
                   if env.container.contentSize.height == env.container.contentSize.width {
                       print(bannerIndex)
                   }
            
            if let maxScaleItem = visibleItems.max(by: { $0.transform3D.m11 < $1.transform3D.m11 }) {
               let maxScaleIndex = maxScaleItem.indexPath.row
                self?.bannerIndex.accept(maxScaleIndex)
            }
section.visibleItemsInvalidationHandler = { [weak self] (visibleItems, offset, env) in
            visibleItems.forEach { item in
                let intersectedRect = item.frame.intersection(CGRect(x: offset.x, y: offset.y, width: env.container.contentSize.width, height: item.frame.height))
                let percentVisible = intersectedRect.width / item.frame.width
                
                if percentVisible >= 1.0 {
                    if let currentIndex = visibleItems.last?.indexPath.row {
                        self?.visibleItemsRelay.accept(currentIndex)
                    }
                }
// didScrollStoreCollectionView == visibleItemsRelay
input.didScrollStoreCollectionView
            .distinctUntilChanged()
            .withUnretained(self)
            .bind(onNext: { owner, percentVisible in
                guard let index = percentVisible else { return }
                let store = owner.storeList[index]
                output.setCameraPosition.accept((store.y, store.x))
                output.selectedMarkerIndex.accept(index)
            })
            .disposed(by: disposeBag)
locationView.visibleItemsRelay.asObservable().debounce(.milliseconds(300), scheduler: MainScheduler.asyncInstance)