You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.9 KiB
75 lines
1.9 KiB
package nova.monadic_sfx.util.reactive
|
|
|
|
import java.time.LocalDateTime
|
|
|
|
import io.circe.Encoder
|
|
import io.circe.Printer
|
|
import io.circe.generic.JsonCodec
|
|
import io.circe.syntax._
|
|
import io.odin.Logger
|
|
import io.odin.LoggerMessage
|
|
import io.odin.formatter.options.PositionFormat
|
|
import io.odin.formatter.options.ThrowableFormat
|
|
import io.odin.meta.Render
|
|
import monix.bio.Task
|
|
import monix.reactive.Observable
|
|
// object Middleware {
|
|
// def apply[A,M,T](ob: Observable[(A,M)], cb: (A,M) => T): Observable[(A,M)] = ob
|
|
// }
|
|
|
|
@JsonCodec
|
|
final case class StoreInfo[A](
|
|
name: String,
|
|
action: A,
|
|
time: LocalDateTime = LocalDateTime.now()
|
|
)
|
|
|
|
object StoreInfo {
|
|
val printer = Printer.noSpaces
|
|
implicit def render[T: Encoder]: Render[StoreInfo[T]] =
|
|
new Render[StoreInfo[T]] {
|
|
override def render(m: StoreInfo[T]): String = printer.print(m.asJson)
|
|
}
|
|
}
|
|
|
|
object Middlewares {
|
|
|
|
// val encoder: Encoder[LoggerMessage] =
|
|
// Encoder.forProduct1("message")(m => m.message.value)
|
|
|
|
val format = create(ThrowableFormat.Default, PositionFormat.Full)
|
|
|
|
def create(
|
|
throwableFormat: ThrowableFormat,
|
|
positionFormat: PositionFormat
|
|
): io.odin.formatter.Formatter = {
|
|
// val encoder: Encoder[LoggerMessage] =
|
|
// Encoder.forProduct1("message")(m => m.message.value)
|
|
(msg: LoggerMessage) => msg.message.value
|
|
}
|
|
|
|
def actionStateLoggerMiddleware[A, M](
|
|
logger: Logger[Task]
|
|
): Task[Middleware[A, M]] =
|
|
Task.deferAction(implicit s =>
|
|
Task((obs: Observable[(A, M)]) =>
|
|
obs.doOnNextF {
|
|
case (a, m) =>
|
|
logger.debug(s"Received action $a with state $m")
|
|
}
|
|
)
|
|
)
|
|
|
|
def actionLoggerMiddleware[A: Encoder, M](
|
|
logger: Logger[Task],
|
|
name: String
|
|
): Task[Middleware[A, M]] =
|
|
Task.deferAction(implicit s =>
|
|
Task((obs: Observable[(A, M)]) =>
|
|
obs.doOnNextF {
|
|
case (a, _) =>
|
|
logger.debug(StoreInfo(name, a))
|
|
}
|
|
)
|
|
)
|
|
}
|