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

io.scalaland.chimney.javacollections.JavaCollectionsImplicits.scala Maven / Gradle / Ivy

package io.scalaland.chimney.javacollections

import java.util as ju
import io.scalaland.chimney.integrations.*

import scala.collection.compat.Factory
import scala.collection.mutable
import scala.jdk.CollectionConverters.*
import scala.reflect.{classTag, ClassTag}

/** @since 1.0.0 */
trait JavaCollectionsImplicits {

  // java.util.Optional

  /** @since 1.0.0 */
  implicit def javaOptionalIsOptionalValue[Value]: OptionalValue[ju.Optional[Value], Value] =
    new OptionalValue[ju.Optional[Value], Value] {
      def empty: ju.Optional[Value] = ju.Optional.empty()
      def of(value: Value): ju.Optional[Value] = ju.Optional.ofNullable(value)
      def fold[A](oa: ju.Optional[Value], onNone: => A, onSome: Value => A): A =
        if (oa.isPresent) onSome(oa.get()) else onNone
    }

  // java.util.Iterator

  /** @since 1.0.0 */
  implicit def javaIteratorIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Iterator[Item], Item] =
    new TotallyBuildIterable[ju.Iterator[Item], Item] {
      def totalFactory: Factory[Item, ju.Iterator[Item]] = new FactoryCompat[Item, ju.Iterator[Item]] {
        def newBuilder: mutable.Builder[Item, ju.Iterator[Item]] = new FactoryCompat.Builder[Item, ju.Iterator[Item]] {
          private val impl = new ju.ArrayList[Item]()
          def clear(): Unit = impl.clear()
          def result(): ju.Iterator[Item] = impl.iterator()
          def addOne(elem: Item): this.type = { impl.add(elem); this }
        }
      }
      def iterator(collection: ju.Iterator[Item]): Iterator[Item] = collection.asScala
    }

  // java.util.Enumeration

  /** @since 1.0.0 */
  implicit def javaEnumerationIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Enumeration[Item], Item] =
    new TotallyBuildIterable[ju.Enumeration[Item], Item] {
      def totalFactory: Factory[Item, ju.Enumeration[Item]] = new FactoryCompat[Item, ju.Enumeration[Item]] {
        def newBuilder: mutable.Builder[Item, ju.Enumeration[Item]] =
          new FactoryCompat.Builder[Item, ju.Enumeration[Item]] {
            private val impl = new ju.ArrayList[Item]()
            def clear(): Unit = impl.clear()
            def result(): ju.Enumeration[Item] = new ju.Enumeration[Item] {
              private val it = impl.iterator()
              def hasMoreElements: Boolean = it.hasNext()
              def nextElement(): Item = it.next()
            }
            override def addOne(elem: Item): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: ju.Enumeration[Item]): Iterator[Item] = collection.asScala
    }

  // java.util.Collection

  /** @since 1.0.0 */
  implicit def javaCollectionIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Collection[Item], Item] =
    javaAbstractCollectionIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaAbstractCollectionIsTotallyBuildIterable[Item]
      : TotallyBuildIterable[ju.AbstractCollection[Item], Item] =
    javaArrayListIsTotallyBuildIterable[Item].widen

  // java.util.List

  /** @since 1.0.0 */
  implicit def javaListIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.List[Item], Item] =
    javaAbstractListIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaAbstractListIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.AbstractList[Item], Item] =
    javaArrayListIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaAbstractSequentialListIsTotallyBuildIterable[Item]
      : TotallyBuildIterable[ju.AbstractSequentialList[Item], Item] =
    javaLinkedListIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaArrayListIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.ArrayList[Item], Item] =
    collectionTotallyBuildIterable(new ju.ArrayList[Item])

  /** @since 1.0.0 */
  implicit def javaLinkedListIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.LinkedList[Item], Item] =
    collectionTotallyBuildIterable(new ju.LinkedList[Item])

  /** @since 1.0.0 */
  implicit def javaVectorIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Vector[Item], Item] =
    collectionTotallyBuildIterable(new ju.Vector[Item])

  /** @since 1.0.0 */
  implicit def javaStackIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Stack[Item], Item] =
    collectionTotallyBuildIterable(new ju.Stack[Item])

  // java.util.Deque

  /** @since 1.0.0 */
  implicit def javaDequeIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Deque[Item], Item] =
    javaArrayDequeIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaArrayDequeIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.ArrayDeque[Item], Item] =
    collectionTotallyBuildIterable(new ju.ArrayDeque[Item])

  // java.util.Queue

  /** @since 1.0.0 */
  implicit def javaQueueIsTotallyBuildIterable[Item: Ordering]: TotallyBuildIterable[ju.Queue[Item], Item] =
    javaAbstractQueueIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaAbstractQueueIsTotallyBuildIterable[Item: Ordering]
      : TotallyBuildIterable[ju.AbstractQueue[Item], Item] =
    javaPriorityQueueIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaPriorityQueueIsTotallyBuildIterable[Item: Ordering]
      : TotallyBuildIterable[ju.PriorityQueue[Item], Item] =
    collectionTotallyBuildIterable(new ju.PriorityQueue[Item](Ordering[Item]))

  // java.util.Set

  /** @since 1.0.0 */
  implicit def javaSetIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.Set[Item], Item] =
    javaAbstractSetIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaAbstractSetIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.AbstractSet[Item], Item] =
    javaHashSetIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaSortedSetIsTotallyBuildIterable[Item: Ordering]: TotallyBuildIterable[ju.SortedSet[Item], Item] =
    javaNavigableSetIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaNavigableSetIsTotallyBuildIterable[Item: Ordering]
      : TotallyBuildIterable[ju.NavigableSet[Item], Item] =
    javaTreeSetIsTotallyBuildIterable[Item].widen

  /** @since 1.0.0 */
  implicit def javaHashSetIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.HashSet[Item], Item] =
    collectionTotallyBuildIterable(new ju.HashSet[Item])

  /** @since 1.0.0 */
  implicit def javaLinkedHashSetIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.LinkedHashSet[Item], Item] =
    collectionTotallyBuildIterable(new ju.LinkedHashSet[Item])

  /** @since 1.0.0 */
  implicit def javaTreeSetIsTotallyBuildIterable[Item: Ordering]: TotallyBuildIterable[ju.TreeSet[Item], Item] =
    collectionTotallyBuildIterable(new ju.TreeSet[Item](Ordering[Item]))

  /** @since 1.0.0 */
  implicit def javaEnumSetIsTotallyBuildIterable[Item <: java.lang.Enum[Item]: ClassTag]
      : TotallyBuildIterable[ju.EnumSet[Item], Item] =
    collectionTotallyBuildIterable(ju.EnumSet.noneOf[Item](classTag[Item].runtimeClass.asInstanceOf[Class[Item]]))

  // java.util.BitSet

  /** @since 1.0.0 */
  implicit val javaBitSetIsTotallyBuildIterable: TotallyBuildIterable[ju.BitSet, Int] =
    new TotallyBuildIterable[ju.BitSet, Int] {
      def totalFactory: Factory[Int, ju.BitSet] = new FactoryCompat[Int, ju.BitSet] {
        def newBuilder: mutable.Builder[Int, ju.BitSet] =
          new FactoryCompat.Builder[Int, ju.BitSet] {
            private val impl = new ju.BitSet()
            def clear(): Unit = impl.clear()
            def result(): ju.BitSet = impl
            def addOne(elem: Int): this.type = { impl.set(elem); this }
          }
      }
      def iterator(collection: ju.BitSet): Iterator[Int] = (0 to collection.size()).filter(collection.get).iterator
    }

  // java.util.Dictionary

  /** @since 1.0.0 */
  implicit def javaDictionaryIsTotallyBuildMap[Key, Value]: TotallyBuildMap[ju.Dictionary[Key, Value], Key, Value] =
    javaHashtableIsTotallyBuildMap[Key, Value].widen

  /** @since 1.0.0 */
  implicit def javaHashtableIsTotallyBuildMap[Key, Value]: TotallyBuildMap[ju.Hashtable[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.Hashtable[Key, Value])

  /** @since 1.0.0 */
  implicit def javaPropertiesIsTotallyBuildMap: TotallyBuildMap[ju.Properties, String, String] =
    mapTotallyBuildMap[java.lang.Object, java.lang.Object, ju.Map[java.lang.Object, java.lang.Object]](
      new ju.Properties()
    ).asInstanceOf[TotallyBuildMap[ju.Properties, String, String]]

  // java.util.Map

  /** @since 1.0.0 */
  implicit def javaMapIsTotallyBuildMap[Key: Ordering, Value]: TotallyBuildMap[ju.Map[Key, Value], Key, Value] =
    javaAbstractMapIsTotallyBuildMap[Key, Value].widen

  /** @since 1.0.0 */
  implicit def javaAbstractMapIsTotallyBuildMap[Key: Ordering, Value]
      : TotallyBuildMap[ju.AbstractMap[Key, Value], Key, Value] =
    javaHashMapIsTotallyBuildMap[Key, Value].widen

  /** @since 1.0.0 */
  implicit def javaSortedMapIsTotallyBuildMap[Key: Ordering, Value]
      : TotallyBuildMap[ju.SortedMap[Key, Value], Key, Value] =
    javaNavigableMapIsTotallyBuildMap[Key, Value].widen

  /** @since 1.0.0 */
  implicit def javaNavigableMapIsTotallyBuildMap[Key: Ordering, Value]
      : TotallyBuildMap[ju.NavigableMap[Key, Value], Key, Value] =
    javaTreeMapIsTotallyBuildMap[Key, Value].widen

  /** @since 1.0.0 */
  implicit def javaHashMapIsTotallyBuildMap[Key, Value]: TotallyBuildMap[ju.HashMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.HashMap[Key, Value])

  /** @since 1.0.0 */
  implicit def javaIdentityHashMapIsTotallyBuildMap[Key, Value]
      : TotallyBuildMap[ju.IdentityHashMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.IdentityHashMap[Key, Value])

  /** @since 1.0.0 */
  implicit def javaLinkedHashMapIsTotallyBuildMap[Key, Value]
      : TotallyBuildMap[ju.LinkedHashMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.LinkedHashMap[Key, Value])

  /** @since 1.0.0 */
  implicit def javaWeakHashMapIsTotallyBuildMap[Key, Value]: TotallyBuildMap[ju.WeakHashMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.WeakHashMap[Key, Value])

  /** @since 1.0.0 */
  implicit def javaTreeMapIsTotallyBuildMap[Key: Ordering, Value]: TotallyBuildMap[ju.TreeMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.TreeMap[Key, Value](Ordering[Key]))

  /** @since 1.0.0 */
  implicit def javaEnumMapIsTotallyBuildMap[Key <: java.lang.Enum[Key]: ClassTag, Value]
      : TotallyBuildMap[ju.EnumMap[Key, Value], Key, Value] =
    mapTotallyBuildMap(new ju.EnumMap[Key, Value](classTag[Key].runtimeClass.asInstanceOf[Class[Key]]))

  // java.util.stream.BaseStream

  /** @since 1.0.0 */
  implicit def javaStreamIsTotallyBuildIterable[Item]: TotallyBuildIterable[ju.stream.Stream[Item], Item] =
    new TotallyBuildIterable[ju.stream.Stream[Item], Item] {
      def totalFactory: Factory[Item, ju.stream.Stream[Item]] = new FactoryCompat[Item, ju.stream.Stream[Item]] {
        def newBuilder: mutable.Builder[Item, ju.stream.Stream[Item]] =
          new FactoryCompat.Builder[Item, ju.stream.Stream[Item]] {
            private var impl = ju.stream.Stream.builder[Item]()
            def clear(): Unit = impl = ju.stream.Stream.builder[Item]()
            def result(): ju.stream.Stream[Item] = impl.build()
            def addOne(elem: Item): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: ju.stream.Stream[Item]): Iterator[Item] = collection.iterator().asScala
    }

  /** @since 1.0.0 */
  implicit val javaIntStreamIsTotallyBuildIterable: TotallyBuildIterable[ju.stream.IntStream, Int] =
    new TotallyBuildIterable[ju.stream.IntStream, Int] {
      def totalFactory: Factory[Int, ju.stream.IntStream] = new FactoryCompat[Int, ju.stream.IntStream] {
        def newBuilder: mutable.Builder[Int, ju.stream.IntStream] =
          new FactoryCompat.Builder[Int, ju.stream.IntStream] {
            private var impl = ju.stream.IntStream.builder()
            def clear(): Unit = impl = ju.stream.IntStream.builder()
            def result(): ju.stream.IntStream = impl.build()
            def addOne(elem: Int): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: ju.stream.IntStream): Iterator[Int] =
        collection.iterator().asScala.asInstanceOf[Iterator[Int]]
    }

  /** @since 1.0.0 */
  implicit val javaLongStreamIsTotallyBuildIterable: TotallyBuildIterable[ju.stream.LongStream, Long] =
    new TotallyBuildIterable[ju.stream.LongStream, Long] {
      def totalFactory: Factory[Long, ju.stream.LongStream] = new FactoryCompat[Long, ju.stream.LongStream] {
        def newBuilder: mutable.Builder[Long, ju.stream.LongStream] =
          new FactoryCompat.Builder[Long, ju.stream.LongStream] {
            private var impl = ju.stream.LongStream.builder()
            def clear(): Unit = impl = ju.stream.LongStream.builder()
            def result(): ju.stream.LongStream = impl.build()
            def addOne(elem: Long): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: ju.stream.LongStream): Iterator[Long] =
        collection.iterator().asScala.asInstanceOf[Iterator[Long]]
    }

  /** @since 1.0.0 */
  implicit val javaDoubleStreamIsTotallyBuildIterable: TotallyBuildIterable[ju.stream.DoubleStream, Double] =
    new TotallyBuildIterable[ju.stream.DoubleStream, Double] {
      def totalFactory: Factory[Double, ju.stream.DoubleStream] = new FactoryCompat[Double, ju.stream.DoubleStream] {
        def newBuilder: mutable.Builder[Double, ju.stream.DoubleStream] =
          new FactoryCompat.Builder[Double, ju.stream.DoubleStream] {
            private var impl = ju.stream.DoubleStream.builder()
            def clear(): Unit = impl = ju.stream.DoubleStream.builder()
            def result(): ju.stream.DoubleStream = impl.build()
            def addOne(elem: Double): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: ju.stream.DoubleStream): Iterator[Double] =
        collection.iterator().asScala.asInstanceOf[Iterator[Double]]
    }

  // reused

  private def collectionTotallyBuildIterable[Item, CC <: ju.Collection[Item]](
      empty: => CC
  ): TotallyBuildIterable[CC, Item] =
    new TotallyBuildIterable[CC, Item] {
      def totalFactory: Factory[Item, CC] = new FactoryCompat[Item, CC] {
        def newBuilder: mutable.Builder[Item, CC] =
          new FactoryCompat.Builder[Item, CC] {
            private val impl = empty
            def clear(): Unit = impl.clear()
            def result(): CC = impl
            def addOne(elem: Item): this.type = { impl.add(elem); this }
          }
      }
      def iterator(collection: CC): Iterator[Item] = collection.iterator().asScala
    }

  private def mapTotallyBuildMap[Key, Value, CC <: ju.Map[Key, Value]](empty: => CC): TotallyBuildMap[CC, Key, Value] =
    new TotallyBuildMap[CC, Key, Value] {
      def totalFactory: Factory[(Key, Value), CC] = new FactoryCompat[(Key, Value), CC] {
        def newBuilder: mutable.Builder[(Key, Value), CC] =
          new FactoryCompat.Builder[(Key, Value), CC] {
            private val impl = empty
            def clear(): Unit = impl.clear()
            def result(): CC = impl
            def addOne(elem: (Key, Value)): this.type = { impl.put(elem._1, elem._2); this }
          }
      }
      def iterator(collection: CC): Iterator[(Key, Value)] = collection.asScala.iterator
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy