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

Impressum / About Us