Type aliases

This commit is contained in:
dmitry 2021-02-25 17:58:50 +03:00
parent 694b3a040e
commit 9f80069615
3 changed files with 17 additions and 4 deletions

View File

@ -1,13 +1,13 @@
package aqua.parse package aqua.parse
import aqua.parse.DataType.`datatypedef` import aqua.parse.DataType.{`customtypedef`, `datatypedef`}
import aqua.parse.lexer.Token._ import aqua.parse.lexer.Token._
import aqua.parse.Type.{`arrowdef`, `typedef`} import aqua.parse.Type.{`arrowdef`, `typedef`}
import aqua.parse.lift.LiftParser import aqua.parse.lift.LiftParser
import aqua.parse.lift.LiftParser._ import aqua.parse.lift.LiftParser._
import cats.Functor import cats.Functor
import cats.data.{NonEmptyList, NonEmptyMap} import cats.data.{NonEmptyList, NonEmptyMap}
import cats.parse.{Parser P} import cats.parse.{Parser => P}
sealed trait Block[F[_]] sealed trait Block[F[_]]
case class DefType[F[_]](name: F[String], fields: NonEmptyMap[String, F[DataType]]) extends Block[F] case class DefType[F[_]](name: F[String], fields: NonEmptyMap[String, F[DataType]]) extends Block[F]
@ -16,6 +16,7 @@ case class DefService[F[_]](name: F[String], funcs: NonEmptyMap[String, ArrowTyp
case class FuncHead[F[_]](name: F[String], args: Map[String, Type], ret: Option[DataType]) case class FuncHead[F[_]](name: F[String], args: Map[String, Type], ret: Option[DataType])
case class DefFunc[F[_]](head: FuncHead[F], body: NonEmptyList[F[FuncOp[F]]]) extends Block[F] case class DefFunc[F[_]](head: FuncHead[F], body: NonEmptyList[F[FuncOp[F]]]) extends Block[F]
case class DefAlias[F[_]](alias: CustomType, target: Type) extends Block[F]
object DefType { object DefType {
def `dname`[F[_]: LiftParser]: P[F[String]] = `data` *> ` ` *> Name.lift <* ` `.? <* `:` <* ` \n*` def `dname`[F[_]: LiftParser]: P[F[String]] = `data` *> ` ` *> Name.lift <* ` `.? <* `:` <* ` \n*`
@ -61,8 +62,18 @@ object DefService {
} }
} }
object DefAlias {
def `defalias`[F[_]: LiftParser]: P[DefAlias[F]] =
((`alias` *> ` ` *> `customtypedef` <* ` : `) ~ `typedef`).map {
case (ct, t) => DefAlias(ct, t)
}
}
object Block { object Block {
def block[F[_]: LiftParser: Functor]: P[Block[F]] = def block[F[_]: LiftParser: Functor]: P[Block[F]] =
` \n*`.rep0.with1 *> P.oneOf(DefType.`deftype` :: DefService.`defservice` :: DefFunc.`deffunc` :: Nil) ` \n*`.rep0.with1 *> P.oneOf(
DefType.`deftype` :: DefService.`defservice` :: DefFunc.`deffunc` :: DefAlias.`defalias` :: Nil
)
} }

View File

@ -14,6 +14,7 @@ object Token {
val ` ` : P[String] = P.charsWhile(fSpaces) val ` ` : P[String] = P.charsWhile(fSpaces)
val `data`: P[Unit] = P.string("data") val `data`: P[Unit] = P.string("data")
val `alias`: P[Unit] = P.string("alias")
val `service`: P[Unit] = P.string("service") val `service`: P[Unit] = P.string("service")
val `func`: P[Unit] = P.string("func") val `func`: P[Unit] = P.string("func")
val `on`: P[Unit] = P.string("on") val `on`: P[Unit] = P.string("on")

View File

@ -1,7 +1,8 @@
package aqua.parse.lift package aqua.parse.lift
import cats.{Comonad, Functor} import cats.Comonad
import cats.parse.{Parser P} import cats.parse.{Parser P}
import cats.free.Free
import scala.language.implicitConversions import scala.language.implicitConversions