Преобразование/пересечение бесформенной» HMap

#scala #generics #shapeless

Вопрос:

Бесформенный » HListOps включает в себя ряд полезных функций для их разнородного HList типа. Я не мог найти эквивалент для HMap .

Вот моя цель. У меня есть простой Map[String, String] , который используется в качестве хранилища параметров в конвейере обработки сообщений во многих местах моего приложения. Теперь я хотел бы добавить что-то другое (Key => Value) к этой карте, преобразовав ее в HMap, чтобы это могло быть что-то вроде:

 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 ). Это требование необходимо для того, чтобы не нарушать текущую функциональность.

Конечно, я мог бы использовать композицию здесь, но мне было бы любопытно, будет ли это достижимо с Бесформенной библиотекой.

Ответ №1:

Если HMap это неудобная абстракция для вашего варианта использования, попробуйте использовать запись

 import shapeless.syntax.singleton._

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

Вы можете собирать, складывать, фильтровать его как любой список/запись.

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