@@ -0,0 +1,147 @@
5+// Created by Ilya on 22/11/2018.
12+ var posts: [Int: Post] = [:]
14+ enum Error: AbortError {
15+ var status: HTTPResponseStatus {return .notFound}
17+ var reason: String {return "User not found."}
19+ var identifier: String {return "userNotFound"}
24+ func getPost(for id: Post.Id, on worker: Worker) -> Future<Post> {
25+ let out = worker.eventLoop.newPromise(Post.self)
28+ if let post = self.posts[id] {
29+ out.succeed(result: post)
31+ out.fail(error: Error.notFound)
35+ return out.futureResult
38+ func deleteRandom(on worker: Worker) -> Future<Post.Id> {
39+ let out = worker.eventLoop.newPromise(Post.Id.self)
41+ if let post = self.posts.randomElement() {
42+ self.queue.sync(flags: .barrier) {
43+ self.posts[post.key] = nil
44+ out.succeed(result: post.key)
47+ out.fail(error: Error.notFound)
50+ return out.futureResult
54+ func insert(post: Post) {
55+ queue.sync(flags: .barrier) {
56+ posts[post.id] = post
60+ private let queue = DispatchQueue(label: "soy.iko.Model")
63+let postModel = Model()
65+enum Event: Encodable {
66+ func encode(to encoder: Encoder) throws {
67+ var container = encoder.container(keyedBy: CodingKeys.self)
69+ case .delete(let id):
70+ try container.encode(id, forKey: .id)
71+ try container.encode("delete", forKey: .type)
73+ try container.encode(id, forKey: .id)
74+ try container.encode("add", forKey: .type)
78+ private enum CodingKeys: String, CodingKey {
87+struct CyclicBuffer<T> {
94+ buffer = Array(repeating: nil, count: size)
97+ mutating func append(element: T?) {
98+ queue.sync(flags: .barrier) {
99+ buffer[index] = element
100+ index = (index+1)%size
104+ func get(last number: Int, loop: Worker) -> Future<ArraySlice<T?>> {
106+ let out = loop.eventLoop.newPromise(ArraySlice<T?>.self)
108+// var out: ArraySlice<T?>!
110+ out.succeed(result: (self.buffer[self.index+1..<self.size] + self.buffer[0...max(number-1, self.index)]))
113+ return out.futureResult
116+ private let queue = DispatchQueue(label: "soy.iko.Buffer")
119+var eventBuffer = CyclicBuffer<Event>(of: 100)
121+struct Events: Encodable {
123+ let events: [Event]?
126+struct Post: Content {
137+ static private var lastID: Int = 0
140+struct User: Content {
144+struct Name: Content {