From 20e554658f10f64ca336e7bdc2c368d53aafa64b Mon Sep 17 00:00:00 2001 From: "dmitry.shakhtarin" Date: Sat, 8 Sep 2018 19:01:12 +0300 Subject: [PATCH] summirizing contract --- .../fluence/hackethberlin/CodeChunk.scala | 2 +- .../fluence/hackethberlin/Contract.scala | 9 +++++++ .../hackethberlin/types/DataVyper.scala | 14 ++++++++++ src/main/scala/fluence/MakeVyperApp.scala | 26 ++++++++++--------- 4 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 core/src/main/scala/fluence/hackethberlin/Contract.scala diff --git a/core/src/main/scala/fluence/hackethberlin/CodeChunk.scala b/core/src/main/scala/fluence/hackethberlin/CodeChunk.scala index 6d487ca..ec1a516 100644 --- a/core/src/main/scala/fluence/hackethberlin/CodeChunk.scala +++ b/core/src/main/scala/fluence/hackethberlin/CodeChunk.scala @@ -11,7 +11,7 @@ sealed trait CodeChunk { case class CodeBlock(lines: Queue[String]) extends CodeChunk { override def toVyper(indent: Int): String = - lines.mkString(CodeChunk.spaces(indent), ";\n" + CodeChunk.spaces(indent), ";\n") + lines.mkString(CodeChunk.spaces(indent), "\n" + CodeChunk.spaces(indent), "\n") } case class CodeLine(line: String) extends CodeChunk { diff --git a/core/src/main/scala/fluence/hackethberlin/Contract.scala b/core/src/main/scala/fluence/hackethberlin/Contract.scala new file mode 100644 index 0000000..773c490 --- /dev/null +++ b/core/src/main/scala/fluence/hackethberlin/Contract.scala @@ -0,0 +1,9 @@ +package fluence.hackethberlin + +import fluence.hackethberlin.types.DataVyper +import shapeless.HList + +class Contract[D <: HList](instructions: D)(implicit dv: DataVyper[D]) { + def toVyper: String = + dv.toVyperDefinitions(instructions).mkString("\n") +} diff --git a/core/src/main/scala/fluence/hackethberlin/types/DataVyper.scala b/core/src/main/scala/fluence/hackethberlin/types/DataVyper.scala index 68f9734..64ecf0e 100644 --- a/core/src/main/scala/fluence/hackethberlin/types/DataVyper.scala +++ b/core/src/main/scala/fluence/hackethberlin/types/DataVyper.scala @@ -1,5 +1,6 @@ package fluence.hackethberlin.types +import fluence.hackethberlin.{FuncDef, types} import shapeless._ import shapeless.labelled.FieldType import shapeless.tag._ @@ -28,6 +29,19 @@ sealed trait LowPriorityDataVyperImplicits { override def toVyperDefinitions(data: FieldType[K, V]): List[String] = s"${wk.value.name}: ${data.toVyper}" :: Nil } + + implicit def productTypeDataVyper[D <: HList]: DataVyper[ProductType[D]] = + new DataVyper[ProductType[D]] { + override def toVyperDefinitions(data: ProductType[D]): List[String] = + data.toDataVyper :: Nil + } + + implicit def funcDefDataVyper[Args <: HList, Ret <: types.Type]: DataVyper[FuncDef[Args, Ret]] = + new DataVyper[FuncDef[Args, Ret]] { + override def toVyperDefinitions(func: FuncDef[Args, Ret]): List[String] = + func.toVyper :: Nil + } + } object DataVyper extends LowPriorityDataVyperImplicits { diff --git a/src/main/scala/fluence/MakeVyperApp.scala b/src/main/scala/fluence/MakeVyperApp.scala index 3c94ad5..5ee0bb7 100644 --- a/src/main/scala/fluence/MakeVyperApp.scala +++ b/src/main/scala/fluence/MakeVyperApp.scala @@ -46,17 +46,19 @@ object MakeVyperApp extends App { import Expr.Defs._ - println( - ( - `@public` @: - sumArgs.funcDef("sum", uint256) { args ⇒ - for { - c ← 'c :=: `++`(args.ref('a), args.ref('b)) - d ← 'd :=: `++`(args.ref('b), c) - sum ← `++`(args.ref('a), d).toReturn - } yield sum - } - ).toVyper - ) + val f = `@public` @: + sumArgs.funcDef("sum", uint256) { args ⇒ + for { + c ← 'c :=: `++`(args.ref('a), args.ref('b)) + d ← 'd :=: `++`(args.ref('b), c) + sum ← `++`(args.ref('a), d).toReturn + } yield sum + } + + val all = recordStruct :: data :: func :: f :: HNil + + val c = new Contract(recordStruct :: struct :: data :: func :: f :: HNil) + + println(c.toVyper) }