Advertisement
Guest User

Untitled

a guest
Jun 20th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 3.41 KB | None | 0 0
  1. % Реализация описанного в тестах типа данных — отображения (Ассоциативного массива).
  2.  
  3. -module(assoc_tests).
  4. -include_lib("eunit/include/eunit.hrl").
  5. -export([new/0, insert/3, from_list/1, to_list/1, fold/3, map/2, find/2, store/3, size/1, is_key/2, filter/2, erase/2]).
  6. new() -> {nil,nil,nil,nil}.
  7.  
  8.  
  9. % Добавление нового элемента в ассоциативный массив
  10. insert(Key, Value, {nil, nil, nil, nil}) -> E = new(),
  11. {Key, Value, E, E};
  12.  
  13. insert(Key, Value, {K, _, S, B}) when Key == K -> {Key, Value, S, B};
  14. insert(Key, Value, {K, V, S, B}) when Key < K -> T = insert(Key, Value, S),
  15. {K, V, T, B};
  16.  
  17. insert(Key, Value, {K, V, S, B}) when Key > K -> T = insert(Key, Value, B),
  18. {K, V, S, T}.
  19.  
  20.  
  21. % Функции from_list() to_list() (преобразование)
  22. from_list([]) -> new();
  23. from_list(X) -> from_list(X, new()).
  24.  
  25. from_list([], Three) -> Three;
  26. from_list([{Xa,Xb}|Xs], Three) ->   T = insert(Xa, Xb, Three),
  27. from_list(Xs, T).
  28.  
  29. to_list({nil, nil, nil, nil}) -> [];
  30. to_list(Three) -> to_list(Three, []).
  31.  
  32. to_list({nil, nil, nil, nil}, A) -> A;
  33. to_list({Key, Value, {nil, nil, nil, nil}, B}, A) ->    to_list(B, [{Key, Value}|A]);
  34. to_list({Key, Value, S, _}, A) -> to_list(S, [{Key, Value}|A]).
  35.  
  36.  
  37. % Функция fold (свертка)
  38. fold(_F, Z, {nil, nil, nil, nil}) -> Z;
  39. fold(F, Z, {Key, Value, {nil, nil, nil, nil}, B}) -> F(Key, Value, fold(F, Z, B));
  40. fold(F, Z, {Key, Value, S, _}) -> F(Key, Value, fold(F, Z, S)).
  41.  
  42.  
  43. % Функция Filter
  44. filter(_F, {nil, nil, nil, nil}) -> {nil, nil, nil, nil};
  45. filter(F, Three) -> filter(F, Three, new()).
  46. filter(_F,{nil, nil, nil, nil}, FThree) -> FThree;
  47. filter(F, {Key, Value, {nil, nil, nil, nil}, B}, FThree) -> case F(Key, Value) of
  48. true-> FT = insert(Key, Value, FThree),
  49. filter(F, B, FT);
  50. _ -> filter(F, B, FThree)
  51. end;
  52.  
  53. filter(F, {Key, Value, S, _}, FThree) -> case F(Key, Value) of
  54. true-> FT = insert(Key, Value, FThree),
  55. filter(F, S, FT);
  56. _ -> filter(F, S, FThree)
  57. end.
  58.  
  59.  
  60. % Функция map
  61. map(_F, {nil, nil, nil, nil}) -> {nil, nil, nil, nil};
  62. map(F, Three) -> map(F, Three, new()).
  63. map(_F, {nil, nil, nil, nil}, MThree) -> MThree;
  64. map(F, {Key, Value, {nil, nil, nil, nil}, B}, MThree) -> MT = insert(Key, F(Key, Value), MThree),
  65. map(F, B, MT);
  66. map(F, {Key, Value, S, _}, MThree) -> MT = insert(Key, F(Key, Value), MThree),
  67. map(F, S, MT).
  68.  
  69.  
  70. % Функция erase (удаление)
  71. erase(Key, Three) -> filter(fun(K, _) when Key == K -> false;
  72. (_, _) -> true end, Three).
  73.  
  74.  
  75. % Функция find (поиск)
  76. find(_Key, {nil, nil, nil, nil}) -> error;
  77. find(Key, {Key, V, _, _}) -> {ok, V};
  78. find(Key, {K, _, S, _}) when Key < K -> find(Key, S);
  79. find(Key, {K, _, _, B}) when Key > K -> find(Key, B).
  80.  
  81.  
  82. % Функция store (восстановление)
  83. store(Key, Value, Three) -> insert(Key, Value, Three).
  84.  
  85.  
  86. % Функция size (размер АМ)
  87. size({nil, nil, nil, nil}) -> 0;
  88. size(Three) -> size(Three, 0).
  89. size({nil, nil, nil, nil}, Acc) -> Acc;
  90. size({_, _, {nil, nil, nil, nil}, B}, Acc) -> size(B, Acc+1);
  91. size({_, _, S, _}, Acc) -> size(S, Acc+1).
  92.  
  93.  
  94. % Функция is_key() (проверка элемента)
  95. is_key(_Key, {nil, nil, nil, nil}) -> false;
  96. is_key(Key, {Key, _, _, _}) -> true;
  97. is_key(Key, {K, _, S, _}) when Key < K ->   is_key(Key, S);
  98. is_key(Key, {K, _, _, B}) when Key > K ->   is_key(Key, B).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement