local function makeModuleWithAutoLoad(prefix)

    local mod = {}

    local function loadSubmodule(_, name)

        local submodule = require(prefix .. name)
        rawset(mod, name, submodule)
        return submodule

    end

    setmetatable(mod, {
        __index = loadSubmodule,
        __newindex = error,
    })

    return mod

end

--------------------------------------------------------------------------------

local Rx = makeModuleWithAutoLoad('Rx.')

rawset(Rx, 'internals', makeModuleWithAutoLoad('Rx.internals.'))
rawset(Rx, 'observables', makeModuleWithAutoLoad('Rx.observables.'))
rawset(Rx, 'operators', makeModuleWithAutoLoad('Rx.operators.'))
rawset(Rx, 'testing', makeModuleWithAutoLoad('Rx.testing.'))

return Rx
