Mise à jour avec la traduction
http://paste.bouh.org/d64a5ecd8aa141558173b6f4575e5b6d
Et l'ouput shell :
erf j'ai pas remplacé tous mes tuples par le record, c'est moche mais bon ça marche ...
http://paste.bouh.org/d64a5ecd8aa141558173b6f4575e5b6d
-module(biblio).
-export([livre/2,biblio/0]).
-export([add_livre/2]).
-export([new/0]).
-export([test/0]).
-record(livre, {titre,texte}).
livre(Titre,Texte) -> #livre{titre=Titre,texte=Texte}.
new() -> spawn(fun() -> biblio() end).
biblio() ->
biblio([]).
add_livre(Biblio, Book) ->
Biblio ! {add_book, Book, self()},
receive Response -> Response end.
get_livre(Biblio,Titre) ->
Biblio ! {get_livre, Titre, self()},
receive Response -> Response end.
replace_all_books(Biblio,Fn) when is_function(Fn) ->
Biblio ! {replace_all_books, Fn, self()},
receive Response -> Response end.
%% Internal ------------------------
biblio(Books) ->
NewBooks =
receive
{get_livre, BookName, From} ->
Result = orddict:find(BookName,Books),
From ! Result,
orddict:erase(BookName,Books)
; {add_book, #livre=NewBook, From} ->
NewDict = orddicttore(NewBook#livre.titre, NewBook, Books),
From ! ok,
NewDict
; {replace_all_books, Fn, From} ->
ReplaceBooks =
fun(_, Book, error) -> error
;(_, Book, NewBooks) ->
case Fn(Book)
of #livre{}=NewBook -> orddicttore(NewBook#livre.titre,NewBook,NewBooks)
; _ -> error
end
end,
{Reply, NewDict} =
case orddict:fold(ReplaceBooks,orddict:new(),Books)
of error -> {error,Books}
; SomeBooks -> {ok, SomeBooks}
end,
From ! Reply,
NewDict
; _ -> Books
end,
biblio(NewBooks).
test() ->
Bibli = new(),
add_livre(Bibli,livre("Hamlet", "Once upon a time ...")),
io:format("Recup du bouquin : ~p~n",[get_livre(Bibli,"Hamlet")]),
io:format("Y a plus le bouquin : ~p~n",[get_livre(Bibli,"Hamlet")]),
add_livre(Bibli,livre("Hamlet", "Once upon a time ...")),
add_livre(Bibli,livre("Othello", "Never Ends ...")),
add_livre(Bibli,livre("Batman", "Gotham City, 1953 ...")),
Traduc = replace_all_books(Bibli, fun traduire_livre/1),
io:format("Traduction terminee ? : ~p~n",[Traduc]),
io:format("Recup de Othello : ~p~n",[get_livre(Bibli,rot13("Othello"))]),
Traduc2 = replace_all_books(Bibli, fun (_Book) -> blabla end),
io:format("Traduction a l'arrache terminee ? : ~p~n",[Traduc2]),
io:format("Traduction dans l'autre sens ~p~n",[replace_all_books(Bibli, fun traduire_livre/1)]),
io:format("Recup de Hamlet : ~p~n",[get_livre(Bibli,"Hamlet")]),
io:format("Recup de Othello : ~p~n",[get_livre(Bibli,"Othello")]),
ok.
rot13(Str) ->
F = fun© when (C >= $A andalso C =< $M); (C >= $a andalso C =< $m) -> C + 13;
© when (C >= $N andalso C =< $Z); (C >= $n andalso C =< $z) -> C - 13;
© -> C
end,
lists:map(F, Str).
traduire_livre(#livre{titre=Tl,texte=Tx}=Book) ->
Book#livre{titre=rot13(Tl),texte=rot13(Tx)}.
Et l'ouput shell :
17> c(biblio).
biblio.erl:45: Warning: variable 'Book' is unused
{ok,biblio}
18> biblio:test().
Recup du bouquin : {ok,{livre,"Hamlet","Once upon a time ..."}}
Y a plus le bouquin : error
Traduction terminee ? : ok
Recup de Othello : {ok,{livre,"Bguryyb","Arire Raqf ..."}}
Traduction a l'arrache terminee ? : error
Traduction dans l'autre sens ok
Recup de Hamlet : {ok,{livre,"Hamlet","Once upon a time ..."}}
Recup de Othello : error
ok
19>
erf j'ai pas remplacé tous mes tuples par le record, c'est moche mais bon ça marche ...