TMap не работает как я ожидаю с ZIO RC18-2 - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь использовать TMap следующим образом:

Определить TMap:

val chatIdMapSTM: ChatIds = TMap.make(camunda_group -> camundaChatId, "pme123" -> 275469757L)

Поставить запись:

def registerChat(maybeId: Option[ChatUserOrGroup], chatId: ChatId): ZIO[Any, RegisterException, String] =
  (for {
    chatStm <- chatIdMapSTM
    _ <- maybeId.map(id => chatStm.put(id, chatId)).getOrElse(chatIdMapSTM)
    values <- chatStm.values // List(1212, 275469757, -319641852)
  } yield chatStm).commit
    .as("your chat was successful registered")

Затем попробуйте чтобы получить это значение:

def requestChat(chatUserOrGroup: ChatUserOrGroup): UIO[ChatId] =
  (for {
    chatStm <- chatIdMapSTM
    values <- chatStm.values // List(275469757, -319641852)
    chatId <- chatStm.getOrElse(chatUserOrGroup, camundaChatId)
  } yield chatId).commit

Как отмечается в комментариях, когда я запрашиваю запись, новое значение отсутствует.

Я что-то пропустил?

1 Ответ

1 голос
/ 26 марта 2020

Кажется, вы никогда не фиксировали карту чата, поэтому вы всегда "начинаете с нуля". Смотрите следующий рабочий пример:

import zio._
import zio.console._
import zio.stm._

object ChatsExample extends App {
  def run(args: List[String]) =
    for {
      map  <- chatIdMapSTM.commit
      res  <- registerChat(map, "dejan", 123L)
      _    <- putStrLn(res)
      chat <- requestChat(map, "dejan")
      _    <- putStrLn(s"Found id: $chat")
      vals <- map.values.commit
      _    <- putStrLn(vals.mkString(","))
    } yield 0

  val camundaChatId = 0L
  val chatIdMapSTM  = TMap.make("camunda" -> camundaChatId, "pme123" -> 275469757L)

  def registerChat(chats: TMap[String, Long], userId: String, chatId: Long) =
    (chats.put(userId, chatId).as("your chat was successfully registered")).commit

  def requestChat(chats: TMap[String, Long], userId: String) =
    chats.getOrElse(userId, camundaChatId).commit
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...