19 lines
544 B
Plaintext
19 lines
544 B
Plaintext
const MAX_LEN=250, MIN_LEN=3;
|
|
fcn compress(text){ // !empty byte/text stream -->Data (byte stream)
|
|
sink:=Data(); cnt:=Ref(0);
|
|
write:='wrap(c,n){ // helper function
|
|
while(n>MAX_LEN){
|
|
sink.write(1); sink.write(MAX_LEN); sink.write(c);
|
|
n-=MAX_LEN;
|
|
}
|
|
if(n>MIN_LEN){ sink.write(1); sink.write(n); sink.write(c); }
|
|
else { do(n) { sink.write(c); } }
|
|
};
|
|
text.reduce('wrap(a,b){
|
|
if(a==b) cnt.inc();
|
|
else{ write(a,cnt.value); cnt.set(1); }
|
|
b
|
|
},text[0]) : write(_,cnt.value);
|
|
sink;
|
|
}
|