@@ -202,8 +202,8 @@ common(cast,{point,K},[O,Q]) ->
202
202
{keep_state ,[O ,Q ]}
203
203
end ;
204
204
common (cast ,{cheat ,KVL },[O ,Q ]) ->
205
- NQ = length ( lists :filter (
206
- fun ({K ,V }) when V =< ? MAX_ORDER ->
205
+ NQ = lists :foldl (
206
+ fun ({K ,V }, NQ ) when V =< ? MAX_ORDER ->
207
207
case get (K ) of
208
208
undefined -> skip ;
209
209
C ->
@@ -276,44 +276,40 @@ common(cast,{cheat,KVL},[O,Q]) ->
276
276
end ;
277
277
true -> skip
278
278
end ,
279
- case get (clean ) of
280
- undefined -> put (clean ,0 );
281
- _ -> skip
282
- end ,
283
279
case get (K ) of
284
280
undefined ->
285
281
if
286
282
V > 0 ->
287
283
put (K ,V ),
288
284
ets :insert (? ETS_KEYS_STORE_TABLE_NAME ,{K ,V }),
289
285
if
290
- V > ? SCORE_OFFSET -> true ;
291
- true -> false
286
+ V > ? SCORE_OFFSET -> NQ + 1 ;
287
+ true -> NQ
292
288
end ;
293
- true -> false
289
+ true -> NQ
294
290
end ;
295
291
OV ->
296
292
if
297
293
V > 0 ->
298
294
put (K ,V ),
299
295
ets :insert (? ETS_KEYS_STORE_TABLE_NAME ,{K ,V }),
300
296
if
301
- OV =< ? SCORE_OFFSET andalso V > ? SCORE_OFFSET -> true ;
302
- true -> false
297
+ OV =< ? SCORE_OFFSET andalso V > ? SCORE_OFFSET -> NQ + 1 ;
298
+ true -> NQ
303
299
end ;
304
300
true ->
305
301
if
306
302
OV > ? SCORE_OFFSET ->
307
- erase (K ),ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),put ( clean , get ( clean ) + 1 ), false ;
303
+ erase (K ),ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),NQ - 1 ;
308
304
true ->
309
- erase (K ),ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),false
305
+ erase (K ),ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),NQ
310
306
end
311
307
end
312
308
end ;
313
- (_ ) ->
314
- false
309
+ (_ , NQ ) ->
310
+ NQ
315
311
end ,
316
- KVL )) + Q - erase ( clean ),
312
+ Q , KVL ),
317
313
{keep_state ,[O ,NQ ]};
318
314
common ({call ,From },{count ,K },[O ,Q ]) ->
319
315
{keep_state ,[O ,Q ],[{reply ,From ,get (K )}]};
@@ -744,47 +740,15 @@ scoring(L,U,R) ->
744
740
end .
745
741
746
742
resetting ({_ ,KL },Q ) ->
747
- put (reset ,0 ),
748
- lists :foreach (
749
- fun (K ) ->
750
- ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),
751
- C = erase (K ),
752
- if
753
- (C - 1 ) div ? MAX_LIMIT == 0 ->
754
- N = list_to_atom (" o0" ++ integer_to_list ((C - 1 ) div ? MIN_LIMIT )),
755
- case whereis (N ) of
756
- undefined ->
757
- lfu_exact_score_sup :start ([(C - 1 ) div ? MIN_LIMIT ,0 ]),
758
- lfu_exact_score :reset (N ,K );
759
- _ ->
760
- lfu_exact_score :reset (N ,K )
761
- end ;
762
- true ->
763
- N = list_to_atom (" o" ++ integer_to_list ((C - 1 ) div ? MAX_LIMIT )),
764
- case whereis (N ) of
765
- undefined ->
766
- lfu_quick_score_sup :start ([(C - 1 ) div ? MAX_LIMIT ,0 ]),
767
- lfu_quick_score :reset (N ,K );
768
- true ->
769
- lfu_quick_score :reset (N ,K )
770
- end
771
- end ,
772
- put (reset ,get (reset )+ 1 )
773
- end ,
774
- KL ),
775
- Q - erase (reset );
776
- resetting (T ,Q ) ->
777
- put (reset ,0 ),
778
- ets :info (T ) =/= undefined andalso
779
- ets :foldl (
780
- fun ({_ ,KL },[]) ->
781
- lists :foreach (
782
- fun (K ) ->
743
+ lists :foldl (
744
+ fun (K ,NQ ) ->
745
+ case erase (K ) of
746
+ undefined -> NQ ;
747
+ C ->
783
748
ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),
784
- C = erase (K ),
785
749
if
786
750
(C - 1 ) div ? MAX_LIMIT == 0 ->
787
- N = list_to_atom (" o0" ++ integer_to_list ((C - 1 ) div ? MIN_LIMIT )),
751
+ N = list_to_atom (" o0" ++ integer_to_list ((C - 1 ) div ? MIN_LIMIT )),
788
752
case whereis (N ) of
789
753
undefined ->
790
754
lfu_exact_score_sup :start ([(C - 1 ) div ? MIN_LIMIT ,0 ]),
@@ -798,38 +762,78 @@ resetting(T,Q) ->
798
762
undefined ->
799
763
lfu_quick_score_sup :start ([(C - 1 ) div ? MAX_LIMIT ,0 ]),
800
764
lfu_quick_score :reset (N ,K );
801
- true ->
765
+ _ ->
802
766
lfu_quick_score :reset (N ,K )
803
767
end
804
768
end ,
805
- put (reset ,get (reset )+ 1 )
806
- end ,
807
- KL ),[]
769
+ NQ - 1
770
+ end
808
771
end ,
809
- [],T ),
810
- Q - erase (reset ).
772
+ Q ,KL );
773
+ resetting (T ,Q ) ->
774
+ case ets :info (T ) of
775
+ undefined -> Q ;
776
+ _ ->
777
+ ets :foldl (
778
+ fun ({_ ,KL },NQ ) ->
779
+ lists :foldl (
780
+ fun (K ,NQ ) ->
781
+ case erase (K ) of
782
+ undefined -> NQ ;
783
+ C ->
784
+ ets :delete (? ETS_KEYS_STORE_TABLE_NAME ,K ),
785
+ if
786
+ (C - 1 ) div ? MAX_LIMIT == 0 ->
787
+ N = list_to_atom (" o0" ++ integer_to_list ((C - 1 ) div ? MIN_LIMIT )),
788
+ case whereis (N ) of
789
+ undefined ->
790
+ lfu_exact_score_sup :start ([(C - 1 ) div ? MIN_LIMIT ,0 ]),
791
+ lfu_exact_score :reset (N ,K );
792
+ _ ->
793
+ lfu_exact_score :reset (N ,K )
794
+ end ;
795
+ true ->
796
+ N = list_to_atom (" o" ++ integer_to_list ((C - 1 ) div ? MAX_LIMIT )),
797
+ case whereis (N ) of
798
+ undefined ->
799
+ lfu_quick_score_sup :start ([(C - 1 ) div ? MAX_LIMIT ,0 ]),
800
+ lfu_quick_score :reset (N ,K );
801
+ _ ->
802
+ lfu_quick_score :reset (N ,K )
803
+ end
804
+ end ,
805
+ NQ - 1
806
+ end
807
+ end ,
808
+ NQ ,KL )
809
+ end ,
810
+ Q ,T )
811
+ end .
811
812
812
813
restorage (T ) ->
813
- put (quantity ,0 ),
814
- ets :whereis (T ) =/= undefined andalso
815
- ets :foldl (
816
- fun ({K ,V },[]) ->
817
- if
818
- V =< ? MAX_ORDER ->
814
+ case ets :whereis (T ) of
815
+ undefined -> 0 ;
816
+ _ ->
817
+ ets :foldl (
818
+ fun ({K ,V },Q ) ->
819
819
if
820
- V div ? MAX_LIMIT =< 1 ->
821
- N = list_to_atom (" o0" ++ integer_to_list ((V - 1 )div ? MIN_LIMIT )),
822
- whereis (N ) =:= undefined andalso lfu_exact_score_sup :start ([(V - 1 ) div ? MIN_LIMIT ,0 ]);
820
+ V =< ? MAX_ORDER ->
821
+ if
822
+ V div ? MAX_LIMIT =< 1 ->
823
+ N = list_to_atom (" o0" ++ integer_to_list ((V - 1 )div ? MIN_LIMIT )),
824
+ whereis (N ) =:= undefined andalso lfu_exact_score_sup :start ([(V - 1 ) div ? MIN_LIMIT ,0 ]);
825
+ true ->
826
+ N = list_to_atom (" o" ++ integer_to_list ((V - 1 ) div ? MAX_LIMIT )),
827
+ whereis (N ) =:= undefined andalso lfu_quick_score_sup :start ([(V - 1 ) div ? MAX_LIMIT ,0 ])
828
+ end ,
829
+ put (K ,V ),
830
+ if
831
+ V > ? SCORE_OFFSET -> Q + 1 ;
832
+ true -> Q
833
+ end ;
823
834
true ->
824
- N = list_to_atom (" o" ++ integer_to_list ((V - 1 ) div ? MAX_LIMIT )),
825
- whereis (N ) =:= undefined andalso lfu_quick_score_sup :start ([(V - 1 ) div ? MAX_LIMIT ,0 ])
826
- end ,
827
- put (K ,V ),
828
- V > ? SCORE_OFFSET andalso put (quantity ,get (quantity )+ 1 ),
829
- [];
830
- true ->
831
- []
832
- end
833
- end ,
834
- [],T ),
835
- erase (quantity ).
835
+ Q
836
+ end
837
+ end ,
838
+ 0 ,T )
839
+ end .
0 commit comments