Initial PromptLayer implementation
parent
95d2c02d45
commit
380295c94d
@ -0,0 +1,101 @@
|
||||
--[[
|
||||
/*
|
||||
* IMPORTS
|
||||
*/
|
||||
--]]
|
||||
|
||||
local classes = require('libmodal/src/classes')
|
||||
|
||||
--[[
|
||||
/*
|
||||
* MODULE
|
||||
*/
|
||||
--]]
|
||||
|
||||
local PromptLayer = {['TYPE'] = 'libmodal-prompt-layer'}
|
||||
|
||||
--[[
|
||||
/*
|
||||
* META `PromptLayer`
|
||||
*/
|
||||
--]]
|
||||
|
||||
local _metaPromptLayer = classes.new(PromptLayer.TYPE)
|
||||
|
||||
-------------------------------
|
||||
--[[ SUMMARY:
|
||||
* Enter the `PromptLayer`, replacing any conflicting executes.
|
||||
]]
|
||||
-------------------------------
|
||||
function _metaPromptLayer:enter()
|
||||
-- Create aliases.
|
||||
local layerPrompt = self._prompt
|
||||
local layerInstruction = self._instruction
|
||||
|
||||
-- Create a new `priorInstruction`.
|
||||
local priorInstruction = nil
|
||||
|
||||
if self._isTable then -- the layer is a table
|
||||
local promptInstruction = prompt._instruction
|
||||
priorInstruction = {}
|
||||
|
||||
for command, execute in pairs(layerInstruction) do
|
||||
priorInstruction[command] = promptInstruction[command]
|
||||
promptInstruction[command] = execute
|
||||
end
|
||||
else -- the layer is a function
|
||||
priorInstruction = layerPrompt._instruction
|
||||
prompt._instruction = layerInstruction
|
||||
end
|
||||
|
||||
self._priorInstruction = priorInstruction
|
||||
end
|
||||
|
||||
-------------------------------
|
||||
--[[ SUMMARY:
|
||||
* Exit the `PromptLayer`, and restore any overwritten executes.
|
||||
]]
|
||||
-------------------------------
|
||||
function _metaPromptLayer:exit()
|
||||
if self._isTable then
|
||||
local promptInstruction = self._prompt._instruction
|
||||
|
||||
for command, execute in pairs(self._priorInstruction) do
|
||||
promptInstruction[command] = execute
|
||||
end
|
||||
else
|
||||
self._prompt._instruction = self._priorInstruction
|
||||
end
|
||||
|
||||
self._priorInstruction = nil
|
||||
end
|
||||
|
||||
--[[
|
||||
/*
|
||||
* CLASS `PromptLayer`
|
||||
*/
|
||||
--]]
|
||||
|
||||
-----------------------------------------
|
||||
--[[ SUMMARY:
|
||||
* Create a new `PromptLayer`.
|
||||
]]
|
||||
-----------------------------------------
|
||||
function PromptLayer.new(prompt, instruction)
|
||||
if classes.type(prompt) == require('libmodal/src/Prompt').TYPE
|
||||
and type(prompt._instruction) == type(instruction)
|
||||
then
|
||||
return setmetatable(
|
||||
{
|
||||
['_isTable'] = type(instruction) == require('libmodal/src/globals').TYPE_TBL,
|
||||
['_instruction'] = instruction,
|
||||
['_prompt'] = prompt
|
||||
}, _metaPromptLayer
|
||||
)
|
||||
else
|
||||
error('Either `prompt` is not a `Prompt`, '
|
||||
.. 'or `instruction` is not the same type '
|
||||
.. 'as it was when `prompt` was created.'
|
||||
)
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue