loop = function(style, previousScrollTop) {

	// Continue loop
	const repeat = () => {

		// It depends on the browser, but it turns out that closures
		// are sometimes faster than .bind or .apply.
		requestAnimationFrame(() => loop(style, previousScrollTop))

	}

	// Get all active instances
	const activeInstances = getActiveInstances(instances)

	// Only continue when active instances available
	if (activeInstances.length === 0) return repeat()

	const scrollTop = getScrollTop()

	// Only continue when scrollTop has changed
	if (previousScrollTop === scrollTop) return repeat()
	else previousScrollTop = scrollTop

	// Get and set new props of each instance
	activeInstances
		.map((instance) => getProps(instance, scrollTop))
		.forEach(({ elem, props }) => setProps(elem, props))

	repeat()

}
Gets and sets new props when the user has scrolled and when there are active instances.
This part get executed with every frame. Make sure it's performant as hell.
@param {Object} style - Style object.
@param {?Integer} previousScrollTop
@returns {?*}