| 245 | } |
| 246 | |
| 247 | public IPersistentMap assoc(Object key, Object val){ |
| 248 | int i = indexOf(key); |
| 249 | Object[] newArray; |
| 250 | if(i >= 0) //already have key, same-sized replacement |
| 251 | { |
| 252 | if(array[i + 1] == val) //no change, no op |
| 253 | return this; |
| 254 | newArray = array.clone(); |
| 255 | newArray[i + 1] = val; |
| 256 | } |
| 257 | else //didn't have key, grow |
| 258 | { |
| 259 | if(array.length >= HASHTABLE_THRESHOLD) |
| 260 | return createHT(array).assoc(key, val); |
| 261 | newArray = new Object[array.length + 2]; |
| 262 | if(array.length > 0) |
| 263 | System.arraycopy(array, 0, newArray, 0, array.length); |
| 264 | newArray[newArray.length-2] = key; |
| 265 | newArray[newArray.length-1] = val; |
| 266 | } |
| 267 | return create(newArray); |
| 268 | } |
| 269 | |
| 270 | public IPersistentMap without(Object key){ |
| 271 | int i = indexOf(key); |