code: function GridLayout(colCount, tileSpans) {
        var self, layoutInfo, gridStyles, layoutTime, mapTime, reflowTime;
  
        layoutTime = $mdUtil.time(function() {
          layoutInfo = calculateGridFor(colCount, tileSpans);
        });
  
        return self = {
  
          /**
           * An array of objects describing each tile's position in the grid.
           */
          layoutInfo: function() {
            return layoutInfo;
          },
  
          /**
           * Maps grid positioning to an element and a set of styles using the
           * provided updateFn.
           */
          map: function(updateFn) {
            mapTime = $mdUtil.time(function() {
              var info = self.layoutInfo();
              gridStyles = updateFn(info.positioning, info.rowCount);
            });
            return self;
          },
  
          /**
           * Default animator simply sets the element.css( <styles> ). An alternate
           * animator can be provided as an argument. The function has the following
           * signature:
           *
           *    function({grid: {element: JQLite, style: Object}, tiles: Array<{element: JQLite, style: Object}>)
           */
          reflow: function(animatorFn) {
            reflowTime = $mdUtil.time(function() {
              var animator = animatorFn || defaultAnimator;
              animator(gridStyles.grid, gridStyles.tiles);
            });
            return self;
          },
  
          /**
           * Timing for the most recent layout run.
           */
          performance: function() {
            return {
              tileCount: tileSpans.length,
              layoutTime: layoutTime,
              mapTime: mapTime,
              reflowTime: reflowTime,
              totalTime: layoutTime + mapTime + reflowTime
            };
          }
        };
      }
docs: Publish layout function