func (m *Module) Stream(s bar.Sink) {
	outputFunc := m.outputFunc.Get().(func(Info) bar.Output)
	nextOutputFunc, done := m.outputFunc.Subscribe()
	defer done()
	var linkSub *netlink.Subscription
	if m.intf == "" {
		linkSub = netlink.WithPrefix("wl")
	} else {
		linkSub = netlink.ByName(m.intf)
	}
	defer linkSub.Unsubscribe()
	info := handleUpdate(linkSub.Get())
	for {
		s.Output(outputFunc(info))
		select {
		case <-linkSub.C:
			info = handleUpdate(linkSub.Get())
		case <-nextOutputFunc:
			outputFunc = m.outputFunc.Get().(func(Info) bar.Output)
		}
	}
}
Stream starts the module.
package wlan  
import (
	"net"
	"os/exec"
	"strconv"
	"strings"
	"barista.run/bar"
	"barista.run/base/value"
	"barista.run/base/watchers/netlink"
	l "barista.run/logging"
	"barista.run/outputs"
	"github.com/martinlindhe/unit"
)
type Info struct {
	Name           string
	State          netlink.OperState
	IPs            []net.IP
	SSID           string
	AccessPointMAC string
	Channel        int
	Frequency      unit.Frequency
}
func (i Info) Connecting() bool {
	return i.State == netlink.Dormant
}
func (i Info) Connected() bool {
	return i.State == netlink.Up
}
func (i Info) Enabled() bool {
	return i.State > netlink.NotPresent
}
type Module struct {
	intf       string
	outputFunc value.Value  
}
func Named(iface string) *Module {
	m := &Module{intf: iface}
	l.Label(m, iface)
	l.Register(m, "outputFunc")
	m.Output(func(i Info) bar.Output {
		if i.Connected() {
			return outputs.Text(i.SSID)
		}
		return nil
	})
	return m
}
func Any() *Module {
	return Named("")
}
func (m *Module) Output(outputFunc func(Info) bar.Output) *Module {
	m.outputFunc.Set(outputFunc)
	return m
}