% ---------------------------------------------------------------------------- % % wordfreq.m % Ralph Becket <rbeck@microsoft.com> % Tue Jan 9 15:56:12 GMT 2001 % vim: ts=4 sw=4 et tw=0 wm=0 ff=unix % % ---------------------------------------------------------------------------- % :- module mytest. :- interface. :- import_module io. :- pred main(io__state, io__state). :- mode main(di, uo) is det. :- implementation. :- import_module string, int, list, require, std_util, char, map. main --> count_word_freqs(map__init, FreqMap), { X = list__sort(list__map(func(K-V) = V-K, map__to_assoc_list(FreqMap))) }, { Y = list__reverse(X) }, io__write_list(Y, "\n", write_freq_word), io__nl. :- pred count_word_freqs(map(string,int),map(string,int),io__state,io__state). :- mode count_word_freqs(in, out, di, uo) is det. count_word_freqs(FreqMap0, FreqMap) --> io__read_line_as_string(Result), ( { Result = ok(Line) }, { Words = string__words(isnt(char__is_alpha),string__to_lower(Line)) }, { Update = ( func(S, FM) = ( if map__search(FM, S, N) then FM ^ elem(S) := N + 1 else FM ^ elem(S) := 1 ) ) }, { FreqMap1 = list__foldl(Update, Words, FreqMap0) }, count_word_freqs(FreqMap1, FreqMap) ; { Result = eof }, { FreqMap = FreqMap0 } ; { Result = error(ErrNo) }, { error(io__error_message(ErrNo)) } ). :- pred write_freq_word(pair(int, string), io__state, io__state). :- mode write_freq_word(in, di, uo) is det. write_freq_word(Freq - Word) --> io__format("%7d\t%s", [i(Freq), s(Word)]).