---
# System prepended metadata

title: Untitled

---

## Draft for Wishlist Sync Manager

```

public final class WishListSyncManager {
    let shared = WishListSyncManager()
    let wishListRepo: WishListrepo
    let localStorage: FileStorage
    var remoteWishList: [RemoteWishListObj] = []()

    func syncWishList() {
        Task(priority: .userInitiated, operation: {
           remoteWishList = remoteWishList()
            let (addItemList, deleteItemList) = await( try? findWishListItemsToAdd(remoteWishList), try? findWishListItemsToDelete(remoteWishList))
            async let addItemsTask = wishListRepo.addItemToWishList(addItemList)
            async let deleteItemsTask = wishListRepo.deleteItemFromWishList(deleteItemList)
            let (addedItems, deleteItems) = await(try? addItemsTask, try? deleteItemsTask) // fire base forget
        })
    }
    
    func remoteWishList() async -> [WishListObj] {
        [WishlistObj, WishlistObj]
    }
    
    /// run on first cold launch of app or when user sign in to app to check if migration needed
    func wishlistMigration() async {
        let remoteWishList = getRemoteWishList()
        let localWishList = localStorage.getWishList()
        if remoteWishList.isEmpty, !localWishList.isEmpty {
            await wishListRepo.addItemToWishList(localWishList)
        }
    }
    
    func findWishListItemsToAdd(remoteWishList: RemoteWishList) async -> [String] {
        ["xxxx"]
    }
    
    func findWishListItemsToDelete(remoteWishList: RemoteWishList) async -> [String] {
        ["xxxx"]
    }
    
    init(wishListRepo: WishListrepo, localStorage: FileStorage) {
        self.wishListRepo = wishListRepo
        self.localStorage = localStorage
    }
}



```


## Below is the refined algorithm 
```
/// Scenario: Local delete 1,2 and added 3, 4
var remoteList = ["1", "2", "7", "8", "9"] // start get remote wish list. class property
let updatedRemoteList = ["1", "2", "8", "10"] // adds 10, this list will get from api while syncing wish list, this is local variable in function
let localList = ["8","9", "3", "4"] // 1, 2 deleted, [8,3,4,10]
let distinctUnique = Array(Set(updatedRemoteList + localList)).sorted()
let itemToAdd = Set(distinctUnique).subtracting(remoteList)
print(itemToAdd)
let remoteAddedItems = Set(updatedRemoteList).subtracting(remoteList)
let finalItemToAdd = itemToAdd.subtracting(remoteAddedItems)
let remoteDeletedItems = Set(remoteList).subtracting(updatedRemoteList)
let itemToDelete = Set(remoteList).subtracting(localList)
// run this in playground. This will give us the list that we want
let finalItemToDelete = itemToDelete.subtracting(remoteDeletedItems)
remoteList = Set(localList + remoteAddedItems).subtracting(remoteDeletedItems).sorted() // assign back this result to class remoteList property



```