seqlua

annotate seqlua_ipairs_example.lua @ 19:2fad7f50076b

Added coroutine based filter(func, ...) example to new file seqlua_ipairs_example.lua
author jbe
date Wed Aug 20 12:23:31 2014 +0200 (2014-08-20)
parents
children ed7a82f85e6f
rev   line source
jbe@19 1 require "seqlua"
jbe@19 2
jbe@19 3 t = {"a", "b", "c"}
jbe@19 4
jbe@19 5 for i, v in ipairs(t) do
jbe@19 6 print(i, v)
jbe@19 7 end
jbe@19 8 -- prints:
jbe@19 9 -- 1 a
jbe@19 10 -- 2 b
jbe@19 11 -- 3 c
jbe@19 12
jbe@19 13 function alphabet(from, to)
jbe@19 14 local letter = nil
jbe@19 15 return function()
jbe@19 16 if letter == nil then
jbe@19 17 letter = from
jbe@19 18 elseif letter == to then
jbe@19 19 return nil
jbe@19 20 else
jbe@19 21 letter = string.char(string.byte(letter) + 1)
jbe@19 22 end
jbe@19 23 return letter
jbe@19 24 end
jbe@19 25 end
jbe@19 26
jbe@19 27 f = alphabet("a", "z")
jbe@19 28
jbe@19 29 for i, v in ipairs(f) do
jbe@19 30 print(i, v)
jbe@19 31 end
jbe@19 32 -- prints:
jbe@19 33 -- 1 a
jbe@19 34 -- 2 b
jbe@19 35 -- 3 c
jbe@19 36 -- ...
jbe@19 37 -- 25 y
jbe@19 38 -- 26 z
jbe@19 39
jbe@19 40 c = setmetatable(
jbe@19 41 { iter = alphabet("a", "f") },
jbe@19 42 { __call = function(t) return t.iter() end }
jbe@19 43 )
jbe@19 44
jbe@19 45 for i, v in ipairs(c) do
jbe@19 46 print(i, v)
jbe@19 47 end
jbe@19 48 -- prints:
jbe@19 49 -- 1 a
jbe@19 50 -- 2 b
jbe@19 51 -- 3 c
jbe@19 52 -- 4 d
jbe@19 53 -- 5 e
jbe@19 54 -- 6 f
jbe@19 55
jbe@19 56 g = coroutine.wrap(function()
jbe@19 57 coroutine.yield("Alice")
jbe@19 58 coroutine.yield("Bob")
jbe@19 59 for i = 1, 3 do
jbe@19 60 coroutine.yield("Person #" .. tostring(i))
jbe@19 61 end
jbe@19 62 end)
jbe@19 63
jbe@19 64 for i, v in ipairs(g) do
jbe@19 65 print(i, v)
jbe@19 66 end
jbe@19 67 -- prints:
jbe@19 68 -- 1 Alice
jbe@19 69 -- 2 Bob
jbe@19 70 -- 3 Person #1
jbe@19 71 -- 4 Person #2
jbe@19 72 -- 5 Person #3
jbe@19 73
jbe@19 74 function filter(f, iter, iter_s, iter_i)
jbe@19 75 return coroutine.wrap(function()
jbe@19 76 for i, v in ipairs(iter, iter_s, iter_i) do f(v) end
jbe@19 77 end)
jbe@19 78 end
jbe@19 79
jbe@19 80 function filterfunc(v)
jbe@19 81 local type_v = type(v)
jbe@19 82 if type_v == "string" then
jbe@19 83 coroutine.yield(v)
jbe@19 84 elseif type_v == "number" then
jbe@19 85 for i = 1, v do
jbe@19 86 coroutine.yield(true)
jbe@19 87 end
jbe@19 88 end
jbe@19 89 end
jbe@19 90
jbe@19 91 for v in filter(filterfunc, {"a", "b", 3, "c"}) do
jbe@19 92 print(v)
jbe@19 93 end
jbe@19 94 -- prints:
jbe@19 95 -- a
jbe@19 96 -- b
jbe@19 97 -- true
jbe@19 98 -- true
jbe@19 99 -- true
jbe@19 100 -- c
jbe@19 101
jbe@19 102 set = {apple = true, banana = true}
jbe@19 103 for i, k, v in ipairs(pairs(set)) do
jbe@19 104 print(i, k, v)
jbe@19 105 end
jbe@19 106 -- prints:
jbe@19 107 -- 1 banana true
jbe@19 108 -- 2 apple true
jbe@19 109 -- (order of "apple" and "banana" may vary)
jbe@19 110

Impressum / About Us