2015-10-15 17:45:32 +03:00
|
|
|
/// An interpreter of `Algorithm`s.
|
2015-10-15 18:00:27 +03:00
|
|
|
public struct Interpreter<Term: TermType> {
|
2015-10-15 18:01:35 +03:00
|
|
|
public typealias Diff = Free<Term.LeafType, Patch<Term>>
|
|
|
|
|
2015-10-15 18:00:49 +03:00
|
|
|
public let equals: (Term, Term) -> Bool
|
|
|
|
|
2015-10-15 18:04:37 +03:00
|
|
|
public func run(a: Term, _ b: Term) -> Diff {
|
|
|
|
if equals(a, b) { return Diff(b) }
|
2015-10-15 18:07:35 +03:00
|
|
|
let algorithm: Algorithm<Term, Diff>
|
|
|
|
switch (a.unwrap, b.unwrap) {
|
|
|
|
case let (.Keyed(a), .Keyed(b)):
|
|
|
|
algorithm = .Roll(.ByKey(a, b, Syntax.Keyed >>> Diff.Roll >>> Algorithm.Pure))
|
|
|
|
case let (.Indexed(a), .Indexed(b)):
|
|
|
|
algorithm = .Roll(.ByIndex(a, b, Syntax.Indexed >>> Diff.Roll >>> Algorithm.Pure))
|
|
|
|
default:
|
|
|
|
algorithm = .Roll(.Recursive(a, b, Algorithm.Pure))
|
|
|
|
}
|
2015-10-15 18:04:37 +03:00
|
|
|
return Diff.Pure(.Replace(a, b))
|
|
|
|
}
|
2015-10-15 17:58:57 +03:00
|
|
|
}
|
2015-10-15 18:07:35 +03:00
|
|
|
|
|
|
|
|
|
|
|
import Prelude
|