diff --git a/CHANGELOG.md b/CHANGELOG.md index 70d7141..db933ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- A `log()` iterator. - A `mix()` iterator. - A CAS-register generator. diff --git a/molly/gen.lua b/molly/gen.lua index 943ec8d..c14fa7b 100644 --- a/molly/gen.lua +++ b/molly/gen.lua @@ -38,6 +38,7 @@ local fun = require('fun') local clock = require('molly.clock') +local log = require('molly.log') local tbl = require('molly.compat.tbl') local fun_mt = debug.getmetatable(fun.range(10)) @@ -456,15 +457,29 @@ methods.flip_flop = flip_flop --- Special generators -- @section ---- (TODO) A generator which, when asked for an operation, logs a message and yields --- nil. Occurs only once; use `repeat` to repeat. +--- A generator which, when asked for an operation, logs +-- a message and yields `nil`. Occurs only once; use `repeat` to +-- repeat. -- @return an iterator -- +-- @usage +-- > molly.gen.iter({1, 2, 3}):log():totable() +-- 1 +-- --- +-- - - 2 +-- - 3 +-- ... +-- -- -- @function log -local log = function() - -- TODO +local log_it = function(it) + assert(tostring(it) == '') + local gen, param, state = unwrap(it) + local state1, v = gen(param, state) + log.info(v) + return fun.wrap(gen, param, state1) end -exports.log = log +exports.log = log_it +methods.log = log_it --- (TODO) Operations from that generator are scheduled at uniformly random intervals -- between `0` to `2 * (dt seconds)`. diff --git a/test/tests.lua b/test/tests.lua index 582b08f..795e787 100644 --- a/test/tests.lua +++ b/test/tests.lua @@ -27,7 +27,7 @@ local utils = molly.utils local seed = os.time() math.randomseed(seed) -test:plan(11) +test:plan(12) test:test('clock', function(test) test:plan(5) @@ -199,6 +199,13 @@ test:test('gen.mix', function(test) test:is(#tbl, 11) end) +test:test('gen.log', function(test) + test:plan(1) + + local tbl = molly.gen.iter({1, 2, 3}):log():totable() + test:is(#tbl, 2) +end) + test:test('runner', function(test) test:plan(4)