flix

0.77.0

ToFlix.flix

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

pub mod ToFlix {

    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
    import java.math.BigInteger
    import java.util.{List => JList}
    import java.util.{Map => JMap}
    import java.util.{Set => JSet}

    ///
    /// A trait for marshaling values to Flix objects.
    ///
    pub trait ToFlix[t: Type] {
        type In[t]: Type
        type Aef[t]: Eff = {}
        pub def toFlix(t: ToFlix.In[t]): t \ ToFlix.Aef[t]
    }

    instance ToFlix[Int8] {
        type In = Byte
        pub def toFlix(i: Byte): Int8 = Int8.byteValue(i)
    }

    instance ToFlix[Int16] {
        type In = Short
        pub def toFlix(i: Short): Int16 = Int16.shortValue(i)
    }

    instance ToFlix[Int32] {
        type In = Integer
        pub def toFlix(i: Integer): Int32 = Int32.intValue(i)
    }

    instance ToFlix[Int64] {
        type In = Long
        pub def toFlix(i: Long): Int64 = Int64.longValue(i)
    }

    instance ToFlix[Float32] {
        type In = Float
        pub def toFlix(d: Float): Float32 = Float32.floatValue(d)
    }

    instance ToFlix[Float64] {
        type In = Double
        pub def toFlix(d: Double): Float64 = Float64.doubleValue(d)
    }

    instance ToFlix[BigInt] {
        type In = BigInteger
        pub def toFlix(i: BigInteger): BigInt = i
    }

    instance ToFlix[BigDecimal] {
        type In = BigDecimal
        pub def toFlix(d: BigDecimal): BigDecimal = d
    }

    instance ToFlix[Char] {
        type In = Character
        pub def toFlix(c: Character): Char = Char.charValue(c)
    }

    instance ToFlix[String] {
        type In = String
        pub def toFlix(s: String): String = s
    }

    instance ToFlix[List[a]] {
        type In = JList[a]
        pub def toFlix(l: JList[a]): List[a] = Adaptor.fromList(l)
    }

    instance ToFlix[Chain[a]] {
        type In = JList[a]
        pub def toFlix(l: JList[a]): Chain[a] = region rc {
            let it = unsafe IO { l.iterator() };
            it |> Adaptor.fromIterator(rc, (Proxy.Proxy: Proxy[a])) |> Iterator.toChain
        }
    }

    instance ToFlix[Vector[a]] {
        type In = JList[a]
        pub def toFlix(l: JList[a]): Vector[a] = region rc {
            let iter = unsafe IO { l.iterator() };
            iter |> Adaptor.fromIterator(rc, (Proxy.Proxy: Proxy[a])) |> Iterator.toVector
        }
    }

    instance ToFlix[Set[a]] with Order[a] {
        type In = JSet[a]
        pub def toFlix(s: JSet[a]): Set[a] = Adaptor.fromSet(s)
    }

    instance ToFlix[Map[k, v]] with Order[k] {
        type In = JMap[k, v]
        pub def toFlix(m: JMap[k, v]): Map[k, v] = Adaptor.fromMap(m)
    }

}