How to create a wrapper of List with a specific type

前端 未结 2 1266
慢半拍i
慢半拍i 2020-12-19 22:47

I am trying to create a wrapper of List with a specific type (e.g. List[Int]) such that methods that take an implicit CanBuildFrom par

2条回答
  •  渐次进展
    2020-12-19 23:03

    Regarding my follow-up question how to mixin the wrapper logic via classes or traits, this is what I came up with:

    import scala.collection._
    
    trait ListWrapper[Elem, Repr <: ListWrapper[Elem, Repr]]
        extends immutable.LinearSeq[Elem]
        with LinearSeqLike[Elem, Repr]
        with generic.SeqForwarder[Elem] { self: Repr =>
    
      def wrapperCompanion: ListWrapperCompanion[Elem, Repr]
    
      override def newBuilder: mutable.Builder[Elem, Repr] =
        wrapperCompanion.newBuilder
    }
    
    trait ListWrapperCompanion[Elem, Repr <: ListWrapper[Elem, Repr]] {
      def apply(elems: TraversableOnce[Elem]): Repr
    
      def newBuilder: mutable.Builder[Elem, Repr] =
        new mutable.ListBuffer[Elem].mapResult(apply)
    
      def canBuildFromWrapper: generic.CanBuildFrom[Repr, Elem, Repr] = {
        new generic.CanBuildFrom[Repr, Elem, Repr] {
          def apply(from: Repr) = from.newBuilder
          def apply() = newBuilder
        }
      }
    }
    

    Now MyList can be implemented by:

    class MyList(val underlying: List[Int]) extends ListWrapper[Int, MyList] {
      def wrapperCompanion = MyList
    }
    
    object MyList extends ListWrapperCompanion[Int, MyList] {
      def apply(elems: TraversableOnce[Int]) = new MyList(elems.toList)
    
      implicit def canBuildFrom = canBuildFromWrapper
    }
    

    This is definitely better than having all the boilerplate code in MyList's definition, but it is still a lot to write for making MyList just a wrapper for List.

提交回复
热议问题