diff --git a/model/inline/src/main/scala/aqua/model/inline/raw/ApplyBoolOpRawInliner.scala b/model/inline/src/main/scala/aqua/model/inline/raw/ApplyBoolOpRawInliner.scala index f84ff5bf6..8bfce1591 100644 --- a/model/inline/src/main/scala/aqua/model/inline/raw/ApplyBoolOpRawInliner.scala +++ b/model/inline/src/main/scala/aqua/model/inline/raw/ApplyBoolOpRawInliner.scala @@ -9,6 +9,7 @@ import aqua.model.inline.Inline import aqua.model.inline.RawValueInliner.{unfold, valueToModel} import aqua.types.{ArrowType, ScalarType} import aqua.raw.value.ApplyBoolOpRaw +import aqua.raw.value.ApplyBoolOpRaw.BoolOpRaw.* import cats.data.Chain import cats.syntax.traverse.* @@ -23,8 +24,57 @@ object ApplyBoolOpRawInliner extends RawInliner[ApplyBoolOpRaw] { override def apply[S: Mangler: Exports: Arrows]( raw: ApplyBoolOpRaw, propertiesAllowed: Boolean - ): State[S, (ValueModel, Inline)] = - (unfold(raw.left), unfold(raw.right)).flatMapN { case ((lm, linline), (rm, rinline)) => - ??? + ): State[S, (ValueModel, Inline)] = for { + left <- unfold(raw.left) + (lmodel, linline) = left + right <- unfold(raw.right) + (rmodel, rinline) = right + + (name, compareWith) = raw.op match { + case And => ("and", true) + case Or => ("or", false) } + resName <- Mangler[S].findAndForbidName(name) + + /* + * (seq + * + * (xor + * (match + * (seq + * + * (ap ) + * ) + * ) + * (ap ) + * ) + * ) + * + * TODO: Handle errors in + */ + predo = SeqModel.wrap( + linline.predo :+ XorModel.wrap( + MatchMismatchModel( + lmodel, + LiteralModel.bool(compareWith), + shouldMatch = true + ).wrap( + SeqModel.wrap( + rinline.predo :+ FlattenModel( + rmodel, + resName + ).leaf + ) + ), + FlattenModel( + lmodel, + resName + ).leaf + ) + ) + + } yield ( + VarModel(resName, ScalarType.bool), + Inline(Chain.one(predo)) + ) } diff --git a/model/inline/src/main/scala/aqua/model/inline/raw/ApplyIntoCopyRawInliner.scala b/model/inline/src/main/scala/aqua/model/inline/raw/ApplyIntoCopyRawInliner.scala index b1f2f124f..fb4da3ad4 100644 --- a/model/inline/src/main/scala/aqua/model/inline/raw/ApplyIntoCopyRawInliner.scala +++ b/model/inline/src/main/scala/aqua/model/inline/raw/ApplyIntoCopyRawInliner.scala @@ -22,6 +22,7 @@ import cats.syntax.monoid.* import cats.syntax.functor.* import cats.syntax.flatMap.* import cats.syntax.apply.* +import cats.syntax.foldable.* object ApplyIntoCopyRawInliner extends Logging { @@ -53,14 +54,14 @@ object ApplyIntoCopyRawInliner extends Logging { name <- Mangler[S].findAndForbidName(value.name + "_obj_copy") foldedFields <- intoCopy.fields.nonEmptyTraverse(unfold(_)) varModel = VarModel(name, value.baseType) - valsInline = foldedFields.toSortedMap.values.map(_._2).fold(Inline.empty)(_ |+| _).desugar + valsInline = foldedFields.toList.foldMap { case (_, inline) => inline }.desugar fields = foldedFields.map(_._1) objCopy <- copyObj(value, fields, varModel) } yield { ( varModel, Inline( - Chain.one(SeqModel.wrap((valsInline.predo :+ objCopy).toList: _*)), + Chain.one(SeqModel.wrap(valsInline.predo :+ objCopy)), SeqMode ) ) diff --git a/model/inline/src/main/scala/aqua/model/inline/raw/CallArrowRawInliner.scala b/model/inline/src/main/scala/aqua/model/inline/raw/CallArrowRawInliner.scala index 476677d7c..da46b0d5a 100644 --- a/model/inline/src/main/scala/aqua/model/inline/raw/CallArrowRawInliner.scala +++ b/model/inline/src/main/scala/aqua/model/inline/raw/CallArrowRawInliner.scala @@ -32,7 +32,7 @@ object CallArrowRawInliner extends RawInliner[CallArrowRaw] with Logging { Chain( SeqModel.wrap( sd._2.toList ++ - cd._2.toList :+ CallServiceModel(sd._1, value.name, cd._1).leaf: _* + cd._2.toList :+ CallServiceModel(sd._1, value.name, cd._1).leaf ) ) ) diff --git a/model/src/main/scala/aqua/model/ValueModel.scala b/model/src/main/scala/aqua/model/ValueModel.scala index 547a0fccd..2751753f4 100644 --- a/model/src/main/scala/aqua/model/ValueModel.scala +++ b/model/src/main/scala/aqua/model/ValueModel.scala @@ -71,6 +71,8 @@ object LiteralModel { def quote(str: String): LiteralModel = LiteralModel(s"\"$str\"", LiteralType.string) def number(n: Int): LiteralModel = LiteralModel(n.toString, LiteralType.forInt(n)) + + def bool(b: Boolean): LiteralModel = LiteralModel(b.toString.toLowerCase, LiteralType.bool) } sealed trait PropertyModel {