function sequence_estring(sequence, estring) {
    var ret_string = ""
    var cursor = 0
    for(var u in estring) {
        u = estring[u]
        var ret_fragment = ""
        if(u < 0) {
            for(var i = 0; i < Math.abs(u); i ++) {
                ret_string += "-"
            }
        }
        else {
            ret_string += sequence.substring(cursor, cursor + u)
            cursor += u
        }
    }
    if(sequence.length != cursor) {
        document.write("<p style=\"font-family:monospace\"><strong>WARNING:</strong> sequence.length ("+sequence.length+") != sum of estring positives ("+cursor+").</p>")
    }
    return ret_string
}

function estring_product(u, v) {
    var w = []
    var uu_replacement = null
    var ui = 0
    var __total_positives_of_v = 0
    var __total_absolute_of_u = 0
    for(vi in v) {
        var vv = v[vi]
        if(vv < 0) {
            w.push(vv)
        } else if(vv > 0) {
            __total_positives_of_v += vv
            var vv_left = vv
            var uu = uu_replacement != null ? uu_replacement : u[ui]
            while(vv_left != 0) {
                if(vv_left >= Math.abs(uu)) {
                    w.push(uu)
                    vv_left -= Math.abs(uu)
                    ui++
                    uu = u[ui]
                } else {
                    if(uu > 0) {
                        w.push(vv_left)
                        uu -= vv_left
                    } else if(uu < 0) {
                        w.push(-vv_left)
                        uu += vv_left
                    }
                    vv_left = 0
                    uu_replacement = uu
                }
            }
        }
    }
    for(ui in u) {
        __total_absolute_of_u += Math.abs(u[ui])
    }
    if(__total_positives_of_v != __total_absolute_of_u) {
        document.write("<p style=\"font-family:monospace\"><strong>WARNING:</strong> total positives of right string ("+ __total_positives_of_v +") != total absolute values of left string ("+ __total_absolute_of_u +").</p>")
    }
    return estring_collapse(w)
}

function estring_collapse(u) {
    var v = []
    for(var ui in u) {
        var uu = u[ui]
        if(v[v.length-1] == undefined) {
            v.push(uu)
        } else if(signum(v[v.length-1]) == signum(uu)) {
            v[v.length-1] += uu
        } else {
            v.push(uu)
        }
    }
    return v
}

function signum(u) {
    return u < 0 ? -1.0 : u == 0 ? 0.0 : 1.0
}
                  
function p_uvw(u, v, w) {
    document.write("<p style=\"font-family:monospace\">")
    document.write("&lt" + u + "&gt * &lt" + v + "&gt = &lt" + w + "&gt")
    document.write("</p>")
}

