| 117 | } |
| 118 | |
| 119 | function updateOrderedMap(omap, k, v) { |
| 120 | const map = omap._map; |
| 121 | const list = omap._list; |
| 122 | const i = map.get(k); |
| 123 | const has = i !== undefined; |
| 124 | let newMap; |
| 125 | let newList; |
| 126 | if (v === NOT_SET) { |
| 127 | // removed |
| 128 | if (!has) { |
| 129 | return omap; |
| 130 | } |
| 131 | if (list.size >= SIZE && list.size >= map.size * 2) { |
| 132 | newList = list.filter((entry, idx) => entry !== undefined && i !== idx); |
| 133 | newMap = newList |
| 134 | .toKeyedSeq() |
| 135 | .map((entry) => entry[0]) |
| 136 | .flip() |
| 137 | .toMap(); |
| 138 | if (omap.__ownerID) { |
| 139 | newMap.__ownerID = newList.__ownerID = omap.__ownerID; |
| 140 | } |
| 141 | } else { |
| 142 | newMap = map.remove(k); |
| 143 | newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); |
| 144 | } |
| 145 | } else if (has) { |
| 146 | if (v === list.get(i)[1]) { |
| 147 | return omap; |
| 148 | } |
| 149 | newMap = map; |
| 150 | newList = list.set(i, [k, v]); |
| 151 | } else { |
| 152 | newMap = map.set(k, list.size); |
| 153 | newList = list.set(list.size, [k, v]); |
| 154 | } |
| 155 | if (omap.__ownerID) { |
| 156 | omap.size = newMap.size; |
| 157 | omap._map = newMap; |
| 158 | omap._list = newList; |
| 159 | omap.__hash = undefined; |
| 160 | omap.__altered = true; |
| 161 | return omap; |
| 162 | } |
| 163 | return makeOrderedMap(newMap, newList); |
| 164 | } |