1
1
mirror of https://github.com/github/semantic.git synced 2024-12-28 09:21:35 +03:00
semantic/prototype/doubt-json/main.swift

94 lines
2.0 KiB
Swift
Raw Normal View History

2015-10-08 02:20:40 +03:00
import Doubt
import Cocoa
2015-10-08 02:20:40 +03:00
2015-10-09 17:14:07 +03:00
enum JSONLeaf: Equatable, CustomJSONConvertible, CustomStringConvertible {
2015-10-08 02:21:26 +03:00
case Number(Double)
case Boolean(Bool)
case String(Swift.String)
case Null
2015-10-08 03:08:34 +03:00
2015-10-09 17:14:07 +03:00
// MARK: CustomJSONConvertible
var JSON: Doubt.JSON {
switch self {
case let .Number(n):
return .Number(n)
case let .Boolean(b):
return .Boolean(b)
case let .String(s):
return .String(s)
case .Null:
return .Null
}
}
// MARK: CustomStringConvertible
2015-10-08 03:08:34 +03:00
var description: Swift.String {
switch self {
case let .Number(n):
return Swift.String(n)
case let .Boolean(b):
return Swift.String(b)
case let .String(s):
return Swift.String(reflecting: s)
case .Null:
return "null"
}
}
2015-10-08 02:21:26 +03:00
}
2015-10-08 02:43:00 +03:00
func == (left: JSONLeaf, right: JSONLeaf) -> Bool {
switch (left, right) {
case let (.Number(a), .Number(b)):
return a == b
case let (.Boolean(a), .Boolean(b)):
return a == b
case let (.String(a), .String(b)):
return a == b
case (.Null, .Null):
return true
default:
return false
}
}
2015-10-08 02:36:58 +03:00
extension JSON {
init?(path: Swift.String) {
guard let data = try? NSData(contentsOfFile: path, options: []) else { return nil }
guard let object = try? NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) else { return nil }
self.init(object: object)
}
2015-10-08 02:36:43 +03:00
typealias Term = Fix<JSONLeaf>
typealias Diff = Free<JSONLeaf, Patch<JSONLeaf>>
var term: Term {
switch self {
case let .Array(a):
return .Indexed(a.map { $0.term })
case let .Dictionary(d):
return .Keyed(Swift.Dictionary(elements: d.map { ($0, $1.term) }))
case let .Number(n):
return .Leaf(.Number(n))
case let .Boolean(b):
return .Leaf(.Boolean(b))
case let .String(s):
return .Leaf(.String(s))
case .Null:
return .Leaf(.Null)
}
}
}
let arguments = BoundsCheckedArray(array: Process.arguments)
if let a = arguments[1].flatMap(JSON.init), b = arguments[2].flatMap(JSON.init) {
2015-10-09 17:20:46 +03:00
let diff = Algorithm<JSONLeaf, JSON.Diff>(a.term, b.term).evaluate()
if let JSON = NSString(data: diff.JSON.serialize(), encoding: NSUTF8StringEncoding) {
print(JSON)
}
}