Skip to content

Commit

Permalink
Merge pull request #12 from tomasf/frozen
Browse files Browse the repository at this point in the history
Add a working frozen()
  • Loading branch information
tomasf authored Mar 23, 2024
2 parents b4edc06 + 5c3986a commit e141e8b
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 12 deletions.
1 change: 1 addition & 0 deletions Sources/SwiftSCAD/Environment/DefaultEnvironment.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ internal extension Environment {
static var defaultEnvironment: Environment {
Environment()
.withFacets(.defaults)
.addingFreezeContext()
}
}
63 changes: 51 additions & 12 deletions Sources/SwiftSCAD/Operations/Freeze.swift
Original file line number Diff line number Diff line change
@@ -1,33 +1,72 @@
import Foundation

internal extension Environment {
static private var environmentKey: Environment.ValueKey = .init(rawValue: "SwiftSCAD.FreezeContext")

class FreezeContext {
var frozenGeometryOutput: [AnyHashable: Any] = [:]

subscript<T>(_ key: AnyHashable) -> T? {
get { frozenGeometryOutput[key] as? T }
set { frozenGeometryOutput[key] = newValue }
}
}

var freezeContext: FreezeContext? {
self[Self.environmentKey] as? FreezeContext
}

func addingFreezeContext() -> Environment {
setting(key: Self.environmentKey, value: FreezeContext())
}
}

struct FrozenGeometry2D: Geometry2D {
let output: GeometryOutput2D
let body: any Geometry2D
let key: AnyHashable

func output(in environment: Environment) -> Output {
output
if let output = environment.freezeContext?[key] as Output? {
return output
} else {
let output = body.output(in: environment)
environment.freezeContext?[key] = output
return output
}
}
}

struct FrozenGeometry3D: Geometry3D {
let output: GeometryOutput3D
let body: any Geometry3D
let key: AnyHashable

func output(in environment: Environment) -> Output {
output
if let output = environment.freezeContext?[key] as Output? {
return output
} else {
let output = body.output(in: environment)
environment.freezeContext?[key] = output
return output
}
}
}

public extension Geometry2D {
func frozen() -> any Geometry2D {
EnvironmentReader { environment in
FrozenGeometry2D(output: self.output(in: environment))
}
func frozen<K: Hashable>(as key: K) -> any Geometry2D {
FrozenGeometry2D(body: self, key: key)
}

func frozen(_ file: String = #file, _ line: Int = #line) -> any Geometry2D {
FrozenGeometry2D(body: self, key: "\(file):\(line)")
}
}

public extension Geometry3D {
func frozen() -> any Geometry3D {
EnvironmentReader { environment in
FrozenGeometry3D(output: self.output(in: environment))
}
func frozen<K: Hashable>(as key: K) -> any Geometry3D {
FrozenGeometry3D(body: self, key: key)
}

func frozen(_ file: String = #file, _ line: Int = #line) -> any Geometry3D {
FrozenGeometry3D(body: self, key: "\(file):\(line)")
}
}

0 comments on commit e141e8b

Please sign in to comment.