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.

Maps.kt 1.1KB

1234567891011121314151617181920212223242526272829
  1. package com.dmdirc.ktirc.model
  2. import com.dmdirc.ktirc.io.CaseMapping
  3. abstract class CaseInsensitiveMap<T>(private val caseMappingProvider: () -> CaseMapping, private val nameOf: (T) -> String) : Iterable<T> {
  4. private val values = HashSet<T>()
  5. operator fun get(name: String) = values.find { caseMappingProvider().areEquivalent(nameOf(it), name) }
  6. operator fun plusAssign(value: T) {
  7. require(get(nameOf(value)) == null) { "Value already registered: ${nameOf(value)}"}
  8. values.add(value)
  9. }
  10. operator fun minusAssign(name: String) {
  11. values.removeIf { caseMappingProvider().areEquivalent(nameOf(it), name) }
  12. }
  13. operator fun contains(name: String) = get(name) != null
  14. override fun iterator() = values.iterator()
  15. fun clear() = values.clear()
  16. }
  17. class ChannelStateMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelState>(caseMappingProvider, ChannelState::name)
  18. class ChannelUserMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelUser>(caseMappingProvider, ChannelUser::nickname)