Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. -module(resources).
  2.  
  3. -export([new/0, new/1, allocate/2, free/3, free_owner/2]).
  4.  
  5. -record(resources, {free = [], allocated = dict:new()}).
  6.  
  7. new() -> #resources{}.
  8. new(Resources) -> #resources{free = Resources}.
  9.  
  10. allocate(_Owner, #resources{free = []}) ->
  11. error;
  12. allocate(Owner, #resources{free = [R|F], allocated = A}) ->
  13. {ok, R, #resources{free = F, allocated = dict:append(Owner, R, A)}}.
  14.  
  15. free(Owner, R, #resources{free = F, allocated = A}) ->
  16. case dict:find(Owner, A) of
  17. error -> error;
  18. {ok, OwnerRs} ->
  19. case exclude(R, OwnerRs) of
  20. error -> error;
  21. {ok, []} ->
  22. NewA = dict:erase(Owner, A),
  23. {ok, #resources{free = [R|F], allocated = NewA}};
  24. {ok, NewOwnerRs} ->
  25. NewA = dict:store(Owner, NewOwnerRs, A),
  26. {ok, #resources{free = [R|F], allocated = NewA}}
  27. end
  28. end.
  29.  
  30. free_owner(Owner, #resources{free = F, allocated = A}) ->
  31. case dict:find(Owner, A) of
  32. error -> error;
  33. {ok, OwnerRs} ->
  34. NewA = dict:erase(Owner, A),
  35. {ok, #resources{free = OwnerRs ++ F, allocated = NewA}}
  36. end.
  37.  
  38. exclude(E, L) ->
  39. case lists:member(E, L) of
  40. false -> error;
  41. true -> {ok, lists:delete(E, L)}
  42. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement