                     return row
                 })
                 
+                // finally, check to see if this move resulted in a game end state
                 let completed = findWinner(board: updatedPositions).type != PlayerType.none // || checkTiedBoard(board: updatedPositions)
                 return GameState(activePlayer: nextPlayer, board: updatedPositions, complete: completed)
             })

        
        // MARK: Cell clickstreams
        let clicks$: Array<Observable<(uiElement: UIButton, position: Position)>> = cells.reduce([], { result, cell in
            return result +
                [cell.uiElement.rx.tap
                    .map {

        })
        
        // MARK: Game State
        // game state - this is the state for each single game
        let gameState$ = Observable.merge(clicks$)
            .scan(defaultGameState, accumulator: { (prevState: GameState, move: (uiElement: UIButton, position: Position)) -> GameState in
                
