local rs = {} rs.listenInput = function(side, onChangeCallback) local state = redstone.getInput(side) while true do os.pullEvent('redstone') local newState = redstone.getInput(side) if state ~= newState then state = newState onChangeCallback(newState) end end end rs.createBundledOutput = function(side, initialColorState) local bundledOutput = {} local _colorState = initialColorState or 0 local function getState() return _colorState end local function setState(newColorState) if newColorState == _colorState then return false end _colorState = newColorState redstone.setBundledOutput(side, newColorState) return true end bundledOutput.getStateColor = getState bundledOutput.setColorState = setState bundledOutput.test = function(color) return colors.test(getState(), color) end bundledOutput.setOn = function(color) local colorState = getState() local newColorState = colors.combine(colorState, color) return setState(newColorState) end bundledOutput.setOff = function(color) local colorState = getState() local newColorState = colors.subtract(colorState, color) return setState(newColorState) end bundledOutput.toggle = function(color) if colors.test(getState(), color) then return bundledOutput.setOff(color) end return bundledOutput.setOn(color) end return bundledOutput end return rs