UNPKG

react-relay

Version:

A framework for building data-driven React applications.

57 lines (52 loc) 2.13 kB
/** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule recycleNodesInto * @typechecks * */ 'use strict'; var _Object$keys = require('babel-runtime/core-js/object/keys')['default']; var GraphQLFragmentPointer = require('./GraphQLFragmentPointer'); /** * Recycles subtrees from `prevData` by replacing equal subtrees in `nextData`. */ function recycleNodesInto(prevData, nextData) { if (typeof prevData !== 'object' || !prevData || typeof nextData !== 'object' || !nextData) { return nextData; } var canRecycle = false; if (prevData instanceof GraphQLFragmentPointer) { canRecycle = nextData instanceof GraphQLFragmentPointer && nextData.equals(prevData); } else { var isPrevArray = Array.isArray(prevData); var isNextArray = Array.isArray(nextData); if (isPrevArray && isNextArray) { // Assign local variables to preserve Flow type refinement. var prevArray = prevData; var nextArray = nextData; canRecycle = nextArray.reduce(function (wasEqual, nextItem, ii) { nextArray[ii] = recycleNodesInto(prevArray[ii], nextItem); return wasEqual && nextArray[ii] === prevArray[ii]; }, true) && prevArray.length === nextArray.length; } else if (!isPrevArray && !isNextArray) { // Assign local variables to preserve Flow type refinement. var prevObject = prevData; var nextObject = nextData; var prevKeys = _Object$keys(prevObject); var nextKeys = _Object$keys(nextObject); canRecycle = nextKeys.reduce(function (wasEqual, key) { var nextValue = nextObject[key]; nextObject[key] = recycleNodesInto(prevObject[key], nextValue); return wasEqual && nextObject[key] === prevObject[key]; }, true) && prevKeys.length === nextKeys.length; } } return canRecycle ? prevData : nextData; } module.exports = recycleNodesInto;