Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(resources).
- -export([new/0, new/1, allocate/2, free/3, free_owner/2]).
- -record(resources, {free = [], allocated = dict:new()}).
- new() -> #resources{}.
- new(Resources) -> #resources{free = Resources}.
- allocate(_Owner, #resources{free = []}) ->
- error;
- allocate(Owner, #resources{free = [R|F], allocated = A}) ->
- {ok, R, #resources{free = F, allocated = dict:append(Owner, R, A)}}.
- free(Owner, R, #resources{free = F, allocated = A}) ->
- case dict:find(Owner, A) of
- error -> error;
- {ok, OwnerRs} ->
- case exclude(R, OwnerRs) of
- error -> error;
- {ok, []} ->
- NewA = dict:erase(Owner, A),
- {ok, #resources{free = [R|F], allocated = NewA}};
- {ok, NewOwnerRs} ->
- NewA = dict:store(Owner, NewOwnerRs, A),
- {ok, #resources{free = [R|F], allocated = NewA}}
- end
- end.
- free_owner(Owner, #resources{free = F, allocated = A}) ->
- case dict:find(Owner, A) of
- error -> error;
- {ok, OwnerRs} ->
- NewA = dict:erase(Owner, A),
- {ok, #resources{free = OwnerRs ++ F, allocated = NewA}}
- end.
- exclude(E, L) ->
- case lists:member(E, L) of
- false -> error;
- true -> {ok, lists:delete(E, L)}
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement