An equilibrium index of a sequence is an index into the sequence such that the sum of elements at lower indices is equal to the sum of elements at higher indices.



For example, in a sequence   



A


{\displaystyle A}

:

   




A

0


=
−
7


{\displaystyle A_{0}=-7}


   




A

1


=
1


{\displaystyle A_{1}=1}


   




A

2


=
5


{\displaystyle A_{2}=5}


   




A

3


=
2


{\displaystyle A_{3}=2}


   




A

4


=
−
4


{\displaystyle A_{4}=-4}


   




A

5


=
3


{\displaystyle A_{5}=3}


   




A

6


=
0


{\displaystyle A_{6}=0}


3   is an equilibrium index, because:

   




A

0


+

A

1


+

A

2


=

A

4


+

A

5


+

A

6




{\displaystyle A_{0}+A_{1}+A_{2}=A_{4}+A_{5}+A_{6}}


6   is also an equilibrium index, because:

   




A

0


+

A

1


+

A

2


+

A

3


+

A

4


+

A

5


=
0


{\displaystyle A_{0}+A_{1}+A_{2}+A_{3}+A_{4}+A_{5}=0}


(sum of zero elements is zero)

7   is not an equilibrium index, because it is not a valid index of sequence 



A


{\displaystyle A}

.



Task;
Write a function that, given a sequence, returns its equilibrium indices (if any).

Assume that the sequence may be very long.




import extensions;
import system'routines;
import system'collections;
import extensions'routines;
 
class EquilibriumEnumerator : Enumerator
{
    int        left;
    int        right;
    int        index;
    Enumerator en;
 
    constructor new(Enumerator en)
    {
        this en := en;
 
        self.reset()
    }
 
    constructor new(Enumerable list)
        <= new(list.enumerator());
 
    constructor new(o)
        <= new(cast Enumerable(o)); 
 
    bool next()
    {
        index += 1;
 
        while(en.next())
        {
            var element := en.get();            
            right -= element;
            bool found := (left == right);
            left += element;
 
            if (found)
            {
                ^ true
            };
 
            index += 1
        };
 
        ^ false
    }
 
    reset()
    {
        en.reset();
 
        left := 0;
        right := en.summarize();
        index := -1;
 
        en.reset();
    }
 
    get() = index;
 
    enumerable() => en;
}
 
public program()
{
    EquilibriumEnumerator.new(new int[]{ -7, 1, 5, 2, -4, 3, 0 })
        .forEach:printingLn
}