flix

0.79.0

ToString.flix

/*
 *  Copyright 2020 Matthew Lutze
 *
 * Use of this source code is governed by the Apache 2.0 license
 * that can be found in the LICENSE.md file.
 */

///
/// Trait for types that can be converted to strings, and its functions.
///
pub mod ToString {

    import java.lang.Byte
    import java.lang.Character
    import java.lang.Double
    import java.lang.Float
    import java.lang.Integer
    import java.lang.Long
    import java.lang.Short

    ///
    /// Trait for types that can be converted to strings.
    ///
    pub trait ToString[a] {
        ///
        /// Returns a string representation of the given x.
        ///
        pub def toString(x: a): String
    }

    instance ToString[Unit] {
        pub def toString(_x: Unit): String = "()"
    }

    instance ToString[Bool] {
        pub def toString(x: Bool): String = match x {
            case true  => "true"
            case false => "false"
        }
    }

    instance ToString[Char] {
        pub def toString(x: Char): String = Character.toString(x)
    }

    instance ToString[Float32] {
        pub def toString(x: Float32): String = Float.toString(x)
    }

    instance ToString[Float64] {
        pub def toString(x: Float64): String = Double.toString(x)
    }

    instance ToString[Int8] {
        pub def toString(x: Int8): String = Byte.toString(x)
    }

    instance ToString[Int16] {
        pub def toString(x: Int16): String = Short.toString(x)
    }

    instance ToString[Int32] {
        pub def toString(x: Int32): String = Integer.toString(x)
    }

    instance ToString[Int64] {
        pub def toString(x: Int64): String = Long.toString(x)
    }

    instance ToString[String] {
        pub def toString(x: String): String = x
    }

    instance ToString[BigInt] {
        pub def toString(x: BigInt): String = x.toString()
    }

    instance ToString[BigDecimal] {
        pub def toString(x: BigDecimal): String = x.toString()
    }

    instance ToString[Regex] {
        pub def toString(x: Regex): String = x.toString()
    }

    instance ToString[(a1, a2)] with ToString[a1], ToString[a2] {
        pub def toString(t: (a1, a2)): String = match t {
            case (x1, x2) =>
                "(${x1}, ${x2})"
        }
    }

    instance ToString[(a1, a2, a3)] with ToString[a1], ToString[a2], ToString[a3] {
        pub def toString(t: (a1, a2, a3)): String = match t {
            case (x1, x2, x3) =>
                "(${x1}, ${x2}, ${x3})"
        }
    }

    instance ToString[(a1, a2, a3, a4)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4] {
        pub def toString(t: (a1, a2, a3, a4)): String = match t {
            case (x1, x2, x3, x4) =>
                "(${x1}, ${x2}, ${x3}, ${x4})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5] {
        pub def toString(t: (a1, a2, a3, a4, a5)): String = match t {
            case (x1, x2, x3, x4, x5) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6)): String = match t {
            case (x1, x2, x3, x4, x5, x6) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10], ToString[a11] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10}, ${x11})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10], ToString[a11], ToString[a12] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10}, ${x11}, ${x12})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10], ToString[a11], ToString[a12], ToString[a13] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10}, ${x11}, ${x12}, ${x13})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10], ToString[a11], ToString[a12], ToString[a13], ToString[a14] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10}, ${x11}, ${x12}, ${x13}, ${x14})"
        }
    }

    instance ToString[(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)] with ToString[a1], ToString[a2], ToString[a3], ToString[a4], ToString[a5], ToString[a6], ToString[a7], ToString[a8], ToString[a9], ToString[a10], ToString[a11], ToString[a12], ToString[a13], ToString[a14], ToString[a15] {
        pub def toString(t: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)): String = match t {
            case (x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) =>
                "(${x1}, ${x2}, ${x3}, ${x4}, ${x5}, ${x6}, ${x7}, ${x8}, ${x9}, ${x10}, ${x11}, ${x12}, ${x13}, ${x14}, ${x15})"
        }
    }

}