// // FolderContentMonitor.swift // I2PLauncher // // Created by Mikal Villa on 28/09/2018. // Copyright © 2018 The I2P Project. All rights reserved. // import Foundation /* infix operator ~> private let queue = DispatchQueue(label: "background") func ~> ( backgroundClosure: @escaping () -> R, mainClosure: @escaping (_ result: R) -> ()) { queue.async { let result = backgroundClosure() DispatchQueue.main.async(execute: { mainClosure(result) }) } } */ public struct Event: CustomStringConvertible { public let eventId: FSEventStreamEventId public let eventPath: String public let eventFlags: FSEventStreamEventFlags public var description: String { return "\(eventId) - \(eventFlags) - \(eventPath)" } } public class FolderContentMonitor { let callback: (Event) -> Void public init(pathsToWatch: [String], sinceWhen: FSEventStreamEventId = FSEventStreamEventId(kFSEventStreamEventIdSinceNow), callback: @escaping (Event) -> Void) { self.lastEventId = sinceWhen self.pathsToWatch = pathsToWatch self.callback = callback } deinit { stop() } // MARK: - Private Properties private let eventCallback: FSEventStreamCallback = { (stream: ConstFSEventStreamRef, contextInfo: UnsafeMutableRawPointer?, numEvents: Int, eventPaths: UnsafeMutableRawPointer, eventFlags: UnsafePointer, eventIds: UnsafePointer) in let fileSystemWatcher: FolderContentMonitor = unsafeBitCast(contextInfo, to: FolderContentMonitor.self) guard let paths = unsafeBitCast(eventPaths, to: NSArray.self) as? [String] else { return } for index in 0..