from dataclasses import dataclass

@dataclass(frozen=True)
class Order:
    order_id: int
    amount: int
    refund: int = 0

    def net(self):
        if not 0 <= self.refund <= self.amount:
            raise ValueError('invalid refund')
        return self.amount-self.refund

def net_values(orders):
    for order in orders:
        yield order.net()

def main():
    orders=[Order(1,100),Order(2,80,20),Order(3,50,50)]
    stream=net_values(orders)
    total=sum(stream)
    assert total==160 and list(stream)==[]
    values=list(net_values(orders))
    assert values==[100,60,0]
    print('values',values,'total',total,'exhausted',list(stream))

if __name__=='__main__':
    main()
