From b50aca6d5c48044d53e59b2719b3ee27e853f44b Mon Sep 17 00:00:00 2001 From: Johannes Wolf Date: Sat, 23 Mar 2024 21:35:41 +0100 Subject: [PATCH] WIP --- apps/app_analyze_fn.lua | 60 +++++++++++++++++++++++++++++++++++++++++ apps/init.lua | 1 + dialog/input.lua | 22 +++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 apps/app_analyze_fn.lua diff --git a/apps/app_analyze_fn.lua b/apps/app_analyze_fn.lua new file mode 100644 index 0000000..c6b8462 --- /dev/null +++ b/apps/app_analyze_fn.lua @@ -0,0 +1,60 @@ +local apps = require 'apps.apps' +local choice = require('dialog.choice').display_sync +local ask_n = require('dialog.input').display_sync_n +local sym = require('ti.sym') +local ui = require('ui.shared') +local lexer = require 'ti.lexer' +local expr = require 'expressiontree' +local sym = require 'ti.sym' + +local function each_result(str, fn) + local tokens = lexer.tokenize(eval(str)) + local e = tokens and expr.from_infix(tokens) + if e then + if e.text == '{' or e.text == 'or' or e.text == 'and' then + for _, arg in ipairs(e:collect_operands_recursive()) do + fn(arg) + end + else + fn(e) + end + end +end + +local function run_analyze(stack) + local fn, low, high = table.unpack(ask_n(3), { title = "Analyze ..." }) + local var = "x" + + local with_str = nil + if low:len() ~= 0 then + with_str = (with_str or "|") .. low .."<" .. var + end + if high:len() ~= 0 then + with_str = (with_str or "|") .. var .."<" .. high + end + + local function get_zeros(fn, bounds) + local tab = {} + each_result(math.evalStr(string.format("zeros(%s,%s)%s", fn, var, bounds or "")), + function(z) + table.insert(tab, z) + end) + return tab + end + + local zeros = get_zeros(fn, with_str) + local r = choice({ + title = 'Results', + items = (function() + local list = {} + for i, v in ipairs(zeros) do + table.insert(list, { + title=string(v), result=i + }) + end + return list + end)() + }) +end + +apps.add('analyze', 'Analyze function', run_analyze) diff --git a/apps/init.lua b/apps/init.lua index b437631..896004c 100644 --- a/apps/init.lua +++ b/apps/init.lua @@ -3,3 +3,4 @@ require 'apps.app_trassierung' require 'apps.app_punktsteigung' require 'apps.app_triangle' require 'apps.app_constants' +require 'apps.app_analyze_fn' diff --git a/dialog/input.lua b/dialog/input.lua index 0dbf2fe..9e0672c 100644 --- a/dialog/input.lua +++ b/dialog/input.lua @@ -26,6 +26,28 @@ function t.display_sync(options, on_init) return res end +-- Display dialog (sync) +---@param options? table Dialog options +---@param on_init? init_callback Initializer +function t.display_sync_n(n, options, on_init) + local co = coroutine.running() + local dlg = t.display_n(n, options, on_init) + + local res + dlg.on_cancel = function() + res = nil + coroutine.resume(co) + end + dlg.on_done = function(text) + res = text + coroutine.resume(co) + end + + assert(co) + coroutine.yield(co) + return res +end + -- Display dialog ---@param options? table Dialog options ---@param on_init? init_callback Initializer