aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-08-14 09:38:30 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commit90fafe906e99311bacca56ebb444bf99ea3f7804 (patch)
tree9722a1e2cd626697caee799c873086f37ccd7bd4
parentdocument and spec Type member fields (diff)
downloadalive-90fafe906e99311bacca56ebb444bf99ea3f7804.tar.gz
alive-90fafe906e99311bacca56ebb444bf99ea3f7804.zip
separate Module and IO code
-rw-r--r--alv/copilot/base.moon10
-rw-r--r--alv/copilot/fltk.moon4
-rw-r--r--alv/module.moon101
-rw-r--r--spec/test_setup.moon10
4 files changed, 82 insertions, 43 deletions
diff --git a/alv/copilot/base.moon b/alv/copilot/base.moon
index fcd1ff4..40600cb 100644
--- a/alv/copilot/base.moon
+++ b/alv/copilot/base.moon
@@ -4,7 +4,7 @@
-- @classmod Copilot
lfs = require 'lfs'
import Scope from require 'alv.scope'
-import Module from require 'alv.module'
+import FSModule from require 'alv.module'
import Error from require 'alv.error'
import RTNode from require 'alv.rtnode'
import Constant from require 'alv.result'
@@ -33,8 +33,8 @@ class Copilot
--- create a new Copilot.
-- @classmethod
- -- @tparam string file name/path of the alive file to watch and execute
- new: (@args) =>
+ -- @tparam table args
+ new: (@args={}) =>
@T = 0
@last_modification = 0
@last_modules = {}
@@ -62,7 +62,7 @@ class Copilot
@active_modules = nil
@last_modules.__root = nil
- @last_modules.__root = Module file
+ @last_modules.__root = FSModule file
@active_module = @last_modules.__root
COPILOT = nil
@@ -84,7 +84,7 @@ class Copilot
else
last = @active_module
prefix = if b = last.file\match'(.*)/[^/]*$' then b .. '/' else ''
- mod = @last_modules[name] or Module "#{prefix}#{name}.alv"
+ mod = @last_modules[name] or FSModule "#{prefix}#{name}.alv"
L\trace "entering module #{mod}"
@modules[name] = mod
@active_module = mod
diff --git a/alv/copilot/fltk.moon b/alv/copilot/fltk.moon
index 7664f0c..a4e3d08 100644
--- a/alv/copilot/fltk.moon
+++ b/alv/copilot/fltk.moon
@@ -86,9 +86,9 @@ visit #{version.web} for more information."
@status.value = if not @active_module
"no script"
elseif @paused
- "paused | #{@active_module\basename!}"
+ "paused | #{@active_module\name!}"
else
- "running | #{@active_module\basename!}"
+ "running | #{@active_module\name!}"
@window\redraw!
eval: (dirty) =>
diff --git a/alv/module.moon b/alv/module.moon
index d530712..b10b0f9 100644
--- a/alv/module.moon
+++ b/alv/module.moon
@@ -1,41 +1,36 @@
----
-- Per-file execution context.
--
--- @classmod Module
+-- @module module
import Registry from require 'alv.registry'
import Error from require 'alv.error'
import Scope from require 'alv.scope'
import program from require 'alv.parsing'
builtins = require 'alv.builtins'
-slurp = (file) ->
- file = assert (io.open file, 'r'), Error 'io', "couldn't open '#{file}'"
- with file\read '*all'
- file\close!
-
-spit = (file, str) ->
- file = io.open file, 'w'
- file\write str
- file\close!
-
+--- Base class for Modules.
+-- @type Module
class Module
---- static functions
--- @section static
-
--- create a new Module.
-- @classmethod
- new: (@file) =>
+ new: =>
@registry = Registry!
---- members
--- @section members
+ --- check when the module source has last changed.
+ -- @function poll
+ -- @treturn number timestamp of last change
- --- check whether file was changed.
- -- @treturn bool whether the file was changed since the last call
- poll: =>
- { :mode, :modification } = (lfs.attributes @file) or {}
- assert mode == 'file', Error 'io', "not a file: '#{@file}'"
- modification
+ --- get the module basename.
+ -- @function name
+ -- @treturn string
+
+ --- get the module contents.
+ -- @function slurp
+ -- @treturn string
+
+ --- update the module contents.
+ -- @function spit
+ -- @tparam string str the updated contents
--- start an evaluation cycle.
--
@@ -43,7 +38,7 @@ class Module
-- Otherwise, register the module with the `Copilot`. Updates `root`.
eval: =>
@registry\begin_eval!
- @ast = Error.wrap "parsing '#{@file}'", -> program\match slurp @file
+ @ast = Error.wrap "parsing '#{@file}'", -> program\match @slurp!
assert @ast, Error 'syntax', "failed to parse"
scope = Scope builtins
@@ -56,17 +51,14 @@ class Module
finish: =>
tags_changed = @registry\end_eval!
if tags_changed
- spit @file, @ast\stringify!
+ @spit @ast\stringify!
--- destroy this module.
destroy: =>
@registry\destroy!
- --- get the module basename.
- -- @treturn string
- basename: => @file\match '([^/\\]+)$'
-
- __tostring: => "<Module #{@basename!}>"
+ __tostring: => "<#{@@__name} #{@name!}>"
+ __inherited: (cls) => cls.__base.__tostring = @__tostring
--- the last updated AST tree for this module.
-- @tfield ?AST ast
@@ -74,6 +66,55 @@ class Module
--- the runtime graph root of this module.
-- @tfield ?RTNode root
+--- Module type for modules loaded from the filesystem.
+-- @type FSModule
+class FSModule extends Module
+ --- create a new FSModule.
+ -- @classmethod
+ -- @tparam string file filepath
+ new: (@file) =>
+ super!
+
+ slurp: =>
+ file = assert (io.open @file, 'r'), Error 'io', "couldn't open '#{@file}'"
+ with file\read '*all'
+ file\close!
+
+ spit: (str) =>
+ file = io.open @file, 'w'
+ file\write str
+ file\close!
+
+ poll: =>
+ { :mode, :modification } = (lfs.attributes @file) or {}
+ assert mode == 'file', Error 'io', "not a file: '#{@file}'"
+ modification
+
+ name: => @file\match '([^/\\]+)$'
+
+--- Module type for modules loaded from RAM.
+-- @type StringModule
+class StringModule extends Module
+ --- create a new StringModule.
+ -- @classmethod
+ -- @tparam string name_ module name
+ -- @tparam string source module source code
+ new: (@name_, @source) =>
+ super!
+ @updated = os.time!
+
+ slurp: => @source
+
+ spit: (str) =>
+ @source = str
+ @updated = os.time!
+
+ poll: => @updated
+
+ name: => @name_
+
{
:Module
+ :FSModule
+ :StringModule
}
diff --git a/spec/test_setup.moon b/spec/test_setup.moon
index a402af4..92bb61e 100644
--- a/spec/test_setup.moon
+++ b/spec/test_setup.moon
@@ -4,10 +4,8 @@ import Module from require 'alv.module'
import Logger from require 'alv.logger'
Logger\init 'silent'
-class TestModule extends Module
-
-class TestCopilot extends Copilot
- new: =>
+class TestPilot extends Copilot
+ new: (code) =>
@T = 0
@active_module = Module!
@@ -21,10 +19,10 @@ class TestCopilot extends Copilot
export COPILOT
{
- :TestCopilot
+ :TestPilot
do_setup: ->
- COPILOT = TestCopilot!
+ COPILOT = TestPilot!
COPILOT\begin_eval!
do_teardown: ->