docs: function WidgetList(reducible, creation, destruction) {
      var hash = {}
  
      var list = expand(reducible, function (input) {
          var widget = hash[input.id]
          if (!widget && input.eventType === "add") {
              widget = creation.apply(this, arguments)
              hash[input.id] = widget
              return widget
          } else if (widget && input.eventType === "remove") {
              delete hash[input.id]
              destruction(widget, input)
          }
      })
  
      list.__getWidgets__ = widgets
  
      return list
  
      function widgets() {
          return Object.keys(hash).map(function (key) {
              return [hash[key], key]
          })
      }
  }