<p>Given a string s represents the serialization of a nested list, implement a parser to deserialize it and return <em>the deserialized</em> <code>NestedInteger</code>.</p>

<p>Each element is either an integer or a list whose elements may also be integers or other lists.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;324&quot;
<strong>Output:</strong> 324
<strong>Explanation:</strong> You should return a NestedInteger object which contains a single integer 324.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;[123,[456,[789]]]&quot;
<strong>Output:</strong> [123,[456,[789]]]
<strong>Explanation:</strong> Return a NestedInteger object containing a nested list with 2 elements:
1. An integer containing value 123.
2. A nested list containing two elements:
    i.  An integer containing value 456.
    ii. A nested list with one element:
         a. An integer containing value 789
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 5 * 10<sup>4</sup></code></li>
	<li><code>s</code> consists of digits, square brackets <code>&quot;[]&quot;</code>, negative sign <code>&#39;-&#39;</code>, and commas <code>&#39;,&#39;</code>.</li>
	<li><code>s</code> is the serialization of valid <code>NestedInteger</code>.</li>
	<li>All the values in the input are in the range <code>[-10<sup>6</sup>, 10<sup>6</sup>]</code>.</li>
</ul>

# """
# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
# """
#class NestedInteger:
#    def __init__(self, value=None):
#        """
#        If value is not specified, initializes an empty list.
#        Otherwise initializes a single integer equal to value.
#        """
#
#    def isInteger(self):
#        """
#        @return True if this NestedInteger holds a single integer, rather than a nested list.
#        :rtype bool
#        """
#
#    def add(self, elem):
#        """
#        Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
#        :rtype void
#        """
#
#    def setInteger(self, value):
#        """
#        Set this NestedInteger to hold a single integer equal to value.
#        :rtype void
#        """
#
#    def getInteger(self):
#        """
#        @return the single integer that this NestedInteger holds, if it holds a single integer
#        Return None if this NestedInteger holds a nested list
#        :rtype int
#        """
#
#    def getList(self):
#        """
#        @return the nested list that this NestedInteger holds, if it holds a nested list
#        Return None if this NestedInteger holds a single integer
#        :rtype List[NestedInteger]
#        """

class Solution:

    def parse_expr(self) -> NestedInteger:
        if self.next() == '[':
            return self.parse_list()
        else:
            return self.parse_integer()

    def parse_integer(self) -> NestedInteger:
        
        # go as far as you can with only string.ascii_digit

        acc = ""

        while self.is_next() and self.next() in self.num_digits:
            acc += self.next()
            self.pop()

        val = int(acc)

        return NestedInteger(val)

    def parse_list(self) -> NestedInteger:
        # the next char should be [
        self.pop()

        exprs = []
        
        if self.next() == ']':
            self.pop()
            return NestedInteger()

        exprs.append(self.parse_expr())    
        

        while self.next() == ',':
            # pop the ,
            self.pop()
            # parse the expr
            exprs.append(self.parse_expr())

        # the next char should be ]
        # pop it

        self.pop()

        # make a NestedInteger object

        o = NestedInteger()

        for e in exprs:
            o.add(e)

        return o


    def pop(self):
        self.i += 1

    def next(self):

        print(self.i)

        return self.s[self.i]

    def is_next(self):
        return self.i < len(self.s)

    def deserialize(self, s: str) -> NestedInteger:
        
        self.s = list(s)

        self.i = 0

        self.num_digits = "1234567890-"

        return self.parse_expr()










19500