webmcp
diff libraries/nihil/nihil.lua @ 0:9fdfb27f8e67
Version 1.0.0
author | jbe/bsw |
---|---|
date | Sun Oct 25 12:00:00 2009 +0100 (2009-10-25) |
parents | |
children | 3d43a5cf17c1 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libraries/nihil/nihil.lua Sun Oct 25 12:00:00 2009 +0100 1.3 @@ -0,0 +1,52 @@ 1.4 +#!/usr/bin/env lua 1.5 + 1.6 +local error = error 1.7 +local getmetatable = getmetatable 1.8 +local module = module 1.9 +local rawset = rawset 1.10 +local setmetatable = setmetatable 1.11 + 1.12 +module(...) 1.13 + 1.14 +metatable = { 1.15 + __tostring = function(self) 1.16 + return "nil" .. self[1] 1.17 + end, 1.18 + __newindex = function() 1.19 + error("Objects representing nil are immutable.") 1.20 + end 1.21 +} 1.22 + 1.23 +nils = setmetatable({}, { 1.24 + __mode = "v", 1.25 + __index = function(self, level) 1.26 + if level > 0 then 1.27 + local result = setmetatable({ level }, metatable) 1.28 + rawset(self, level, result) 1.29 + return result 1.30 + end 1.31 + end, 1.32 + __newindex = function() 1.33 + error("Table is immutable.") 1.34 + end 1.35 +}) 1.36 + 1.37 +function lift(value) 1.38 + if value == nil then 1.39 + return nils[1] 1.40 + elseif getmetatable(value) == metatable then 1.41 + return nils[value[1]+1] 1.42 + else 1.43 + return value 1.44 + end 1.45 +end 1.46 + 1.47 +function lower(value) 1.48 + if value == nil then 1.49 + error("Cannot lower nil.") 1.50 + elseif getmetatable(value) == metatable then 1.51 + return nils[value[1]-1] 1.52 + else 1.53 + return value 1.54 + end 1.55 +end