All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.avsystem.commons.jiop.JOptionalUtils.scala Maven / Gradle / Ivy

The newest version!
package com.avsystem.commons
package jiop

import java.{util => ju}

trait JOptionalUtils {

  import JOptionalUtils._

  type JOptional[T] = ju.Optional[T]
  type JOptionalDouble = ju.OptionalDouble
  type JOptionalInt = ju.OptionalInt
  type JOptionalLong = ju.OptionalLong

  implicit def optional2AsScala[T](optional: JOptional[T]): optional2AsScala[T] =
    new optional2AsScala(optional)

  implicit def optionalDouble2AsScala(optional: JOptionalDouble): optionalDouble2AsScala =
    new optionalDouble2AsScala(optional)

  implicit def optionalInt2AsScala(optional: JOptionalInt): optionalInt2AsScala =
    new optionalInt2AsScala(optional)

  implicit def optionalLong2AsScala(optional: JOptionalLong): optionalLong2AsScala =
    new optionalLong2AsScala(optional)

  implicit def option2AsJava[T](option: Option[T]): option2AsJava[T] =
    new option2AsJava(option)

  implicit def opt2AsJava[T](opt: Opt[T]): opt2AsJava[T] =
    new opt2AsJava((opt: Opt[Any]).orNull)

  // NOTE: losing information about NOpt(null) vs NOpt.Empty but this is fine because JOptional doesn't distinguish
  implicit def nopt2AsJava[T](opt: NOpt[T]): nopt2AsJava[T] =
    new nopt2AsJava((opt: NOpt[Any]).orNull)

  implicit def optArg2AsJava[T](opt: OptArg[T]): optArg2AsJava[T] =
    new optArg2AsJava((opt: OptArg[Any]).orNull)

  implicit def option2AsJavaDouble(option: Option[Double]): option2AsJavaDouble =
    new option2AsJavaDouble(option)

  implicit def option2AsJavaInt(option: Option[Int]): option2AsJavaInt =
    new option2AsJavaInt(option)

  implicit def option2AsJavaLong(option: Option[Long]): option2AsJavaLong =
    new option2AsJavaLong(option)


  object JOptional {
    def apply[T](nullable: T): JOptional[T] = ju.Optional.ofNullable(nullable)

    def empty[T]: JOptional[T] = ju.Optional.empty[T]()
  }

  object JOptionalDouble {
    def apply(value: Double): JOptionalDouble = ju.OptionalDouble.of(value)

    def empty: JOptionalDouble = ju.OptionalDouble.empty()
  }

  object JOptionalInt {
    def apply(value: Int): JOptionalInt = ju.OptionalInt.of(value)

    def empty: JOptionalInt = ju.OptionalInt.empty()
  }

  object JOptionalLong {
    def apply(value: Long): JOptionalLong = ju.OptionalLong.of(value)

    def empty: JOptionalLong = ju.OptionalLong.empty()
  }

}

object JOptionalUtils {

  final class optional2AsScala[T](private val optional: JOptional[T]) extends AnyVal {
    def toOption: Option[T] =
      if (optional.isPresent) Some(optional.get) else None

    def toOpt: Opt[T] =
      if (optional.isPresent) Opt(optional.get) else Opt.Empty

    def asScala: Option[T] = toOption
  }

  final class optionalDouble2AsScala(private val optional: JOptionalDouble) extends AnyVal {
    def toOption: Option[Double] =
      if (optional.isPresent) Some(optional.getAsDouble) else None

    def toOpt: Opt[Double] =
      if (optional.isPresent) Opt(optional.getAsDouble) else Opt.Empty

    def asScala: Option[Double] = toOption
  }

  final class optionalInt2AsScala(private val optional: JOptionalInt) extends AnyVal {
    def toOption: Option[Int] =
      if (optional.isPresent) Some(optional.getAsInt) else None

    def toOpt: Opt[Int] =
      if (optional.isPresent) Opt(optional.getAsInt) else Opt.Empty

    def asScala: Option[Int] = toOption
  }

  final class optionalLong2AsScala(private val optional: JOptionalLong) extends AnyVal {
    def toOption: Option[Long] =
      if (optional.isPresent) Some(optional.getAsLong) else None

    def toOpt: Opt[Long] =
      if (optional.isPresent) Opt(optional.getAsLong) else Opt.Empty

    def asScala: Option[Long] = toOption
  }

  final class option2AsJava[T](private val option: Option[T]) extends AnyVal {
    /**
      * Note that in scala Some(null) is valid value. It will throw an exception in such case, because java Optional
      * is not able to hold null
      */
    def toJOptional: JOptional[T] =
      if (option.isDefined) ju.Optional.of(option.get) else ju.Optional.empty()

    def asJava: JOptional[T] = toJOptional
  }

  final class opt2AsJava[T](private val rawOrNull: Any) extends AnyVal {
    private def opt: Opt[T] = Opt(rawOrNull.asInstanceOf[T])

    /**
      * Note that in scala Some(null) is valid value. It will throw an exception in such case, because java Optional
      * is not able to hold null
      */
    def toJOptional: JOptional[T] =
      if (opt.isDefined) ju.Optional.of(opt.get) else ju.Optional.empty()

    def asJava: JOptional[T] = toJOptional
  }

  // note: we have lost information about NOpt.Empty vs NOpt(null) but it doesn't matter because we only convert
  // to JOptional which doesn't distinguish between them
  final class nopt2AsJava[T](private val rawOrNull: Any) extends AnyVal {
    private def opt: NOpt[T] = NOpt(rawOrNull.asInstanceOf[T])

    /**
      * Note that in scala Some(null) is valid value. It will throw an exception in such case, because java Optional
      * is not able to hold null
      */
    def toJOptional: JOptional[T] =
      if (opt.isDefined) ju.Optional.of(opt.get) else ju.Optional.empty()

    def asJava: JOptional[T] = toJOptional
  }

  final class optArg2AsJava[T](private val rawOrNull: Any) extends AnyVal {
    private def opt: OptArg[T] = OptArg(rawOrNull.asInstanceOf[T])

    /**
      * Note that in scala Some(null) is valid value. It will throw an exception in such case, because java Optional
      * is not able to hold null
      */
    def toJOptional: JOptional[T] =
      if (opt.isDefined) ju.Optional.of(opt.get) else ju.Optional.empty()

    def asJava: JOptional[T] = toJOptional
  }

  final class option2AsJavaDouble(private val option: Option[Double]) extends AnyVal {
    def toJOptionalDouble: JOptionalDouble =
      if (option.isDefined) ju.OptionalDouble.of(option.get) else ju.OptionalDouble.empty()

    def asJavaDouble: JOptionalDouble = toJOptionalDouble
  }

  final class option2AsJavaInt(private val option: Option[Int]) extends AnyVal {
    def toJOptionalInt: JOptionalInt =
      if (option.isDefined) ju.OptionalInt.of(option.get) else ju.OptionalInt.empty()

    def asJavaInt: JOptionalInt = toJOptionalInt
  }

  final class option2AsJavaLong(private val option: Option[Long]) extends AnyVal {
    def toJOptionalLong: JOptionalLong =
      if (option.isDefined) ju.OptionalLong.of(option.get) else ju.OptionalLong.empty()

    def asJavaLong: JOptionalLong = toJOptionalLong
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy