 USING: unicode.syntax.backend kernel sequences assocs io.files
 io.encodings ascii math.ranges io splitting math.parser 
 namespaces byte-arrays locals math sets io.encodings.ascii
-words compiler.units ;
+words compiler.units arrays interval-maps ;
 IN: unicode.script
 
 <PRIVATE
-VALUE: char>num-table
-VALUE: num>name-table
+VALUE: script-table
+SYMBOL: interned
 
 : parse-script ( stream -- assoc )
     ! assoc is code point/range => name

        ";" split1 [ [ blank? ] trim ] bi@
    ] H{ } map>assoc ;

: set-if ( value var -- )
    dup 500000 < [ set ] [ 2drop ] if ;

: expand-ranges ( assoc -- char-assoc )
    ! char-assoc is code point => name
    [ [
        CHAR: . pick member? [
            swap ".." split1 [ hex> ] bi@ [a,b]
            [ set-if ] with each
        ] [ swap hex> set-if ] if
    ] assoc-each ] H{ } make-assoc ;

: hash>byte-array ( hash -- byte-array )
    [ keys supremum 1+ <byte-array> dup ] keep
    [ -rot set-nth ] with assoc-each ;

: make-char>num ( assoc -- char>num-table )
    expand-ranges
    [ num>name-table index ] assoc-map
    hash>byte-array ;

: >symbols ( strings -- symbols )
    [

    ] with-compilation-unit ;

: process-script ( ranges -- )
    dup values prune >symbols interned [
        expand-ranges \ script-table set-value
    ] with-variable ;

: load-script ( -- )
    "resource:extra/unicode/script/Scripts.txt"
