Traversable pattern

Root of the pattern

It is inspired from Scala 2 source code.

trait TraversableMemoryRoot[+E] extends Any {

  type C[_]

  def traversable: C[E]

}

trait TraversableMemoryOps[
  +E,
  +TravMem[_],
  +Self <: TraversableMemoryRoot[E]
] extends Any {
  self: Self =>

  def map[F : ClassTag](f: E => F): TravMem[F]

  def filter(p: E => Boolean): Self

}

trait TraversableMemory[+E] extends Any
  with TraversableMemoryRoot[E]
  with TraversableMemoryOps[E, TraversableMemory, TraversableMemory[E]]

At InstanceMemory level

A huge code economy rely on methods fromColl and fromSpecificColl.


trait InstanceMemoryRoot[+E] extends Any with TraversableMemoryRoot[E] {

  def context: HephIAContext

}

trait InstanceMemoryOps[
  +E,
  +InstMem[A] <: InstanceMemoryRoot[A],
  +SelfMem <: InstanceMemoryRoot[E],
  +InstMemImplParam[A] <: InstImplicitParam[A, InstanceMemory, InstMemImplParam]
] extends TraversableMemoryOps[E, InstMem, SelfMem] {
  mem: SelfMem =>

  def fromColl[A](coll: C[A], param: InstMemImplParam[A]): InstMem[A]

  def fromSpecificColl(coll: C[E], param: InstMemImplParam[E]): SelfMem

}

trait InstanceMemory[+E] extends TraversableMemory[E]
  with InstanceMemoryRoot[E]
  with InstanceMemoryOps[E, InstanceMemory, InstanceMemory[E], InstanceImplicitParam]

Apply on a concrete collection


trait ArrayInstanceMemoryRoot[E] extends LocalInstanceMemoryRoot[E] {

  final type C[A] = Array[A]

}



trait ArrayInstMemoryOps[
  E,
  +InstMem[A] <: ArrayInstanceMemory[A],
  +Mem <: ArrayInstanceMemoryRoot[E],
  +ArrayInstMemImplParam[A] <: ArrayInstImplicitParam[A, ArrayInstanceMemory, ArrayInstMemImplParam]
] extends LocalInstanceMemoryOps[E, InstMem, Mem, ArrayInstMemImplParam] {
  mem: Mem =>


  def map[F: ClassTag](f: E => F): InstMem[F] = {
    fromColl(traversable.map(f), implicitParam.typeUpdate[F])
  }

  def filter(p: E => Boolean): Mem = {
    fromSpecificColl(traversable.filter(p), implicitParam)
  }

}

trait ArrayInstanceMemory[E] extends ArrayInstanceMemoryRoot[E]
  with ArrayInstMemoryOps[
      E,
      ArrayInstanceMemory,
      ArrayInstanceMemory[E],
      ArrayInstanceImplicitParam
    ]
  with LocalInstanceMemory[E] {

  def fromColl[A](arr: Array[A], param: ArrayInstanceImplicitParam[A]): ArrayInstanceMemory[A] = {
    ArrayInstanceMemoryImpl_(arr)(param)
  }


  def fromSpecificColl(arr: Array[E], param: ArrayInstanceImplicitParam[E]): ArrayInstanceMemory[E] = {
    ArrayInstanceMemoryImpl_(arr)(param)
  }


}

private[hephia] final case class ArrayInstanceMemoryImpl_[E](traversable: Array[E])(
  implicit val implicitParam: ArrayInstanceImplicitParam[E]
) extends ArrayInstanceMemory[E]