class EM::Mongo::Collection

def afind_one(spec_or_object_id=nil, opts={})

def afind_one(spec_or_object_id=nil, opts={})
  spec = case spec_or_object_id
         when nil
           {}
         when BSON::ObjectId
           {:_id => spec_or_object_id}
         when Hash
           spec_or_object_id
         else
           raise TypeError, "spec_or_object_id must be an instance of ObjectId or Hash, or nil"
         end
  afind(spec, opts.merge(:limit => -1)).next_document
end

def afirst(selector={}, opts={}, &blk)

def afirst(selector={}, opts={}, &blk)
  opts[:limit] = 1
  afind(selector, opts) do |res|
    yield res.first
  end
end

def find(*args)

def find(*args)
  f = Fiber.current
  cursor = afind(*args)
  cursor.to_a.callback{ |res| f.resume(res) }
  Fiber.yield
end

def find(selector={}, opts={})

def find(selector={}, opts={})
  f = Fiber.current
  cb = proc { |res| f.resume(res) }
  skip  = opts.delete(:skip) || 0
  limit = opts.delete(:limit) || 0
  order = opts.delete(:order)
  @connection.find(@name, skip, limit, order, selector, nil, &cb)
  Fiber.yield
end

def find_one(selector={}, opts={})

def find_one(selector={}, opts={})
  opts[:limit] = 1
  find(selector, opts).first
end

def first(selector={}, opts={})

def first(selector={}, opts={})
  opts[:limit] = 1
  find(selector, opts).first
end