﻿:: {v:v, g:g, s:s, b:b, d:d, t:t, n:n, r8:r8, r4:r4, i:i, i8:i8, i4:i4, i2:i2, i1:i1, u8:u8, u4:u4, u2:u2, u1:u1}

ToI8(g)
ToI8(s)
ToI4(d)
ToI4(t)
ToI8(n)
ToI8(r8)
ToI8(r4)
ToI8(i)
ToI4(i8)
ToI2(i4)
ToI1(i2)
ToI8(u8)
ToI4(u4)
ToI2(u2)
ToI1(u1)

ToI4(v)
ToI4(b)
ToI8(d)
ToI8(t)
ToI8(i8)
ToI8(i4)
ToI4(i4)
ToI4(i2)
ToI2(i2)
ToI2(i1)
ToI1(i1)
ToI8(u4)
ToI4(u2)
ToI2(u1)

:: {o:o, qb:b?, qd:d?, qt:t?, qn:n?, qr8:r8?, qr4:r4?, qi:i?, qi8:i8?, qi4:i4?, qi2:i2?, qi1:i1?, qu8:u8?, qu4:u4?, qu2:u2?, qu1:u1?}

ToI4(qd)
ToI4(qt)
ToI8(qn)
ToI8(qr8)
ToI8(qr4)
ToI8(qi)
ToI4(qi8)
ToI2(qi4)
ToI1(qi2)
ToI8(qu8)
ToI4(qu4)
ToI2(qu2)
ToI1(qu1)

ToI8(o)
ToI1(qb)
ToI8(qd)
ToI8(qt)
ToI8(qi8)
ToI8(qi4)
ToI4(qi4)
ToI4(qi2)
ToI2(qi2)
ToI2(qi1)
ToI1(qi1)
ToI8(qu4)
ToI4(qu2)
ToI2(qu1)

:: {g:g, v:v, o:o, i2:i2, qi2:i2?, i4:i4, qi4:i4?, r4:r4, qr4:r4?, i8:i8, qi8:i8?, b:b, qb:b?}

ToI4(v)
ToI4(v, v)
ToI4(v, o)
ToI4(v, qi2)
ToI4(v, i2)

ToI4(i2)
ToI4(i2, v)
ToI4(i2, o)
ToI4(i2, qi2)
ToI4(i2, i2)

ToI4(i8)
ToI4(i8, v)
ToI4(i8, o)
ToI4(i8, qi2)
ToI4(i8, i2)

ToI4(o)
ToI4(o, v)
ToI4(o, o)
ToI4(o, qi2)
ToI4(o, i2)

ToI4(qi2)
ToI4(qi2, v)
ToI4(qi2, o)
ToI4(qi2, qi2)
ToI4(qi2, i2)

ToI4(qi8)
ToI4(qi8, v)
ToI4(qi8, o)
ToI4(qi8, qi2)
ToI4(qi8, i2)

To(g, qi4)
To(g, i4)
To(g, qb)
To(g, b)

To(v, qi4)
To(v, i4)
To(v, qb)
To(v, b)
To(r4, qi4)
To(r4, i4)
To(r4, qb)
To(r4, b)

To(o, qi4)
To(o, i4)
To(o, qb)
To(o, b)
To(qr4, qi4)
To(qr4, i4)
To(qr4, qb)
To(qr4, b)

// Lifting.
:: {g:g*, v:v*, s:s*, b:b*, d:d*, t:t*, n:n*, r8:r8*, r4:r4*, i:i*, i8:i8*, i4:i4*, i2:i2*, i1:i1*, u8:u8*, u4:u4*, u2:u2*, u1:u1*}

ToI4(g)
ToI4(s)
ToI4(d)
ToI4(t)
ToI8(n)
ToI8(r8)
ToI8(r4)
ToI8(i)
ToI4(i8)
ToI2(i4)
ToI1(i2)
ToI8(u8)
ToI4(u4)
ToI2(u2)
ToI1(u1)

ToI4(v)
ToI1(b)
ToI8(d)
ToI8(t)
ToI8(i8)
ToI8(i4)
ToI4(i4)
ToI4(i2)
ToI2(i2)
ToI2(i1)
ToI1(i1)
ToI8(u4)
ToI4(u2)
ToI2(u1)

:: {o:o*, qb:b?*, qd:d?*, qt:t?*, qn:n?*, qr8:r8?*, qr4:r4?*, qi:i?*, qi8:i8?*, qi4:i4?*, qi2:i2?*, qi1:i1?*, qu8:u8?*, qu4:u4?*, qu2:u2?*, qu1:u1?*}

ToI4(qd)
ToI4(qt)
ToI8(qn)
ToI8(qr8)
ToI8(qr4)
ToI8(qi)
ToI4(qi8)
ToI2(qi4)
ToI1(qi2)
ToI8(qu8)
ToI4(qu4)
ToI2(qu2)
ToI1(qu1)

ToI8(o)
ToI1(qb)
ToI8(qd)
ToI8(qt)
ToI8(qi8)
ToI8(qi4)
ToI4(qi4)
ToI4(qi2)
ToI2(qi2)
ToI2(qi1)
ToI1(qi1)
ToI8(qu4)
ToI4(qu2)
ToI2(qu1)

// Invocation variations

ToI4(3.14)
ToI4(1/0)
ToI4(3.14, null)
ToI4(1/0, null)
ToI4(3.14, Null(5i2))
ToI4(3.14, Opt (5i2))
ToI4(1/0,  Null(5i2))
ToI4(1/0,  Opt (5i2))
ToI4(3.14, 5i2)
ToI4(1/0, 5i2)

ToI4(Null(3.14))
ToI4(Opt (3.14))
ToI4(Opt (1/0 ))
ToI4(Null(3.14), null)
ToI4(Opt (3.14), null)
ToI4(Opt (1/0 ), null)
ToI4(Null(3.14), Null(5i2))
ToI4(Null(3.14), Opt (5i2))
ToI4(Opt (3.14), Null(5i2))
ToI4(Opt (3.14), Opt (5i2))
ToI4(Opt (1/0 ), Null(5i2))
ToI4(Opt (1/0 ), Opt (5i2))
ToI4(Null(3.14), 5i2)
ToI4(Opt (3.14), 5i2)
ToI4(Opt (1/0 ), 5i2)

To(3.14, Null(5i4))
To(3.14, Opt (5i4))
To(1/0,  Null(5i4))
To(1/0,  Opt (5i4))
To(3.14, 5i4)
To(1/0,  5i4)

To(Null(3.14), Null(5i4))
To(Null(3.14), Opt (5i4))
To(Opt (3.14), Null(5i4))
To(Opt (3.14), Opt (5i4))
To(Opt (1/0 ), Null(5i4))
To(Opt (1/0 ), Opt (5i4))
To(Null(3.14), 5i4)
To(Opt (3.14), 5i4)
To(Opt (1/0 ), 5i4)

// Integer boundaries

ToI4(false)
ToI4(true)

ToI1(-129)
ToI1(-128)
ToI1(127)
ToI1(128)
To(-129, 5i1)

ToI2(-32769)
ToI2(-32768)
ToI2(32767)
ToI2(32768)
To(-32768, 5i2)

ToI4(-2147483649i8)
ToI4(-2147483648i8)
ToI4(2147483647i8)
ToI4(2147483648i8)
To(2147483647i8, 5i4)

ToI8(-9223372036854775809ia)
ToI8(-9223372036854775808ia)
ToI8(9223372036854775807ia)
ToI8(9223372036854775808ia)
To(9223372036854775808ia, 5i8)

// Floating point

ToI4(-1/0)
ToI4(1/0)
ToI4(0/0)
To(-1/0, 5i4)
To(1/0, 5i4)
ToI4(0/0, 5i4)

// Floating-point boundaries

ToI1(-0x10200000000000 * 2.0 ^ 45)
ToI1(-0x101FFFFFFFFFFF * 2.0 ^ -45)
ToI1(CastR4(-0x800000  * 2.0 ^ -16))
ToI1(CastR4( 0xFFFFFF  * 2.0 ^ -17))
ToI1(0x1FFFFFFFFFFFFF  * 2.0 ^ -46)
ToI1(0x10000000000000  * 2.0 ^ -45)

ToI2(-0x10200000000000 * 2.0 ^ -37)
ToI2(-0x10001FFFFFFFFF * 2.0 ^ -37)
ToI2(CastR4(-0x800000  * 2.0 ^ -8))
ToI2(CastR4( 0xFFFFFF  * 2.0 ^ -9))
ToI2(0x1FFFFFFFFFFFFF  * 2.0 ^ -38)
ToI2(0x10000000000000  * 2.0 ^ -37)

ToI4(-0x10000020000000 * 2.0 ^ -21)
ToI4(-0x100000001FFFFF * 2.0 ^ -21)
ToI4(CastR4(-0x800000  * 2.0 ^ 8))
ToI4(CastR4( 0xFFFFFF  * 2.0 ^ 7))
ToI4(0x1FFFFFFFFFFFFF  * 2.0 ^ -22)
ToI4(0x10000000000000  * 2.0 ^ -21)

ToI8(-0x10000000000001 * 2.0 ^ 11)
ToI8(-0x10000000000000 * 2.0 ^ 11)
ToI8(CastR4(-0x800000  * 2.0 ^ 40))
ToI8(CastR4( 0xFFFFFF  * 2.0 ^ 39))
ToI8( 0x1FFFFFFFFFFFFF * 2.0 ^ 10)
ToI8( 0x10000000000000 * 2.0 ^ 11)

// String

ToI4("")
ToI4(" ")
To("", 1i2)
ToI4(" ", 2i2)

// Integer strings

ToI4("false")
ToI4("true")
To("false", 0i4)
ToI4("true", 1i2)

ToI4("1_234")
To("1_234", 5i4)

ToI4("-0")

// String boundaries

ToI1("-129")
ToI1("-128")
ToI1("127")
ToI1("128")
To("-129", 5u1)

ToI2("-32769 ")
ToI2("(32768)")
ToI2(" 32767 ")
ToI2(" 32768 ")
To("(32,768)", 5i2)

ToI4("(2,147,483,649)")
ToI4("-2,147,483,648 ")
ToI4(" 2,147,483,647 ")
ToI4(" 2,147,483,648 ")
To("2,147,483,647", 5i4)

ToI8("-9,223,372,036,854,775,809 ")
ToI8("(9,223,372,036,854,775,808)")
ToI8(" 9,223,372,036,854,775,807 ")
ToI8(" 9,223,372,036,854,775,808 ")
To("9,223,372,036,854,775,808", 5i8)

// Fractional strings

ToI4("-0.0")
ToI4("12.34")
ToI4("2e20")
ToI4("∞")
ToI4("Infinity")
ToI4("NaN")
To("-0.0", 5i4)
To("12.34", 5i4)
To("2e20", 5i4)
ToI4("∞", 5i4)
ToI4("Infinity", 5i2)
ToI4("NaN", 5i2)

// Date and TimeSpan

ToI1(Date(1, 1, 1, 0, 0, 0, 0, 128))

ToI1(Time(0, 0, 0, 0, 0, 128))
