class_docstr: A generic wrapper for performing rolling computations.
  
  This can be wrapped around any object which implements both an `update` and a `revert` method.
  Inputs to `update` are stored in a queue. Elements of the queue are popped when the window is
  full.
  
  Parameters
  ----------
  obj
      An object that implements both an `update` method and a `rolling `method.
  window_size
      Size of the window.
  
  Examples
  --------
  
  For instance, here is how you can compute a rolling average over a window of size 3:
  
  >>> from river import stats, utils
  
  >>> X = [1, 3, 5, 7]
  >>> rmean = utils.Rolling(stats.Mean(), window_size=3)
  
  >>> for x in X:
  ...     rmean.update(x)
  ...     print(rmean.get())
  1.0
  2.0
  3.0
  5.0
code: def update(self, *args, **kwargs):
      if len(self.window) == self.window_size:
          self.obj.revert(*self.window[0][0], **self.window[0][1])
      self.obj.update(*args, **kwargs)
      self.window.append((args, kwargs))
  
imports: from __future__ import annotations
  import bisect
  import collections
  import datetime
  import typing
label_desc: Use image node_id 3 for calling the Rolling obj's underlying member method code with example usage: obj.update() without return types