Skip to content

Commit

Permalink
extract render side effect
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelangel-dev committed Oct 5, 2020
1 parent 78ca1c7 commit 921dbe4
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 16 deletions.
30 changes: 19 additions & 11 deletions nef/Controllers/CarbonController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ struct CarbonFileConfig {
let style: CarbonStyle
let progressReport: ProgressReport
let panel: OpenPanel
let render: (String, CarbonStyle) -> EnvIO<ProgressReport, CarbonError, Data>
}

class CarbonFileController: NefController {
Expand All @@ -31,7 +32,7 @@ class CarbonFileController: NefController {
init?(code: String, style: CarbonStyle, progressReport: ProgressReport, panel: OpenPanel) {
guard !code.isEmpty else { return nil }
self.code = code
self.config = .init(style: style, progressReport: progressReport, panel: panel)
self.config = .init(style: style, progressReport: progressReport, panel: panel, render: CarbonController.render)
}

func runAsync(completion: @escaping (Result<Void, Swift.Error>) -> Void) {
Expand All @@ -42,15 +43,15 @@ class CarbonFileController: NefController {

func runIO(code: String) -> EnvIO<CarbonFileConfig, CarbonError, URL> {
let env = EnvIO<CarbonFileConfig, CarbonError, CarbonFileConfig>.var()
let image = EnvIO<CarbonFileConfig, CarbonError, Data>.var()
let data = EnvIO<CarbonFileConfig, CarbonError, Data>.var()
let output = EnvIO<CarbonFileConfig, CarbonError, URL>.var()

return binding(
env <- .ask(),
image <- nef.Carbon.render(code: code, style: env.get.style)
.contramap(\.progressReport).mapError { e in .render(e) },
output <- image.get.persist(command: .exportSnippet(selection: code))
.contramap(\.panel).mapError { _ in .openPanel },
data <- env.get.render(code, env.get.style).contramap(\.progressReport),
output <- data.get.persist(command: .exportSnippet(selection: code))
.contramap(\.panel)
.mapError { _ in .openPanel },
yield: output.get)^
}
}
Expand All @@ -61,6 +62,7 @@ struct CarbonClipboardConfig {
let progressReport: ProgressReport
let pasteboard: Pasteboard
let notifications: Notifications
let render: (String, CarbonStyle) -> EnvIO<ProgressReport, CarbonError, Data>
}

class CarbonClipboardController: NefController {
Expand All @@ -70,7 +72,7 @@ class CarbonClipboardController: NefController {
init?(code: String, style: CarbonStyle, progressReport: ProgressReport, pasteboard: Pasteboard, notifications: Notifications) {
guard !code.isEmpty else { return nil }
self.code = code
self.config = .init(style: style, progressReport: progressReport, pasteboard: pasteboard, notifications: notifications)
self.config = .init(style: style, progressReport: progressReport, pasteboard: pasteboard, notifications: notifications, render: CarbonController.render)
}

func runAsync(completion: @escaping (Result<Void, Swift.Error>) -> Void) {
Expand All @@ -81,14 +83,13 @@ class CarbonClipboardController: NefController {

func runIO(code: String) -> EnvIO<CarbonClipboardConfig, CarbonError, NSImage> {
let env = EnvIO<CarbonClipboardConfig, CarbonError, CarbonClipboardConfig>.var()
let data = EnvIO<CarbonClipboardConfig, CarbonError, Data>.var()
let image = EnvIO<CarbonClipboardConfig, CarbonError, NSImage>.var()
let data = EnvIO<CarbonClipboardConfig, CarbonError, Data>.var()

return binding(
env <- .ask(),
data <- nef.Carbon.render(code: code, style: env.get.style)
.contramap(\.progressReport).mapError { e in .render(e) },
image <- data.get.makeImage().mapError { _ in .invalidData },
data <- env.get.render(code, env.get.style).contramap(\.progressReport),
image <- data.get.makeImage().mapError { _ in .invalidData }^,
|<-env.get.pasteboard.write(image.get).mapError { _ in .writeToClipboard },
|<-env.get.notifications.removeAllDelivered(),
|<-env.get.notifications.show(title: "nef",
Expand All @@ -100,6 +101,13 @@ class CarbonClipboardController: NefController {


// MARK: - Helpers
enum CarbonController {
static func render(code: String, style: CarbonStyle) -> EnvIO<ProgressReport, CarbonError, Data> {
nef.Carbon.render(code: code, style: style)
.mapError { e in .render(e) }^
}
}

fileprivate extension Data {
func makeImage<D>() -> EnvIO<D, CarbonError, NSImage> {
EnvIO.invoke { _ in
Expand Down
15 changes: 11 additions & 4 deletions nef/Controllers/MarkdownPageController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import BowEffects
struct MarkdownPageConfig {
let openPanel: OpenPanel
let progressReport: ProgressReport
let render: (String, URL) -> EnvIO<MarkdownPageConfig, MarkdownPageError, URL>
}

enum MarkdownPageError: Swift.Error {
Expand All @@ -26,7 +27,7 @@ class MarkdownPageController: NefController {
init?(page: String, openPanel: OpenPanel, progressReport: ProgressReport) {
guard !page.isEmpty else { return nil }
self.page = page
self.config = MarkdownPageConfig(openPanel: openPanel, progressReport: progressReport)
self.config = MarkdownPageConfig(openPanel: openPanel, progressReport: progressReport, render: MarkdownPageController.render)
}

func runAsync(completion: @escaping (Result<Void, Swift.Error>) -> Void) {
Expand All @@ -46,14 +47,20 @@ class MarkdownPageController: NefController {
}

private func markdownIO(folder: URL, page: String) -> EnvIO<MarkdownPageConfig, MarkdownPageError, URL> {
let env = EnvIO<MarkdownPageConfig, MarkdownPageError, MarkdownPageConfig>.var()
let file = EnvIO<MarkdownPageConfig, MarkdownPageError, URL>.var()
let output = EnvIO<MarkdownPageConfig, MarkdownPageError, URL>.var()

return binding(
env <- .ask(),
file <- folder.outputURL(command: .markdownPage(page: page)).env(),
output <- nef.Markdown.render(content: page, toFile: file.get)
.contramap(\.progressReport)
.mapError { e in .render(e) },
output <- env.get.render(page, file.get),
yield: output.get)^
}

private static func render(content: String, toFile file: URL) -> EnvIO<MarkdownPageConfig, MarkdownPageError, URL> {
nef.Markdown.render(content: content, toFile: file)
.contramap(\.progressReport)
.mapError { e in .render(e) }
}
}
2 changes: 1 addition & 1 deletion nef/Controllers/PlaygroundBookController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class PlaygroundBookController: NefController {
}
}

private static func render(packageContent: String, name: String, output: URL) -> EnvIO<PlaygroundBookConfig, OpenPanelError, URL> {
private static func render(packageContent: String, name: String, output: URL) -> EnvIO<PlaygroundBookConfig, OpenPanelError, URL> {
nef.SwiftPlayground.render(packageContent: packageContent, name: name, output: output)
.contramap(\.progressReport)
.mapError { _ in OpenPanelError.unknown }
Expand Down

0 comments on commit 921dbe4

Please sign in to comment.