@@ -209,24 +209,14 @@ defmodule HashDict do
209
209
ordered ( )
210
210
end
211
211
212
- def equal? ( ordered ( bucket: a , size: size ) , ordered ( bucket: b , size: ^ size ) ) do
213
- a == b
214
- end
215
-
216
- def equal? ( trie ( size: size ) = a , trie ( size: ^ size ) = b ) do
217
- a == b
218
- end
219
-
220
- def equal? ( ordered ( ) = a , trie ( ) = b ) do
221
- equal? ( b , a )
222
- end
223
-
224
- def equal? ( trie ( size: size ) = a , ordered ( bucket: b , size: ^ size ) ) do
225
- :lists . keysort ( 1 , to_list ( a ) ) == :lists . keysort ( 1 , b )
226
- end
227
-
228
- def equal? ( _ , _ ) do
229
- false
212
+ def equal? ( dict1 , dict2 ) do
213
+ size = elem ( dict1 , 1 )
214
+ case elem ( dict2 , 1 ) do
215
+ ^ size ->
216
+ dict_equal? ( dict1 , dict1 )
217
+ _ ->
218
+ false
219
+ end
230
220
end
231
221
232
222
@ doc """
@@ -237,7 +227,7 @@ defmodule HashDict do
237
227
end
238
228
239
229
def to_list ( dict ) do
240
- dict_fold ( dict , [ ] , [ & 1 | & 2 ] ) |> :lists . reverse
230
+ dict_fold ( dict , [ ] , [ & 1 | & 2 ] )
241
231
end
242
232
243
233
@ doc """
@@ -335,11 +325,11 @@ defmodule HashDict do
335
325
## Dict-wide functions
336
326
337
327
defp dict_get ( ordered ( bucket: bucket ) , key ) do
338
- :lists . keyfind ( key , 1 , bucket )
328
+ bucket_get ( bucket , key )
339
329
end
340
330
341
331
defp dict_get ( trie ( root: root , depth: depth ) , key ) do
342
- :lists . keyfind ( key , 1 , node_bucket ( root , depth , bucket_hash ( key ) ) )
332
+ bucket_get ( node_bucket ( root , depth , bucket_hash ( key ) ) , key )
343
333
end
344
334
345
335
defp dict_fold ( ordered ( bucket: bucket ) , acc , fun ) do
@@ -402,28 +392,64 @@ defmodule HashDict do
402
392
end
403
393
end
404
394
395
+ defp dict_equal? ( dict1 , dict2 ) do
396
+ fun = fn ( { key , value } , acc ) ->
397
+ case fetch ( dict2 , key ) do
398
+ { _ok , ^ value } ->
399
+ acc
400
+ { _ok , _other } ->
401
+ throw ( :error )
402
+ :error ->
403
+ throw ( :error )
404
+ end
405
+ end
406
+ try do
407
+ reduce ( dict1 , true , fun )
408
+ catch
409
+ :error ->
410
+ false
411
+ end
412
+ end
413
+
405
414
## Bucket helpers
406
415
407
- # Puts a value in the bucket
408
- defp bucket_put ( [ { k , _ } = e | bucket ] , key , { :put , value } ) when key < k do
409
- { [ { key , value } , e | bucket ] , 1 }
416
+ # Get value from the bucket
417
+ defp bucket_get ( [ { k , _ } | _bucket ] , key ) when k > key do
418
+ :false
410
419
end
411
420
412
- defp bucket_put ( [ { k , _ } = e | bucket ] , key , { :update , initial , _fun } ) when key < k do
413
- { [ { key , initial } , e | bucket ] , 1 }
421
+ defp bucket_get ( [ { key , _ } = e | _bucket ] , key ) do
422
+ e
414
423
end
415
424
416
- defp bucket_put ( [ { k , _ } = e | bucket ] , key , value ) when key > k do
417
- { rest , count } = bucket_put ( bucket , key , value )
418
- { [ e | rest ] , count }
425
+ defp bucket_get ( [ _e | bucket ] , key ) do
426
+ bucket_get ( bucket , key )
419
427
end
420
428
421
- defp bucket_put ( [ { _ , _ } | bucket ] , key , { :put , value } ) do
429
+ defp bucket_get ( [ ] , _key ) do
430
+ :false
431
+ end
432
+
433
+ # Puts a value in the bucket
434
+ defp bucket_put ( [ { k , _ } | _ ] = bucket , key , { :put , value } ) when k > key do
435
+ { [ { key , value } | bucket ] , 1 }
436
+ end
437
+
438
+ defp bucket_put ( [ { k , _ } | _ ] = bucket , key , { :update , initial , _fun } ) when k > key do
439
+ { [ { key , initial } | bucket ] , 1 }
440
+ end
441
+
442
+ defp bucket_put ( [ { key , _ } | bucket ] , key , { :put , value } ) do
422
443
{ [ { key , value } | bucket ] , 0 }
423
444
end
424
445
425
- defp bucket_put ( [ { _ , value } | bucket ] , key , { :update , _initial , fun } ) do
426
- { [ { key , fun . ( value ) } | bucket ] , 0 }
446
+ defp bucket_put ( [ { key , value } | bucket ] , key , { :update , _initial , fun } ) do
447
+ { [ { key , fun . ( value ) } | bucket ] , 0 }
448
+ end
449
+
450
+ defp bucket_put ( [ e | bucket ] , key , value ) do
451
+ { rest , count } = bucket_put ( bucket , key , value )
452
+ { [ e | rest ] , count }
427
453
end
428
454
429
455
defp bucket_put ( [ ] , key , { :put , value } ) do
@@ -436,23 +462,23 @@ defmodule HashDict do
436
462
437
463
# Puts a value in the bucket without returning
438
464
# the operation value
439
- defp bucket_put! ( [ { k , _ } = e | bucket ] , key , value ) when key < k , do: [ { key , value } , e | bucket ]
440
- defp bucket_put! ( [ { k , _ } = e | bucket ] , key , value ) when key > k , do: [ e | bucket_put! ( bucket , key , value ) ]
441
- defp bucket_put! ( [ { _ , _ } | bucket ] , key , value ) , do: [ { key , value } | bucket ]
465
+ defp bucket_put! ( [ { k , _ } | _ ] = bucket , key , value ) when k > key , do: [ { key , value } | bucket ]
466
+ defp bucket_put! ( [ { key , _ } | bucket ] , key , value ) , do: [ { key , value } | bucket ]
467
+ defp bucket_put! ( [ { _ , _ } = e | bucket ] , key , value ) , do: [ e | bucket_put! ( bucket , key , value ) ]
442
468
defp bucket_put! ( [ ] , key , value ) , do: [ { key , value } ]
443
469
444
470
# Deletes a key from the bucket
445
- defp bucket_delete ( [ { k , _ } | _ ] = bucket , key ) when key < k do
471
+ defp bucket_delete ( [ { k , _ } | _ ] = bucket , key ) when k > key do
446
472
{ bucket , nil , 0 }
447
473
end
448
474
449
- defp bucket_delete ( [ { k , _ } = e | bucket ] , key ) when key > k do
450
- { rest , value , count } = bucket_delete ( bucket , key )
451
- { [ e | rest ] , value , count }
475
+ defp bucket_delete ( [ { key , value } | bucket ] , key ) do
476
+ { bucket , value , - 1 }
452
477
end
453
478
454
- defp bucket_delete ( [ { _ , value } | bucket ] , _key ) do
455
- { bucket , value , - 1 }
479
+ defp bucket_delete ( [ e | bucket ] , key ) do
480
+ { rest , value , count } = bucket_delete ( bucket , key )
481
+ { [ e | rest ] , value , count }
456
482
end
457
483
458
484
defp bucket_delete ( [ ] , _key ) do
0 commit comments