public IObservable <MatchmakingResult> Matchmake() { return(m_HubConnection.InvokeAsync <string>(nameof(ReplicationHub.OnMatchmake)) .ToObservable() .Take(1) .DoOnSubscribe(() => { m_PeerStatus.Value = new PeerStatus() { isConnected = true, isMatchmaking = true, isInGame = false }; }) .SelectMany(gameId => { return games.ToObservable() .Merge(m_Games.ObserveAdd().Select(added => added.Value)) .Where(game => game.gameId == gameId); }) .Do(game => { m_PeerStatus.Value = new PeerStatus() { isConnected = true, isMatchmaking = false, isInGame = true }; }) .Select(game => new MatchmakingResult() { gameContext = game }) .Take(1)); }
/// <summary> /// Iterates through the collection on subscription, and then pumps add and replace events. /// </summary> /// <param name="collection"></param> /// <typeparam name="T"></typeparam> /// <returns></returns> public static IObservable <T> Observe <T>(this IReadOnlyReactiveCollection <T> collection) { return(Observable.Merge( collection.ToObservable(), collection.ObserveAdd().Select(e => e.Value), collection.ObserveReplace().Select(e => e.NewValue))); }
public static IObservable <T> ToObservableAndAdded <T>(this IReadOnlyReactiveCollection <T> collection) { return(collection.ToObservable() .Merge(collection .ObserveAdd() .Select(added => added.Value))); }