calculateRenderablePositions() {
        if (!this.indicesDirty || this.batching > 0 || !this.config.calculateRenderablePositions) {
            return;
        }

        let first;
        let last;

        this.each(node => {
            if (node.renderable()) {
                // Cache first node if none yet
                first = first || node;

                // Always update last node on match
                last = node;
            }
        });

        if (this.firstRenderableNode && this.firstRenderableNode !== first) {
            this.firstRenderableNode.markDirty();
        }

        if (first && first !== this.firstRenderableNode) {
            first.markDirty();
        }

        if (this.lastRenderableNode && this.lastRenderableNode !== last) {
            this.lastRenderableNode.markDirty();
        }

        if (last && last !== this.lastRenderableNode) {
            last.markDirty();
        }

        this.firstRenderableNode = first;
        this.lastRenderableNode = last;
        this.indicesDirty = false;
    }
Calculate and cache the first/last renderable nodes.

Primarily useful for rendering engines, since hidden DOM
nodes may still be present and CSS :first/:last selectors
would fail.

@private
@return {void}