 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.c-types alien.data alien.syntax byte-vectors
-combinators kernel math math.functions sequences system
-accessors libc ;
+USING: accessors alien alien.c-types alien.data alien.syntax
+byte-arrays byte-vectors combinators continuations destructors
+fry kernel libc math math.functions math.ranges sequences system ;
 QUALIFIED: compression.zlib.ffi
 IN: compression.zlib
 

        ] 2keep drop ulong deref >>length B{ } like
    ] keep length <compressed> ;

: uncompress ( compressed -- byte-array )
    [
        length>> [ <byte-vector> dup underlying>> ] keep
        ulong <ref>

        data>> dup length pick
        [ compression.zlib.ffi:uncompress zlib-error ] dip
    ] bi ulong deref >>length B{ } like ;

: (uncompress) ( length byte-array -- byte-array )
    [
        [ drop [ malloc &free ] [ ulong <ref> ] bi ]
        [ nip dup length ] 2bi
        [ compression.zlib.ffi:uncompress zlib-error ] 4keep
        2drop ulong deref memory>byte-array
    ] with-destructors ;

M: byte-array uncompress ( byte-array -- byte-array )
    [ length 5 [0,b) [ 2^ * ] with map ] keep
    '[ _ (uncompress) ] attempt-all ;
