Home > Software engineering >  HMap with case objects as keys
HMap with case objects as keys

Time:09-21

I am trying to achieve something with Shapeless' HMap, but am not sure whether this is possible and if it is, then how would I go about it.

I want to use HMap as a map of user preferences where values can be of different types. This is what I mean:

object UserPreferences {
  sealed abstract class BooleanPreference
  case object IsStudent extends BooleanPreference
  case object SubscribedToNotifications extends BooleanPreference

  sealed abstract class StringPreference
  case object Language extends StringPreference

  class UserPreference[K, V]
  implicit val booleanPreferenceToBoolean = new UserPreference[BooleanPreference, Boolean]
  implicit val stringPreferenceToString = new PartialClientPref[StringPreferenceKey, String]
}

Then later on I have this map as a method argument:

import UserPreferences._

def someMethod(userPreferences: HMap[UserPreference]) {
  val userLanguage = userPreferences(Language)
}

The last code snippet doesn't compile. First it complaints about missing implicit parameter, but when I add stringPreferenceToString explicitly the compiler indicates that it requires UserPreference[UserPreferences.Language.type, NotInferredV] but found UserPreference[StringPreference, String]

CodePudding user response:

You need to widen Language to a StringPreference and import userPreferences._.

import UserPreferences._

def someMethod(userPreferences: HMap[UserPreference]) {
  import userPreferences._
  val userLanguage = userPreferences(Language: StringPreference)
}
  • Related