txt: ## dist_zef-tony-o-Mux.md
  # mux
  
  use this to obtain great parallel powers. also to alleviate the headache that comes with queues and managing workers.
  
  ## Mux.new(:callable, :channels)
  
  `:callable` should be something callable. this is the method you write that is going to do all of your work for you and it should take one argument. eg. `sub ($elem) { }`
  
  `:channels` this should be the maximum level of parallelization that you'd like. defaults to `int(max_threads / 1.5)`. this will warn but not puke if you specify higher than max\_threads parallelization and be warned that if you exceed the scheduler you may find your application locked.
  
  ## .demux(callable)
  
  this sets what demuxes the return values from your workers should you so need them.
  
  ```
  my Mux $m .=new(
    :callable(sub (Int() $x) { $x * 2; }),
  );
  
  $m.demux(-> $rval {
    #rval will be 2, then 2, then 4, then 6, etc
  });
  
  $q.start: 1,1,2,3; #etc;
  
  ```
  
  ## .error(callable)
  
  this is a `sub ($error) { }` to be called when there is an unhandled error in the worker (if it's not in your sub then please open a ticket).
  
  ## .drain(callable)
  
  this is a `sub (Mux:D) { }` called when the work queue is complete.
  
  ## .pause
  
  for pausing the queue, you can still feed the muxer but don't put your fingers in its mouth.
  
  ## .paused
  
  will let you know if the muxer is paused
  
  ## .unpause
  
  let's the hedonistic muxer consume
  
  ## .unpaused
  
  lets you know whether you should keep your hands away from the cage
  
  ## .block
  
  finally, if you want to block until the muxer is done processing the queue
  
  ## .feed(\*@ )
  
  you can feed the muxer while its running, this will not reset the queue or alter current processing but it will cause `.drain` to be called later
  