@@ -48,37 +48,31 @@ defmodule Dict.Behaviour do
4848 :error -> default
4949 end
5050 end
51- defoverridable get: 2 , get: 3
5251
5352 def fetch! ( dict , key ) do
5453 case fetch ( dict , key ) do
5554 { :ok , value } -> value
56- :error -> raise ( KeyError , key: key )
55+ :error -> raise KeyError , key: key
5756 end
5857 end
59- defoverridable fetch!: 2
6058
6159 def has_key? ( dict , key ) do
6260 match? { :ok , _ } , fetch ( dict , key )
6361 end
64- defoverridable has_key?: 2
6562
6663 def put_new ( dict , key , value ) do
6764 update ( dict , key , value , fn ( v ) -> v end )
6865 end
69- defoverridable put_new: 3
7066
7167 def drop ( dict , [ ] ) , do: dict
7268
7369 def drop ( dict , [ key | keys ] ) do
7470 drop ( delete ( dict , key ) , keys )
7571 end
76- defoverridable drop: 2
7772
7873 def take ( dict , keys ) do
7974 take ( dict , keys , new )
8075 end
81- defoverridable take: 2
8276
8377 defp take ( _dict , [ ] , acc ) , do: acc
8478 defp take ( dict , [ key | keys ] , acc ) do
@@ -88,38 +82,48 @@ defmodule Dict.Behaviour do
8882 end
8983 end
9084
91- def to_list ( dict ) , do: reduce ( dict , [ ] , & [ & 1 | & 2 ] ) |> Enum . reverse
92- defoverridable to_list: 1
85+ def to_list ( dict ) do
86+ reduce ( dict , { :cont , [ ] } , fn
87+ kv , acc -> { :cont , [ kv | acc ] }
88+ end ) |> elem ( 1 ) |> :lists . reverse
89+ end
9390
94- def keys ( dict ) , do: reduce ( dict , [ ] , fn ( { k , _ } , acc ) -> [ k | acc ] end ) |> Enum . reverse
95- defoverridable keys: 1
91+ def keys ( dict ) do
92+ reduce ( dict , { :cont , [ ] } , fn
93+ { k , _ } , acc -> { :cont , [ k | acc ] }
94+ end ) |> elem ( 1 ) |> :lists . reverse
95+ end
9696
97- def values ( dict ) , do: reduce ( dict , [ ] , fn ( { _ , v } , acc ) -> [ v | acc ] end ) |> Enum . reverse
98- defoverridable values: 1
97+ def values ( dict ) do
98+ reduce ( dict , { :cont , [ ] } , fn
99+ { _ , v } , acc -> { :cont , [ v | acc ] }
100+ end ) |> elem ( 1 ) |> :lists . reverse
101+ end
99102
100103 def equal? ( dict1 , dict2 ) do
101104 import Kernel , except: [ size: 1 ]
102105 case size ( dict1 ) == size ( dict2 ) do
103106 false -> false
104- true ->
105- try do
106- reduce ( dict1 , nil , fn ( { k , v } , _acc ) ->
107- unless fetch ( dict2 , k ) == { :ok , v } , do: throw ( :error )
108- end )
109- true
110- catch
111- :error -> false
112- end
107+ true ->
108+ reduce ( dict1 , { :cont , true } , fn ( { k , v } , _acc ) ->
109+ unless fetch ( dict2 , k ) == { :ok , v } do
110+ { :halt , false }
111+ else
112+ { :cont , true }
113+ end
114+ end ) |> elem ( 1 )
113115 end
114116 end
115- defoverridable equal?: 2
116117
117118 def merge ( dict , enumerable , callback // fn ( _k , _v1 , v2 ) -> v2 end ) do
118119 Enum . reduce ( enumerable , dict , fn ( { key , value } , acc ) ->
119120 update ( acc , key , value , fn ( v1 ) -> callback . ( key , v1 , value ) end )
120121 end )
121122 end
122- defoverridable merge: 2 , merge: 3
123+
124+ defoverridable merge: 2 , merge: 3 , equal?: 2 , to_list: 1 , keys: 1 ,
125+ values: 1 , take: 2 , drop: 2 , get: 2 , get: 3 , fetch!: 2 ,
126+ has_key?: 2 , put_new: 3
123127 end
124128 end
125129end
0 commit comments