﻿:: {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}

ToIA(g)
ToIA(s)
ToIA(n)
ToIA(r8)
ToIA(r4)

ToIA(v)
ToIA(b)
ToIA(d)
ToIA(t)
ToIA(i)
ToIA(i8)
ToIA(i4)
ToIA(i2)
ToIA(i1)
ToIA(u8)
ToIA(u4)
ToIA(u2)
ToIA(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?}

ToIA(qn)
ToIA(qr8)
ToIA(qr4)

ToIA(o)
ToIA(qb)
ToIA(qd)
ToIA(qt)
ToIA(qi)
ToIA(qi8)
ToIA(qi4)
ToIA(qi2)
ToIA(qi1)
ToIA(qu8)
ToIA(qu4)
ToIA(qu2)
ToIA(qu1)

:: {g:g, v:v, o:o, r8:r8, qr8:r8?, i:i, qi:i?, i4:i4, qi4:i4?}

ToIA(v)
ToIA(v, v)
ToIA(v, o)
ToIA(v, qi4)
ToIA(v, i4)

ToIA(i4)
ToIA(i4, v)
ToIA(i4, o)
ToIA(i4, qi4)
ToIA(i4, i4)

ToIA(r8)
ToIA(r8, v)
ToIA(r8, o)
ToIA(r8, qi4)
ToIA(r8, i4)

ToIA(o)
ToIA(o, v)
ToIA(o, o)
ToIA(o, qi4)
ToIA(o, i4)

ToIA(qi4)
ToIA(qi4, v)
ToIA(qi4, o)
ToIA(qi4, qi4)
ToIA(qi4, i4)

ToIA(qr8)
ToIA(qr8, v)
ToIA(qr8, o)
ToIA(qr8, qi4)
ToIA(qr8, i4)

To(g, qi)
To(g, i)

To(v, qi)
To(v, i)
To(r8, qi)
To(r8, i)

To(o, qi)
To(o, i)
To(qr8, qi)
To(qr8, i)

// Lifting.
:: {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*}

ToIA(g)
ToIA(s)
ToIA(n)
ToIA(r8)
ToIA(r4)

ToIA(b)
ToIA(d)
ToIA(t)
ToIA(i)
ToIA(i8)
ToIA(i4)
ToIA(i2)
ToIA(i1)
ToIA(u8)
ToIA(u4)
ToIA(u2)
ToIA(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?*}

ToIA(qn)
ToIA(qr8)
ToIA(qr4)

ToIA(o)
ToIA(qb)
ToIA(qd)
ToIA(qt)
ToIA(qi)
ToIA(qi8)
ToIA(qi4)
ToIA(qi2)
ToIA(qi1)
ToIA(qu8)
ToIA(qu4)
ToIA(qu2)
ToIA(qu1)

// Invocation variations

ToIA(3.14)
ToIA(1/0)
ToIA(3.14, null)
ToIA(1/0,  null)
ToIA(3.14, Null(5))
ToIA(3.14, Opt (5))
ToIA(1/0,  Null(5))
ToIA(1/0,  Opt (5))
ToIA(3.14, 5)

ToIA(Null(3.14))
ToIA(Opt (3.14))
ToIA(Opt (1/0 ))
ToIA(Null(3.14), null)
ToIA(Opt (3.14), null)
ToIA(Opt (1/0 ), null)
ToIA(Null(3.14), Null(5))
ToIA(Null(3.14), Opt (5))
ToIA(Opt (3.14), Null(5))
ToIA(Opt (3.14), Opt (5))
ToIA(Opt (1/0 ), Null(5))
ToIA(Opt (1/0 ), Opt (5))
ToIA(Null(3.14), 5)
ToIA(Opt (3.14), 5)
ToIA(Opt (1/0 ), 5)

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

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

// Integer

ToIA(false)
ToIA(true)
ToIA(-9223372036854775808i8)
ToIA(18446744073709551615u8)
ToIA(123456789012345678901234567890ia)

// Floating point

ToIA(-1/0)
ToIA(1/0)
ToIA(0/0)
To(-1/0, 5ia)
To(1/0, 5ia)
ToIA(0/0, 5ia)

// Floating-point boundaries

ToIA(-0x1FFFFFFFFFFFFF * 2.0 ^ 971)
ToIA(CastR4(-0xFFFFFF  * 2.0 ^ 104))
ToIA(-0x1FFFFFFFFFFFFF * 2.0 ^ -53)
ToIA(CastR4(-0x7FFFFF  * 2.0 ^ -23))
ToIA(CastR4( 0x7FFFFF  * 2.0 ^ -23))
ToIA( 0x1FFFFFFFFFFFFF * 2.0 ^ -53)
ToIA(CastR4( 0xFFFFFF  * 2.0 ^ 104))
ToIA( 0x1FFFFFFFFFFFFF * 2.0 ^ 971)

// Strings

ToIA("")
ToIA(" ")
ToIA("(-0)")
ToIA(" ( 123  ) ")
To("", 5ia)
To(" ", 5ia)
ToIA("(-0)", 5)
ToIA(" ( 123  ) ", 5)

// Integer strings

ToIA("false")
ToIA("true")
To("false", 5ia)
ToIA("true", 5ia)

ToIA("1 234")
To("1 234", 5ia)

ToIA("-0")
ToIA("(0)")
ToIA("12,345 ")
ToIA(" (123) ")

// Fractional strings

ToIA("-0.0")
ToIA("12.34", 56)
ToIA("2e20")
ToIA("∞")
ToIA("-∞")
ToIA("Infinity")
ToIA("-Infinity")
ToIA("NaN")
To("-0.0", 5ia)
To("12.34", 5ia)
To("2e20", 5ia)
To("∞", 5ia)
ToIA("-∞", 5ia)
ToIA("Infinity", 5ia)
ToIA("-Infinity", 5ia)
ToIA("NaN", 5ia)
