Search code examples
scalaparsingcode-duplication

Scala refactoring duplicate code


I am new to Scala and trying to figure out how to refactor the following code to avoid duplicate functions. As you can see those are very similar and just need refactoring into generic code.

    protected lazy val shardNamesSpec: Parser[Seq[String]] = {
        (ident ^^ {case d => Seq(d)}) | ("(" ~> repsep(ident, ",") <~ ")") ^^ {
          case i => i
        }
      }

    protected lazy val shardTypesSpec: Parser[Seq[DataType]] = {
        (dataType ^^ {case d => Seq(d)}) | ("(" ~> repsep(dataType, ",") <~ ")") ^^ {
          case dt => dt
        }
      }

Solution

  • I suppose you need smth like following:

      def parseExpr[T](value: Parser[T]): Parser[Seq[T]] = {
        (value ^^ {case d => Seq(d)}) | ("(" ~> repsep(value, ",") <~ ")") ^^ {
          case i => i
        }
    
      }
    
      protected lazy val shardNamesSpec: Parser[Seq[String]] = parseExpr(ident)
    
      protected lazy val shardTypesSpec: Parser[Seq[DataType]] = parseExpr(dataType)