You can do this quite simply with Split :
import shapeless._, ops.hlist.{ Length, Prepend, Split } class UndoPrependHelper[A <: HList, B <: HList, C <: HList, N <: Nat] { def apply(c: C)(implicit split: Split.Aux[C, N, A, B]): (A, B) = split(c) } def undoPrepend[A <: HList, B <: HList](implicit prepend: Prepend[A, B], length: Length[A] ) = new UndoPrependHelper[A, B, prepend.Out, length.Out]
And then:
scala> type A = Int :: String :: Symbol :: HNil defined type alias A scala> type B = List[Int] :: Option[Double] :: HNil defined type alias B scala> type C = Int :: String :: Symbol :: List[Int] :: Option[Double] :: HNil defined type alias C scala> val a: A = 1 :: "foo" :: 'bar :: HNil a: A = 1 :: foo :: 'bar :: HNil scala> val b: B = List(1, 2, 3) :: Option(0.0) :: HNil b: B = List(1, 2, 3) :: Some(0.0) :: HNil scala> val c: C = a ++ b c: C = 1 :: foo :: 'bar :: List(1, 2, 3) :: Some(0.0) :: HNil scala> val (newA: A, newB: B) = undoPrepend[A, B].apply(c) newA: A = 1 :: foo :: 'bar :: HNil newB: B = List(1, 2, 3) :: Some(0.0) :: HNil
I recently added a undo operation for a class of type Remove , and it might make sense to have something similar built into Prepend .
Travis brown
source share