Skip to content

Commit

Permalink
Merge pull request #16 from srea/feature/support-swiftpm
Browse files Browse the repository at this point in the history
Support SwiftPM
  • Loading branch information
srea committed Jul 8, 2020
2 parents d8ceb21 + 1ce147c commit 9d0d0da
Show file tree
Hide file tree
Showing 118 changed files with 2,783 additions and 705 deletions.
File renamed without changes.
File renamed without changes.
File renamed without changes.
49 changes: 49 additions & 0 deletions Example/swiftpm/TicTacToe/Promo/LaunchGameWorkflow.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//
// Copyright (c) 2017. Uber Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import Foundation
import RIBs
import RxSwift

public class LaunchGameWorkflow: Workflow<RootActionableItem> {
public init(url: URL) {
super.init()

let gameId = parseGameId(from: url)

self
.onStep { (rootItem: RootActionableItem) -> Observable<(LoggedInActionableItem, ())> in
rootItem.waitForLogin()
}
.onStep { (loggedInItem: LoggedInActionableItem, _) -> Observable<(LoggedInActionableItem, ())> in
loggedInItem.launchGame(with: gameId)
}
.commit()
}

private func parseGameId(from url: URL) -> String? {
let components = URLComponents(string: url.absoluteString)
let items = components?.queryItems ?? []
for item in items {
if item.name == "gameId" {
return item.value
}
}

return nil
}
}

71 changes: 71 additions & 0 deletions Example/swiftpm/TicTacToe/RandomWin/RandomWinInteractor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// Copyright (c) 2017. Uber Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import Foundation
import RIBs
import RxSwift

public protocol RandomWinRouting: ViewableRouting {
// TODO: Declare methods the interactor can invoke to manage sub-tree via the router.
}

protocol RandomWinPresentable: Presentable {
var listener: RandomWinPresentableListener? { get set }
func announce(winner: PlayerType, withCompletionHandler handler: @escaping () -> ())
}

public protocol RandomWinListener: class {
func didRandomlyWin(with player: PlayerType)
}

final class RandomWinInteractor: PresentableInteractor<RandomWinPresentable>, RandomWinInteractable, RandomWinPresentableListener {

weak var router: RandomWinRouting?

weak var listener: RandomWinListener?

init(presenter: RandomWinPresentable,
mutableScoreStream: MutableScoreStream) {
self.mutableScoreStream = mutableScoreStream
super.init(presenter: presenter)
presenter.listener = self
}

override func didBecomeActive() {
super.didBecomeActive()
// TODO: Implement business logic here.
}

override func willResignActive() {
super.willResignActive()
// TODO: Pause any business logic.
}

// MARK: - RandomWinPresentableListener

func determineWinner() {
let random = arc4random_uniform(100)
let winner = random > 50 ? PlayerType.player1 : PlayerType.player2
presenter.announce(winner: winner) {
self.mutableScoreStream.updateScore(with: winner)
self.listener?.didRandomlyWin(with: winner)
}
}

// MARK: - Private

private let mutableScoreStream: MutableScoreStream
}
87 changes: 87 additions & 0 deletions Example/swiftpm/TicTacToe/Root/RootInteractor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
//
// Copyright (c) 2017. Uber Technologies
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import Foundation
import RIBs
import RxSwift

protocol RootRouting: ViewableRouting {
func routeToLoggedIn(withPlayer1Name player1Name: String, player2Name: String) -> LoggedInActionableItem
}

protocol RootPresentable: Presentable {
var listener: RootPresentableListener? { get set }
// TODO: Declare methods the interactor can invoke the presenter to present data.
}

protocol RootListener: class {
// TODO: Declare methods the interactor can invoke to communicate with other RIBs.
}

final class RootInteractor: PresentableInteractor<RootPresentable>, RootInteractable, RootPresentableListener, RootActionableItem, UrlHandler {

weak var router: RootRouting?

weak var listener: RootListener?

// TODO: Add additional dependencies to constructor. Do not perform any logic
// in constructor.
override init(presenter: RootPresentable) {
super.init(presenter: presenter)
presenter.listener = self
}

override func didBecomeActive() {
super.didBecomeActive()
// TODO: Implement business logic here.
}

override func willResignActive() {
super.willResignActive()
// TODO: Pause any business logic.
}

// MARK: - LoggedOutListener

func didLogin(withPlayer1Name player1Name: String, player2Name: String) {
let loggedInActionableItem = router?.routeToLoggedIn(withPlayer1Name: player1Name, player2Name: player2Name)
if let loggedInActionableItem = loggedInActionableItem {
loggedInActionableItemSubject.onNext(loggedInActionableItem)
}
}

// MARK: - UrlHandler

func handle(_ url: URL) {
let launchGameWorkflow = LaunchGameWorkflow(url: url)
launchGameWorkflow
.subscribe(self)
.disposeOnDeactivate(interactor: self)
}

// MARK: - RootActionableItem

func waitForLogin() -> Observable<(LoggedInActionableItem, ())> {
return loggedInActionableItemSubject
.map { (loggedInItem: LoggedInActionableItem) -> (LoggedInActionableItem, ()) in
(loggedInItem, ())
}
}

// MARK: - Private

private let loggedInActionableItemSubject = ReplaySubject<LoggedInActionableItem>.create(bufferSize: 1)
}
Loading

0 comments on commit 9d0d0da

Please sign in to comment.