All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.coursera.naptime.model.Keyed.scala Maven / Gradle / Ivy

There is a newer version: 0.9.0-alpha5
Show newest version
/*
 * Copyright 2016 Coursera Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.coursera.naptime.model

import play.api.libs.json.OWrites
import play.api.libs.json.Reads
import play.api.libs.json.__

case class Keyed[+Key, +Value](key: Key, value: Value) {

  def mapValue[T](f: Value => T): Keyed[Key, T] = copy(value = f(value))

  def tuple: (Key, Value) = (key, value)

}

object Keyed {

  def tupled[K, V]: Tuple2[K, V] => Keyed[K, V] = Function.tupled(apply)

  implicit def reads[Key, Value](
      implicit keyFormat: KeyFormat[Key],
      valueReads: Reads[Value]): Reads[Keyed[Key, Value]] = {

    import play.api.libs.functional.syntax._

    val builder = __.read[Key](keyFormat.format) and __.read[Value]
    builder(apply[Key, Value] _)
  }

  implicit def writes[Key, Value](
      implicit keyFormat: KeyFormat[Key],
      valueWrites: OWrites[Value]): OWrites[Keyed[Key, Value]] = {

    OWrites[Keyed[Key, Value]] { case Keyed(key, value) =>
      val keyObject = keyFormat.format.writes(key)
      val valueObject = valueWrites.writes(value)

      val conflictingKeys = keyObject.keys.intersect(valueObject.keys)
      require(conflictingKeys.isEmpty, s"Conflicting key and value fields: $conflictingKeys")

      keyObject ++ valueObject
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy