      */
     @discardableResult
     public func sync(completion: (([T]) -> Void)? = nil) -> [T] {
-        let n = graph.searchForRelationship(types: types, tags: tags, groups: groups, properties: properties) as! [T]
-        
-        guard let c = completion else {
-            return n
-        }
-        
-        if Thread.isMainThread {
-            c(n)
-        } else {
-            DispatchQueue.main.async { [n = n, c = c] in
-                c(n)
-            }
-        }
-        
-        return n
+        return executeSynchronousRequest(nodes: graph.searchForRelationship(types: types, tags: tags, groups: groups, properties: properties) as! [T], completion: completion)
     }
     
     /**

     */
    @discardableResult
    public func sync(completion: (([T]) -> Void)? = nil) -> [T] {
        let n = graph.searchForAction(types: types, tags: tags, groups: groups, properties: properties) as! [T]
        
        guard let c = completion else {
            return n
        }
        
        if Thread.isMainThread {
            c(n)
        } else {
            DispatchQueue.main.async { [n = n, c = c] in
                c(n)
            }
        }
        
        return n
    }
    
    /**

        self.properties = properties
        return self
    }
    
    /**
     Executes the synchronous process on the main thread.
     - Parameter nodes: An Array of Elements.
     - Parameter completion: An optional completion block.
     - Returns: An Array of Elements.
     */
    @discardableResult
    internal func executeSynchronousRequest(nodes: [T], completion: (([T]) -> Void)? = nil) -> [T] {
        guard let c = completion else {
            return nodes
        }

        if Thread.isMainThread {
            c(nodes)
        } else {
            DispatchQueue.main.async { [n = nodes, c = c] in
                c(n)
            }
        }

        return nodes
    }
}

extension Search where T: Entity  {
