aboutsummaryrefslogtreecommitdiff
path: root/examples/list-unpack.pd_lua
diff options
context:
space:
mode:
Diffstat (limited to 'examples/list-unpack.pd_lua')
-rw-r--r--examples/list-unpack.pd_lua57
1 files changed, 57 insertions, 0 deletions
diff --git a/examples/list-unpack.pd_lua b/examples/list-unpack.pd_lua
new file mode 100644
index 0000000..08b635c
--- /dev/null
+++ b/examples/list-unpack.pd_lua
@@ -0,0 +1,57 @@
+--[[
+
+list-unpack
+ Like [unpack] for any kind of type. Argument specifies number of outlets.
+ pointers untested rsp. not supported.
+ --Written by Frank Barknecht
+ --Fixed for pdlua-0.2svn by Clahde Heiland-Allen
+--]]
+
+-- Some footils --
+
+-- outlet selectors
+local selectors = {"float", "list", "symbol", "bang", "pointer"}
+
+-- check if item x is in table t:
+local function contains(t, x)
+ for _,v in ipairs(t) do
+ if v == x then return true end
+ end
+ return false
+end
+
+-- Pd class
+
+local ListUnpack = pd.Class:new():register("list-unpack")
+
+function ListUnpack:initialize(name, atoms)
+ self.inlets = 1
+ if atoms[1] == nil then
+ self.outlets = 1
+ return true
+ elseif type(atoms[1]) == "number" and atoms[1] >= 0 then
+ self.outlets = math.max(atoms[1], 1)
+ return true
+ else
+ pd.post("list-unpack: First arg must be a positive float or empty")
+ return false
+ end
+end
+
+function ListUnpack:Outlet(num, atom)
+ -- a better outlet: automatically selects selector
+ -- map lua types to pd selectors
+ local selectormap = {string = "symbol", number="float", userdata="pointer"}
+ self:outlet(num, selectormap[type(atom)], {atom})
+end
+
+function ListUnpack:in_1(sel, atoms)
+ if not contains(selectors, sel) then
+ -- also unpack selector of anythings
+ table.insert(atoms, 1, sel)
+ end
+ local size = math.min(self.outlets, table.getn(atoms))
+ for i=size, 1, -1 do
+ self:Outlet(i, atoms[i])
+ end
+end