2022-12-01 12:07:05 +00:00
|
|
|
package com.htmlism.firepower.demo
|
|
|
|
|
2022-12-04 23:17:31 +00:00
|
|
|
import scala.util.chaining._
|
|
|
|
|
2022-12-04 22:15:29 +00:00
|
|
|
import cats.syntax.all._
|
|
|
|
|
2022-12-04 20:40:37 +00:00
|
|
|
import com.htmlism.firepower.demo.asm._
|
|
|
|
import com.htmlism.firepower.demo.str._
|
2022-12-01 11:50:22 +00:00
|
|
|
import zio.*
|
|
|
|
|
|
|
|
import java.io.IOException
|
2022-12-04 20:40:37 +00:00
|
|
|
import com.htmlism.rufio.withzio.*
|
2022-12-01 13:17:33 +00:00
|
|
|
|
2022-12-01 11:50:22 +00:00
|
|
|
object PrintPrograms extends ZIOAppDefault:
|
2022-12-04 18:26:52 +00:00
|
|
|
private def writeLine(file: String)(s: String) =
|
|
|
|
File(s"data/$file.txt")
|
|
|
|
.writeLine(s)
|
|
|
|
|
|
|
|
private val programs =
|
|
|
|
List[(String, String)](
|
2022-12-04 18:59:02 +00:00
|
|
|
"one-line.txt" -> "one line",
|
2022-12-04 23:17:31 +00:00
|
|
|
"two-lines.txt" -> List("foo", "bar")
|
|
|
|
.pipe(Line.mkString),
|
|
|
|
"two-paragraphs.txt" -> List(
|
|
|
|
List("foo", "bar"),
|
|
|
|
List("alpha", "bravo")
|
|
|
|
)
|
|
|
|
.pipe(xxs => AsmBlock.interFlatMap(xxs)(List("", ""), identity))
|
|
|
|
.pipe(Line.mkString),
|
|
|
|
"annotated-snake.asm" -> List(
|
|
|
|
CommentBlock.fromMultiline(asciiArt),
|
|
|
|
CommentBlock(List("Change direction: W A S D")),
|
|
|
|
AnonymousCodeBlock(
|
2022-12-04 19:28:36 +00:00
|
|
|
List(
|
2022-12-04 23:17:31 +00:00
|
|
|
AsmBlock.Intent(
|
|
|
|
None,
|
|
|
|
List(
|
|
|
|
AsmBlock.Intent.Instruction("lda $00", None),
|
|
|
|
AsmBlock.Intent.Instruction("lda $01", "instruction comment".some)
|
|
|
|
)
|
|
|
|
),
|
|
|
|
AsmBlock.Intent(
|
|
|
|
"this block has some preamble".some,
|
|
|
|
List(
|
|
|
|
AsmBlock.Intent.Instruction("lda $00", None),
|
|
|
|
AsmBlock.Intent.Instruction("lda $01", "instruction comment".some)
|
|
|
|
)
|
|
|
|
)
|
2022-12-04 19:28:36 +00:00
|
|
|
)
|
|
|
|
),
|
2022-12-04 23:17:31 +00:00
|
|
|
NamedCodeBlock(
|
|
|
|
"labeled",
|
|
|
|
"This is a subroutine description".some,
|
2022-12-04 19:28:36 +00:00
|
|
|
List(
|
2022-12-04 23:17:31 +00:00
|
|
|
AsmBlock.Intent(
|
|
|
|
None,
|
2022-12-04 22:15:29 +00:00
|
|
|
List(
|
2022-12-04 23:17:31 +00:00
|
|
|
AsmBlock.Intent.Instruction("lda $00", None),
|
|
|
|
AsmBlock.Intent.Instruction("lda $01", "instruction comment".some)
|
2022-12-04 22:15:29 +00:00
|
|
|
)
|
|
|
|
),
|
2022-12-04 23:17:31 +00:00
|
|
|
AsmBlock.Intent(
|
|
|
|
"this block has some preamble".some,
|
2022-12-04 22:15:29 +00:00
|
|
|
List(
|
2022-12-04 23:17:31 +00:00
|
|
|
AsmBlock.Intent.Instruction("lda $00", None),
|
|
|
|
AsmBlock.Intent.Instruction("lda $01", "instruction comment".some)
|
2022-12-04 22:15:29 +00:00
|
|
|
)
|
|
|
|
)
|
2022-12-04 19:28:36 +00:00
|
|
|
)
|
|
|
|
)
|
2022-12-04 23:17:31 +00:00
|
|
|
)
|
|
|
|
.map(AsmBlock.toLines)
|
|
|
|
.pipe(xs => AsmBlock.interFlatMap(xs)(List("", ""), identity))
|
|
|
|
.pipe(Line.mkString)
|
2022-12-04 18:26:52 +00:00
|
|
|
)
|
2022-12-04 18:01:22 +00:00
|
|
|
|
2022-12-04 23:17:31 +00:00
|
|
|
private lazy val asciiArt =
|
2022-12-04 18:59:02 +00:00
|
|
|
""" ___ _ __ ___ __ ___
|
|
|
|
|/ __|_ _ __ _| |_____ / /| __|/ \_ )
|
|
|
|
|\__ \ ' \/ _` | / / -_) _ \__ \ () / /
|
|
|
|
||___/_||_\__,_|_\_\___\___/___/\__/___|""".stripMargin
|
|
|
|
|
2022-12-04 18:26:52 +00:00
|
|
|
def run: Task[Unit] =
|
|
|
|
for {
|
|
|
|
// just a traverse in slow motion...
|
|
|
|
_ <- programs
|
|
|
|
.map { case (f, s) => File(s"data/$f").writeLine(s) }
|
|
|
|
.foldLeft[Task[Unit]](ZIO.unit)((acc, z) => acc *> z)
|
2022-12-04 18:01:22 +00:00
|
|
|
} yield ()
|