Skip to content

Commit

Permalink
up
Browse files Browse the repository at this point in the history
  • Loading branch information
mio-19 committed Sep 19, 2024
1 parent 5b23f50 commit 5f2cb10
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 7 deletions.
38 changes: 38 additions & 0 deletions common/js/src/main/scala/chester/io/XtermReadline.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package chester.io

import chester.repl.{ReadLineResult, TerminalInfo, TerminalInit}
import typings.std.global.setTimeout
import typings.xtermXterm.mod as xterm
import typings.xtermReadline.mod.Readline

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Promise}
import scala.scalajs.js
import scala.scalajs.js.annotation.JSExportTopLevel
import scala.scalajs.js.Thenable.Implicits.*
import scala.scalajs.js.JSConverters.*
import scala.concurrent.ExecutionContext.Implicits.global


def setTimeoutThen: Future[Unit] = {
val promise = Promise[Unit]()
setTimeout(() => promise.success(()), 0)
promise.future
}

final class InXtermReadline(rl: Readline) extends InTerminalNoHistory[Future] {
inline override def writeln(line: fansi.Str): Future[Unit] = {
rl.println(line.render)
setTimeoutThen
}

override inline def readALine(prompt: fansi.Str): Future[String] = {
rl.read(prompt.render)
}
}

case class XtermReadline(rl: Readline) extends Terminal[Future] {
def runTerminal[T](init: TerminalInit, block: InTerminal[Future] ?=> Future[T]): Future[T] = {
block(using InXtermReadline(rl))
}
}
9 changes: 2 additions & 7 deletions common/js/src/main/scala/chester/io/XtermTerminal.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ import typings.xtermXterm.mod
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Promise}

final class InXterm(terminal: mod.Terminal, init: TerminalInit) extends AbstractInTerminal[Future] {


def initHistory: Future[Seq[String]] = Future.successful(Vector())
final class InXterm(terminal: mod.Terminal, init: TerminalInit) extends InTerminalNoHistory[Future] {

inline override def writeln(line: fansi.Str): Future[Unit] = {
val promise = Promise[Unit]()
Expand Down Expand Up @@ -74,9 +71,7 @@ final class InXterm(terminal: mod.Terminal, init: TerminalInit) extends Abstract

case class XtermTerminal(terminal: mod.Terminal) extends Terminal[Future] {
def runTerminal[T](init: TerminalInit, block: InTerminal[Future] ?=> Future[T]): Future[T] = {
val future =
block(using new InXterm(terminal, init))
future
block(using new InXterm(terminal, init))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import chester.parser.InputStatus.{Complete, Error, Incomplete}
import chester.parser.ParserEngine
import chester.repl.*

abstract class InTerminalNoHistory[F[_]](using runner: Runner[F]) extends AbstractInTerminal[F] {

def initHistory: F[Seq[String]] = Runner.pure(Vector())

}
abstract class AbstractInTerminal[F[_]](using runner: Runner[F]) extends InTerminal[F] {
private var history: Vector[String] = Vector()
private var currentInputs: String = ""
Expand Down

0 comments on commit 5f2cb10

Please sign in to comment.