5050-export ([new /0 , value /1 , value /2 ]).
5151-export ([update /3 , update /4 , merge /2 , equal /2 ]).
5252-export ([to_binary /1 , from_binary /1 ]).
53+ -export ([to_binary /2 ]).
5354-export ([stats /1 , stat /2 ]).
5455-export ([parent_clock /2 ]).
56+ -export ([to_version /2 ]).
5557
5658% % EQC API
5759-ifdef (EQC ).
7981-type add () :: ? ADD .
8082-type remove () :: ? REM .
8183
84+ -ifdef (EQC ).
85+ -define (DICT , orddict ).
86+ -else .
87+ -define (DICT , dict ).
88+ -endif .
89+
8290-spec new () -> lwwset ().
8391new () ->
84- orddict :new ().
92+ ? DICT :new ().
8593
8694-spec parent_clock (riak_dt_vclock :vclock (), lwwset ()) -> lwwset ().
8795parent_clock (_Clock , LWWSet ) ->
8896 LWWSet .
8997
9098-spec value (lwwset ()) -> [member ()].
9199value (LWWSet ) ->
92- [K || {K , {_TS , Status }} <- orddict :to_list (LWWSet ), Status == 1 ].
100+ [K || {K , {_TS , Status }} <- ? DICT :to_list (LWWSet ), Status == 1 ].
93101
94102value (size , LWWSet ) ->
95103 length (value (LWWSet ));
@@ -108,27 +116,27 @@ update(Op, Actor, Set, _Ctx) ->
108116% % Private
109117-spec add_elem (member (), ts (), lwwset ()) -> lwwset ().
110118add_elem (Elem , TS , LWWSet ) ->
111- case orddict :find (Elem , LWWSet ) of
119+ case ? DICT :find (Elem , LWWSet ) of
112120 error ->
113- orddict :store (Elem , {TS , ? ADD }, LWWSet );
121+ ? DICT :store (Elem , {TS , ? ADD }, LWWSet );
114122 {ok , {TS , ? REM }} ->
115- orddict :store (Elem , {TS , ? ADD }, LWWSet );
123+ ? DICT :store (Elem , {TS , ? ADD }, LWWSet );
116124 {ok , {TS0 , _ }} when TS0 < TS ->
117- orddict :store (Elem , {TS , ? ADD }, LWWSet );
125+ ? DICT :store (Elem , {TS , ? ADD }, LWWSet );
118126 _ ->
119127 LWWSet
120128 end .
121129
122130% % @doc warning, allows doomstoning.
123131-spec remove_elem (member (), ts (), lwwset ()) -> lwwset ().
124132remove_elem (Elem , TS , LWWSet ) ->
125- case orddict :find (Elem , LWWSet ) of
133+ case ? DICT :find (Elem , LWWSet ) of
126134 error ->
127- orddict :store (Elem , {TS , ? REM }, LWWSet );
135+ ? DICT :store (Elem , {TS , ? REM }, LWWSet );
128136 {ok , {TS , ? ADD }} ->
129137 LWWSet ;
130138 {ok , {TS0 , _ }} when TS0 < TS ->
131- orddict :store (Elem , {TS , ? REM }, LWWSet );
139+ ? DICT :store (Elem , {TS , ? REM }, LWWSet );
132140 _ ->
133141 LWWSet
134142 end .
@@ -137,7 +145,7 @@ remove_elem(Elem, TS, LWWSet) ->
137145merge (LWWSet , LWWSet ) ->
138146 LWWSet ;
139147merge (LWWSet1 , LWWSet2 ) ->
140- orddict :merge (fun lww /3 , LWWSet1 , LWWSet2 ).
148+ ? DICT :merge (fun lww /3 , LWWSet1 , LWWSet2 ).
141149
142150lww (_Key , {TS , ? ADD }, {TS , ? REM }) ->
143151 {TS , ? ADD };
@@ -160,7 +168,7 @@ stats(LWWSet) ->
160168
161169-spec stat (atom (), lwwset ()) -> number () | undefined .
162170stat (element_count , LWWSet ) ->
163- orddict :size (LWWSet );
171+ ? DICT :size (LWWSet );
164172stat (_ ,_ ) -> undefined .
165173
166174-include (" riak_dt_tags.hrl" ).
@@ -177,15 +185,32 @@ stat(_,_) -> undefined.
177185% % @see `from_binary/1'
178186-spec to_binary (lwwset ()) -> binary_lwwset ().
179187to_binary (S ) ->
180- <<? TAG :8 /integer , ? V1_VERS :8 /integer , (riak_dt :to_binary (S ))/binary >>.
181-
182- % % @doc When the argument is a `binary_orswot()' produced by
183- % % `to_binary/1' will return the original `orswot()'.
188+ {ok , B } = to_binary (? V1_VERS , S ),
189+ B .
190+
191+ % % @doc encode set to target version. The first argument is the target
192+ % % binary type.
193+ -spec to_binary (Vers :: pos_integer (), lwwset ()) -> {ok , binary_lwwset ()} | ? UNSUPPORTED_VERSION .
194+ to_binary (? V1_VERS , S ) ->
195+ {ok , <<? TAG :8 /integer , ? V1_VERS :8 /integer , (riak_dt :to_binary (S ))/binary >>};
196+ to_binary (Vers , _S ) ->
197+ ? UNSUPPORTED_VERSION (Vers ).
198+
199+ % % @doc When the argument is a `binary_lwwset()' produced by
200+ % % `to_binary/1' will return the original `lwwset()'.
184201% %
185202% % @see `to_binary/1'
186- -spec from_binary (binary_lwwset ()) -> lwwset ().
203+ -spec from_binary (binary_lwwset ()) -> { ok , lwwset ()} | ? UNSUPPORTED_VERSION | ? INVALID_BINARY .
187204from_binary (<<? TAG :8 /integer , ? V1_VERS :8 /integer , B /binary >>) ->
188- riak_dt :from_binary (B ).
205+ {ok , riak_dt :from_binary (B )};
206+ from_binary (<<? TAG :8 /integer , Vers :8 /integer , _B /binary >>) ->
207+ ? UNSUPPORTED_VERSION (Vers );
208+ from_binary (_B ) ->
209+ ? INVALID_BINARY .
210+
211+ -spec to_version (pos_integer (), lwwset ()) -> lwwset ().
212+ to_version (_Version , Set ) ->
213+ Set .
189214
190215% % ===================================================================
191216% % EUnit tests
0 commit comments