USING: combinators io io.encodings.binary io.files kernel math ranges sbufs sequences strings ; IN: ulz : copy-forward ( sbuf to from -- ) [a..b) dupd -rot '[ _ nth _ push ] each ; : cpy-start ( decoder offset -- i ) neg swap length + ; : (cpy) ( sbuf length offset -- ) swap [ dup ] [ cpy-start ] [ over + ] tri* copy-forward ; : lit ( sbuf op -- sbuf ) 1 + over '[ read1 _ push ] times ; : cpy ( sbuf op -- sbuf ) dupd 63 192 [ bitand ] bi-curry@ bi 0xc0 = [ 8 shift read1 bitor ] when 4 + read1 1 + (cpy) ; : interpret ( sbuf -- sbuf ) read1 [ dup 63 bitand 0 = [ lit ] [ cpy ] if interpret ] when* ; recursive : decode ( file -- string ) binary [ 0 interpret ] with-input-stream >string ;