1--[[
2	Licensed according to the included 'LICENSE' document
3	Author: Thomas Harning Jr <harningt@gmail.com>
4]]
5local tostring = tostring
6local assert = assert
7local jsonutil = require("json.util")
8local huge = require("math").huge
9
10local _ENV = nil
11
12local defaultOptions = {
13	nan = true,
14	inf = true
15}
16
17local modeOptions = {}
18modeOptions.strict = {
19	nan = false,
20	inf = false
21}
22
23local function mergeOptions(options, mode)
24	jsonutil.doOptionMerge(options, false, 'number', defaultOptions, mode and modeOptions[mode])
25end
26
27
28local function encodeNumber(number, options)
29	if number ~= number then
30		assert(options.nan, "Invalid number: NaN not enabled")
31		return "NaN"
32	end
33	if number == huge then
34		assert(options.inf, "Invalid number: Infinity not enabled")
35		return "Infinity"
36	end
37	if number == -huge then
38		assert(options.inf, "Invalid number: Infinity not enabled")
39		return "-Infinity"
40	end
41	return tostring(number)
42end
43
44local function getEncoder(options)
45	options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions
46	return {
47		number = function(number, state)
48			return encodeNumber(number, options)
49		end
50	}
51end
52
53local number = {
54	mergeOptions = mergeOptions,
55	getEncoder = getEncoder
56}
57
58return number
59