All Downloads are FREE. Search and download functionalities are using the official Maven repository.

dc10.scala.Statement.scala Maven / Gradle / Ivy

package dc10.scala

import dc10.scala.Symbol.{CaseClass, Extension, Object, Package, Term}
import org.tpolecat.sourcepos.SourcePos

sealed trait Statement:
  def indent: Int
  def sp: SourcePos
  
object Statement:

  extension (s: Statement)
    def addIndent: Statement =
      s match
        case d@CaseClassDef(i, sp) => CaseClassDef(d.caseclass, i + 1)(using sp)
        case d@ExtensionDef(i, sp) => ExtensionDef(d.extension, i + 1)(using sp)
        case d@ObjectDef(i, sp) => ObjectDef(d.obj, i + 1)(using sp)
        case d@PackageDef(i, sp) => PackageDef(d.pkg, i + 1)(using sp)
        case TypeExpr(tpe) => ???
        case ValueExpr(value) => ???
        case [email protected](i, sp) => ValueDef.Def(i + 1, d.value, d.arg, d.tpe, d.ret)(using sp)
        case [email protected](i, sp) => ValueDef.Fld(i + 1, d.value)(using sp)
        case [email protected](i, sp) => ValueDef.Val(i + 1, d.value)(using sp)

  sealed abstract case class CaseClassDef(
    indent: Int,
    sp: SourcePos
  ) extends Statement:
    type Zed
    type Tpe
    def caseclass: CaseClass[Zed, Tpe]

  object CaseClassDef:
    def apply[Z, T](
      v: CaseClass[Z, T],
      i: Int
    )(
      using sp: SourcePos
    ): CaseClassDef =
      new CaseClassDef(i, sp):
        type Zed = Z
        type Tpe = T
        def caseclass: CaseClass[Z, T] = v

  
  sealed abstract case class ExtensionDef(
    indent: Int,
    sp: SourcePos
  ) extends Statement:
    def extension: Extension

  object ExtensionDef:
    def apply(
      v: Extension,
      i: Int
    )(
      using sp: SourcePos
    ): ExtensionDef =
      new ExtensionDef(i, sp):
        def extension: Extension = v

  sealed abstract case class ObjectDef(
    indent: Int,
    sp: SourcePos
  ) extends Statement:
    type Tpe
    def obj: Object[Unit, Tpe]

  object ObjectDef:
    def apply[T](
      o: Object[Unit, T],
      i: Int
    )(
      using sp: SourcePos
    ): ObjectDef =
      new ObjectDef(i, sp):
        type Tpe = T
        def obj: Object[Unit, T] = o

  sealed abstract case class PackageDef(
    indent: Int,
    sp: SourcePos
  ) extends Statement:
    def pkg: Package

  object PackageDef:
    def apply[T](
      p: Package,
      i: Int,
    )(
      using sp: SourcePos
    ): PackageDef =
      new PackageDef(i, sp):
        def pkg: Package = p

  sealed trait ValueDef extends Statement:
    type Zed
    type Tpe
    type Nom <: Term.ValueLevel[Tpe, Nom]
    def value: Term.ValueLevel.Var.UserDefinedValue[Zed, Tpe, Nom]
    def indent: Int
    def sp: SourcePos

  object ValueDef:

    abstract case class Def[Z, T, A, B, X <: Term.ValueLevel[T, X]](
      i: Int,
      s: SourcePos
    ) extends ValueDef:
      type Zed = Z
      type Tpe = T
      type Nom = X
      def arg: Term.Value[Z, A]
      def ret: Option[Term.Value[Z, B]]
      def tpe: Term.Type[Z, B]
      def indent: Int = i
      def sp: SourcePos = s
    object Def:
      def apply[Z, T, A, B, X <: Term.ValueLevel[T, X]](
        i: Int,
        v: Term.ValueLevel.Var.UserDefinedValue[Z, T, X],
        a: Term.Value[Z, A],
        t: Term.Type[Z, B],
        r: Option[Term.Value[Z, B]]
      )(
        using sp: SourcePos
      ): ValueDef =
        new Def[Z, T, A, B, X](i, sp):
          def arg: Term.Value[Z, A] = a
          def ret: Option[Term.Value[Z, B]] = r
          def tpe: Term.Type[Z, B] = t
          def value: Term.ValueLevel.Var.UserDefinedValue[Z, T, X] = v


    abstract case class Fld[Z, T, X <: Term.ValueLevel[T, X]](
      i: Int,
      s: SourcePos   
    ) extends ValueDef:
      type Zed = Z
      type Tpe = T
      type Nom = X
      // def sp: SourcePos = s
      def indent: Int = i
      def sp: SourcePos = s

    object Fld:
      def apply[Z, T, A <: Term.ValueLevel[T, A]](
        i: Int,
        v: Term.ValueLevel.Var.UserDefinedValue[Z, T, A]
      )(
        using sp: SourcePos
      ): ValueDef =
        new Fld[Z, T, A](i, sp):
          def value: Term.ValueLevel.Var.UserDefinedValue[Z, T, A] = v
   

    abstract case class Val[Z, T, X <: Term.ValueLevel[T, X]](
      i: Int,
      s: SourcePos   
    ) extends ValueDef:
      type Zed = Z
      type Tpe = T
      type Nom = X
      // def sp: SourcePos = s
      def indent: Int = i
      def sp: SourcePos = s

    object Val:
      def apply[Z, T, A <: Term.ValueLevel[T, A]](
        i: Int,
        v: Term.ValueLevel.Var.UserDefinedValue[Z, T, A]
      )(
        using sp: SourcePos
      ): ValueDef =
        new Val[Z, T, A](i, sp):
          def value: Term.ValueLevel.Var.UserDefinedValue[Z, T, A] = v
          def tpe: Term.TypeLevel[T, ?] = v.tpe.tail.value
   
  case class TypeExpr[Z, T](tpe: Term.Type[Z, T]) extends Statement:
    def indent: Int = 0
    def sp: SourcePos = summon[SourcePos]

  case class ValueExpr[Z, T](value: Term.Value[Z, T]) extends Statement:
    def indent: Int = 0
    def sp: SourcePos = summon[SourcePos]




© 2015 - 2025 Weber Informatics LLC | Privacy Policy