Transform/traverse无形的HMap

Transform/traverse Shapeless' HMap

Shapeless' HListOps 包括许多 useful functions 的异构 HList 类型。我找不到 HMap.

的等效项

这是我的目标。我有一个简单的 Map[String, String] ,它在我的应用程序的很多地方用作消息处理管道中的选项存储库。我现在想通过将其转换为 HMap 向该地图添加不同的 (Key => Value),因此它可能类似于:

class HOptionsMap[K, V]
implicit val intToString = new HOptionsMap[String, String]
implicit val stringToInt = new HOptionsMap[String, Instant]

所以我可以进一步使用它如下:

val hm = HMap[HOptionsMap]("placeOfIncident" -> "Toronto", "incidentDate" -> Instant.now)

除了我想调用上面的 collect, fold, filter 之类的操作,这些操作不受支持(与 HList 不同)。这是为了不破坏当前功能的要求。

当然我可以在这里使用组合,但我很好奇这是否可以通过 Shapeless 库实现。

如果 HMap 对您的用例来说是一个不方便的抽象,请尝试使用记录

import shapeless.syntax.singleton._

val hm = "placeOfIncident" ->> "Toronto" :: "incidentDate" ->> Instant.now :: HNil

你可以像任何东西一样收集、折叠、过滤它HList/record。

https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#extensible-records