Skip to content

Instantly share code, notes, and snippets.

@jasdev
Last active January 26, 2021 01:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jasdev/bdba31cd7f19d02a883c15a1b3bff80e to your computer and use it in GitHub Desktop.
Save jasdev/bdba31cd7f19d02a883c15a1b3bff80e to your computer and use it in GitHub Desktop.
The core bits of the CaptionsGeneration sample project.
// …in ContentView.swift in the linked sample project.
struct State: Equatable {
var transcription = ""
var isFetchingTranscription = false
}
enum Action {
case onAppear
case setTranscriptionString(String)
case transcriptionResult(Result<String, NSError>)
case fetchTranscription
}
let transcriptionReducer = Reducer<State, Action, Void> { state, action, _ in
switch action {
case .onAppear: // (1)
return Effect.fireAndForget {
SFSpeechRecognizer.requestAuthorization { _ in }
}
case .fetchTranscription:
state.transcription.removeAll()
state.isFetchingTranscription = true
// (2)
return transcriptionEffect(Bundle.main.url(forResource: "sample", withExtension: "m4a")!)
.subscribe(on: DispatchQueue.global(qos: .userInitiated))
.catchToEffect() // Converts an Effect<Output, Failure> to an Effect<Result<Output, Failure>, Never>.
// https://github.com/pointfreeco/swift-composable-architecture/blob/11f215c3b6923dfcccec6d1de6a672963a0d3c6e/Sources/ComposableArchitecture/Effect.swift#L319-L336
// This is another form of [materialization](https://jasdev.me/materialization-primer).
.receive(on: DispatchQueue.main)
.map(Action.transcriptionResult) // Packs the result back into an action the reducer can handle.
.eraseToEffect()
case let .setTranscriptionString(transcription):
// …
case let .transcriptionResult(result):
// …
}
}
// …
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment