保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"use strict";
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = loadBlockHoistPlugin;
 
function _traverse() {
  const data = require("@babel/traverse");
 
  _traverse = function () {
    return data;
  };
 
  return data;
}
 
var _plugin = require("../config/plugin");
 
let LOADED_PLUGIN;
 
function loadBlockHoistPlugin() {
  if (!LOADED_PLUGIN) {
    LOADED_PLUGIN = new _plugin.default(Object.assign({}, blockHoistPlugin, {
      visitor: _traverse().default.explode(blockHoistPlugin.visitor)
    }), {});
  }
 
  return LOADED_PLUGIN;
}
 
function priority(bodyNode) {
  const priority = bodyNode == null ? void 0 : bodyNode._blockHoist;
  if (priority == null) return 1;
  if (priority === true) return 2;
  return priority;
}
 
function stableSort(body) {
  const buckets = Object.create(null);
 
  for (let i = 0; i < body.length; i++) {
    const n = body[i];
    const p = priority(n);
    const bucket = buckets[p] || (buckets[p] = []);
    bucket.push(n);
  }
 
  const keys = Object.keys(buckets).map(k => +k).sort((a, b) => b - a);
  let index = 0;
 
  for (const key of keys) {
    const bucket = buckets[key];
 
    for (const n of bucket) {
      body[index++] = n;
    }
  }
 
  return body;
}
 
const blockHoistPlugin = {
  name: "internal.blockHoist",
  visitor: {
    Block: {
      exit({
        node
      }) {
        const {
          body
        } = node;
        let max = Math.pow(2, 30) - 1;
        let hasChange = false;
 
        for (let i = 0; i < body.length; i++) {
          const n = body[i];
          const p = priority(n);
 
          if (p > max) {
            hasChange = true;
            break;
          }
 
          max = p;
        }
 
        if (!hasChange) return;
        node.body = stableSort(body.slice());
      }
 
    }
  }
};