diff --git a/prototype/Doubt/Cofree.swift b/prototype/Doubt/Cofree.swift index 366eb95b8..bd15292f8 100644 --- a/prototype/Doubt/Cofree.swift +++ b/prototype/Doubt/Cofree.swift @@ -4,18 +4,18 @@ /// /// This type is dual to `Free`. Where `Free` is inhabited by syntax trees where some terms are replaced with `B`s, `Cofree` is inhabited by syntax trees where all terms are annotated with `B`s. In Doubt, this allows us to e.g. annotate terms with source range information, categorization, etc. public enum Cofree { - indirect case Unroll(B, Memo>) + indirect case Unroll(B, Syntax) public var unwrap: Syntax { switch self { case let .Unroll(_, rest): - return rest.value + return rest } } - public init(_ annotation: B, @autoclosure(escaping) _ syntax: () -> Syntax) { - self = .Unroll(annotation, Memo(unevaluated: syntax)) + public init(_ annotation: B, _ syntax: Syntax) { + self = .Unroll(annotation, syntax) } @@ -25,7 +25,7 @@ public enum Cofree { /// /// As this is the dual of `Free.iterate`, it’s unsurprising that we have a similar guarantee: coiteration is linear in the size of the constructed tree. public static func coiterate(annotate: B -> Syntax)(_ seed: B) -> Cofree { - return .Unroll(seed, Memo { annotate(seed).map(coiterate(annotate)) }) + return .Unroll(seed, annotate(seed).map(coiterate(annotate))) } } @@ -43,7 +43,7 @@ extension Cofree: CustomDebugStringConvertible { extension Cofree { public func map(transform: B -> Other) -> Cofree { - return .Unroll(transform(extract), Memo { self.unwrap.map { $0.map(transform) } }) + return .Unroll(transform(extract), unwrap.map { $0.map(transform) }) } } @@ -61,7 +61,7 @@ extension Cofree { /// Returns a new `Cofree` by recursively applying `transform` to each node, producing the annotations for the copy. public func extend(transform: Cofree -> Other) -> Cofree { - return .Unroll(transform(self), Memo { self.unwrap.map { $0.extend(transform) } }) + return .Unroll(transform(self), unwrap.map { $0.extend(transform) }) } /// Returns a new `Cofree` constructed by recursively annotating each subtree with itself. @@ -112,5 +112,4 @@ extension Cofree where B: Categorizable { } -import Memo import Prelude