Преобразование Seq [String] в класс case типобезопасным способом

Я написал парсер, который преобразует String в Seq [String], следуя некоторым правилам. Это будет использоваться в библиотеке.

Я пытаюсь преобразовать этот Seq [String] в case-класс. Класс case будет предоставлен пользователем (таким образом, нет никакого способа угадать, что это будет).

Я подумал о бесформенной библиотеке, потому что она, кажется, реализует хорошие функции и кажется зрелой, но я понятия не имею, как поступить.

Я нашел этот вопросс интересным ответом но я не вижу, как преобразовать это для моих нужд. Действительно, в ответе анализируется только один тип (String), и библиотека выполняет итерации внутри самой String. Это, вероятно, требует глубоких изменений в том, как все делается, и я понятия не имею, как.

Более того, если возможно, я хочу сделать этот процесс максимально простым для пользователя моей библиотеки. Поэтому, если возможно, в отличие от ответа в приведенной выше ссылке, тип HList будет угадываться из самого класса case (однако, согласно моему поиску, кажется, что компилятору нужна эта информация).

Я немного новичок в системе типов и всех этих прекрасных вещах, если кто-нибудь сможет дать мне совет, как это сделать, я буду очень счастлив!

С уважением

--- РЕДАКТИРОВАТЬ ---

Как и просил ziggystar, вот несколько возможных подписей:

//Let's say we are just parsing a CSV.

@onUserSide
case class UserClass(i:Int, j:Int, s:String)
val list = Seq("1,2,toto", "3,4,titi")

// User transforms his case class to a function with something like:
val f = UserClass.curried

// The function created in 1/ is injected in the parser
val parser = new Parser(f)

// The Strings to convert to case classes are provided as an argument to the parse() method.
val finalResult:Seq[UserClass] = parser.parse(list) 
// The transfomation is done in two steps inside the parse() method:
// 1/ first we have: val list = Seq("1,2,toto", "3,4,titi")
// 2/ then we have a call to internalParserImplementedSomewhereElse(list)
//    val parseResult is now equal to Seq(Seq("1", "2", "toto"), Seq("3","4", "titi"))
// 3/ finally Shapeless do its magick trick and we have Seq(UserClass(1,2,"toto"), UserClass(3,4,"titi))



@insideTheLibrary
class Parser[A](function:A) {

 //The internal parser takes each String provided through argument of the method and transforms each String to a Seq[String]. So the Seq[String] provided is changed to Seq[Seq[String]]. 
 private def internalParserImplementedSomewhereElse(l:Seq[String]): Seq[Seq[String]] = {
  ...
 }

 /*
 * Class A and B are both related to the case class provided by the user: 
 * - A is the type of the case class as a function, 
 * - B is the type of the original case class (can be guessed from type A).
 */
 private def convert2CaseClass[B](list:Seq[String]): B {
    //do  something with Shapeless
    //I don't know what to put inside ???
 }

 def parse(l:Seq[String]){
   val parseResult:Seq[Seq[String]] = internalParserImplementedSomewhereElse(l:Seq[String])
   val finalResult = result.map(convert2CaseClass)
   finalResult // it is a Seq[CaseClassProvidedByUser]       
 }
}    

Внутри библиотеки будет доступно неявное преобразование String в правильный тип, как они предполагают Shapeless (аналогично ответу, предложенному в ссылке выше). Как string.toInt, string.ToDouble и так далее ...

Может быть, есть другой способ создать его. Это то, что я имею в виду после нескольких часов игры с Shapeless.

Ответы на вопрос(2)

Ваш ответ на вопрос