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]