# $Id: wordfreq.pliant,v 1.1 2002/03/18 14:07:00 dada Exp $
# http://dada.perl.it/shootout/
module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/pipe.pli"
function heapsort n ra
arg Int n ; arg_rw Array:Str ra
var Str rra
var Int i
var Int j
var Int l := (n\2) + 1
var Int ir := n
part heapsort_loop
if l>1
l := l - 1
rra := ra:l
else
rra := ra:ir
ra:ir := ra:1
ir := ir - 1
if ir=1
ra:1 := rra
leave heapsort_loop
i := l
j := l*2
while j<=ir
if j<ir and ra:j > ra:(j+1)
j := j + 1
if rra > ra:j
ra:i := ra:j
i := j
j := j + i
else
j := ir + 1
ra:i := rra
restart heapsort_loop
gvar Stream stdin
gvar Str line := ""
gvar Str l
gvar Str word
gvar Address Buf
gvar Int ReadCount
gvar CBool ok
gvar Int ReadSize := 4096
gvar Int eolpos
gvar Int i
gvar Int nl := 0
gvar Int nw := 0
gvar Int nc := 0
gvar Char ch
gvar Int j
gvar Array:Str lines
gvar (Dictionary Str Int) count
gvar Pointer:Int v
gvar Str k
stdin open "handle:0" in
while not stdin:atend
line := stdin readline
i := 0
while i<line:len
ch := line:i
if ch>="a" and ch<="z" or ch>="A" and ch<="Z"
j := i+1
part find_word
if j<line:len
ch := line:j
if ch>="a" and ch<="z" or ch>="A" and ch<="Z"
j += 1
restart find_word
word := lower (line i j-i)
if (count exists word)
count:word += 1
else
count insert word 1
i += j-i
else
i += 1
lines += ""
v :> count first
k := count key v
while addressof:v<>null
if addressof:(count first k)<>null
l := (string count:k)
l := (repeat 7-l:len " ")+l
line := l+"[tab]"+k+"[lf]"
lines += line
# console k "=" count:k eol
v :> count next v
if addressof:v<>null
k := count key v
heapsort lines:size-1 lines
for i 0 lines:size-1
console lines:i