from __pyjamas__ import JS, INT

class Set:
    def __init__(self, data=None):
        JS("""
        @{{self}}.__object = {};
        @{{self}}.update(@{{data}});
        """)

    def add(self, value):
        JS("""    @{{self}}.__object[pyjslib.hash(@{{value}})] = @{{value}};""")

    def clear(self):
        JS("""    @{{self}}.__object = {};""")

    def __contains__(self, value):
        JS("""    return (@{{self}}.__object[pyjslib.hash(@{{value}})]) ? true : false;""")

    def discard(self, value):
        JS("""    delete @{{self}}.__object[pyjslib.hash(@{{value}})];""")

    def issubset(self, items):
        JS("""
        for (var i in @{{self}}.__object) {
            if (!@{{items}}.__contains__(i)) return false;
            }
        return true;
        """)

    def issuperset(self, items):
        JS("""
        for (var i in @{{items}}) {
            if (!@{{self}}.__contains__(i)) return false;
            }
        return true;
        """)

    def __iter__(self):
        JS("""
        var items=new pyjslib.list();
        for (var key in @{{self}}.__object) items.append(@{{self}}.__object[key]);
        return items.__iter__();
        """)

    def __len__(self):
        size=0
        JS("""
        for (var i in @{{self}}.__object) @{{size}}++;
        """)
        return INT(size)

    def pop(self):
        JS("""
        for (var key in @{{self}}.__object) {
            var value = @{{self}}.__object[key];
            delete @{{self}}.__object[key];
            return value;
            }
        """)

    def remove(self, value):
        self.discard(value)

    def update(self, data):
        JS("""
        if (pyjslib.isArray(@{{data}})) {
            for (var i in @{{data}}) {
                @{{self}}.__object[pyjslib.hash(@{{data}}[i])]=@{{data}}[i];
            }
        }
        else if (pyjslib.isIteratable(@{{data}})) {
            var iter=@{{data}}.__iter__();
            var i=0;
            try {
                while (true) {
                    var item=iter.next();
                    @{{self}}.__object[pyjslib.hash(item)]=item;
                }
            }
            catch (e) {
                if (e != pyjslib.StopIteration) throw e;
            }
        }
        """)
