public LiveLoadOrderProvider(
     IPluginLiveLoadOrderProvider pluginLive,
     ICreationClubLiveLoadOrderProvider cccLive,
     ILoadOrderListingsProvider loadListingsProvider,
     ILiveLoadOrderTimings timings)
 {
     PluginLive       = pluginLive;
     CccLive          = cccLive;
     ListingsProvider = loadListingsProvider;
     Timings          = timings;
 }
        public FileSyncedLoadOrderVM(
            IPluginLiveLoadOrderProvider liveLoadOrderProvider,
            ILoadOrderWriter writer,
            IPluginListingsPathProvider pluginPathContext,
            IDataDirectoryProvider dataDirectoryContext)
        {
            var loadOrder = liveLoadOrderProvider.Get(out var state)
                            .Transform(x => new FileSyncedLoadOrderListingVM(dataDirectoryContext, x))
                            .RefCount();

            _State = state
                     .ToGuiProperty(this, nameof(State), ErrorResponse.Fail("Uninitialized"));

            LoadOrder = loadOrder
                        .ToObservableCollection(this);

            // When listings change, resave to file
            Observable.Merge(
                loadOrder
                .AutoRefresh(x => x.Enabled)
                .Transform(x => x.Enabled, transformOnRefresh: true)
                .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler)
                .QueryWhenChanged(x => x)
                .Unit(),
                loadOrder
                .AutoRefresh(x => x.GhostSuffix)
                .Transform(x => x.GhostSuffix ?? string.Empty, transformOnRefresh: true)
                .BufferInitial(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler)
                .QueryWhenChanged(x => x)
                .Unit())
            .Throttle(TimeSpan.FromMilliseconds(500), RxApp.MainThreadScheduler)
            .Select(x => LoadOrder.Select(x => new ModListing(x.ModKey, x.Enabled, x.GhostSuffix)).ToArray())
            .DistinctUntilChanged(new SequenceEqualityComparer())
            .Subscribe(x =>
            {
                writer.Write(
                    pluginPathContext.Path,
                    LoadOrder);
            });
        }