
Nathan Hüsken
Also your interface seems very unsafe to me. I suggest the following interface instead:
shrinking :: (Monad m) => [Wire e m a b] -> Wire e m a [b]
Then normally 'a' could be something like Map K A.
That would mean, the individual wires have to know there own id?!? Mmmh, I will try to keep this bookkeeping out of the wires with this interface:
shrinking :: (Monad m) => [Wire e m a b] -> Wire e m (Map Int a) (Int,b)
shrinking will assign the ids to the wires and returns them with the result. I will see where this gets me ... :).
The problem with such an interface is the inflexibility. Notice that removing a subwire will change the numbering of all subsequent wires. The interface I suggested follows this basic idea: shrinking :: (Monad m) => [(a' -> a, Wire e m a b)] -> Wire e m a' b The reasoning is that this way you disconnect the individual values from the positions in the subwire list. This will also make writing the combinator a bit simpler. If you will here is an interesting alternative: data Subwire e m a b = forall a'. Subwire (a -> a') (Wire e m a' b) shrinking :: (Monad m) => [Subwire e m a b] -> Wire e m a b It doesn't buy you much except for some minor additional type safety, the cleaner type signature and the opportunity to use a crazy type system extension. =) By the way, you can find this style all throughout the Netwire library. See for example 'context' and 'require'. You may also find that the various context combinators from Control.Wire.Trans.Combine could fit your need, although they do not multicast. Final note: I renamed your 'manager' combinator to 'shrinking' to save you from future name clashes, because I have planned to write a more general manager combinator. Greets, Ertugrul -- Not to be or to be and (not to be or to be and (not to be or to be and (not to be or to be and ... that is the list monad.