32 lines
1.3 KiB
Erlang
32 lines
1.3 KiB
Erlang
-module( function_frequency ).
|
|
|
|
-export( [erlang_source/1, task/0] ).
|
|
|
|
erlang_source( File ) ->
|
|
{ok, IO} = file:open( File, [read] ),
|
|
Forms = parse_all( IO, io:parse_erl_form(IO, ''), [] ),
|
|
Functions = lists:flatten( [erl_syntax_lib:fold(fun accumulate_functions/2, [], X) || X <- Forms] ),
|
|
dict:to_list( lists:foldl(fun count/2, dict:new(), Functions) ).
|
|
|
|
task() ->
|
|
Function_frequencies = erlang_source( "function_frequency.erl" ),
|
|
{Top_tens, _Rest} = lists:split( 10, lists:reverse(lists:keysort(2, Function_frequencies)) ),
|
|
[io:fwrite("Function ~p called ~p times.~n", [X, Y]) || {X, Y} <- Top_tens].
|
|
|
|
|
|
|
|
accumulate_functions( Tree, Acc ) -> accumulate_functions( erlang:element(1, Tree), Tree, Acc ).
|
|
|
|
accumulate_functions( call, Tree, Acc ) -> [accumulate_functions_name(Tree) | Acc];
|
|
accumulate_functions( _Other, _Tree, Acc ) -> Acc.
|
|
|
|
accumulate_functions_name( Tree ) -> accumulate_functions_name_scoop( erlang:element(3, Tree) ).
|
|
|
|
accumulate_functions_name_scoop( {atom, _Line, Name} ) -> Name;
|
|
accumulate_functions_name_scoop( {remote, _Line, {atom, _Line, Module}, {atom, _Line, Name}} ) -> {Module, Name}.
|
|
|
|
count( Key, Dict ) -> dict:update_counter( Key, 1, Dict ).
|
|
|
|
parse_all( _IO, {eof, _End}, Acc ) -> Acc;
|
|
parse_all( IO, {ok, Tokens, Location}, Acc ) -> parse_all( IO, io:parse_erl_form(IO, '', Location), [Tokens | Acc] ).
|