function extract (dest, id) {
	return Observable.create((observer) => {
		const tmpDest = getTmp()
		const untar = tar.extract(tmpDest, {strip: 1})

		const completeHandler = () => {
			observer.next(tmpDest)
			observer.complete()
		}
		const errorHandler = (err) => observer.error(err)

		this.read(id).on('error', errorHandler)
			.pipe(gunzip()).on('error', errorHandler)
			.pipe(untar).on('error', errorHandler)
			.on('finish', completeHandler)
	})
		::mergeMap((tmpDest) => util.rename(tmpDest, dest)
			::retryWhen((errors) => errors::mergeMap((error) => {
				if (error.code !== 'ENOENT') {
					throw error
				}
				return util.mkdirp(path.dirname(dest))
			}))
		)
}
extract a dependency from the cache.
@param {String} dest - pathname into which the cached dependency should be
extracted.
@param {String} id - id (unique identifier) of the cached tarball.
@return {Observable} - observable sequence that will be completed once
the cached dependency has been fetched.