From 4e5d9570ad42f3380422322ad7eac4cefad14549 Mon Sep 17 00:00:00 2001 From: Pascal Date: Wed, 29 Jan 2020 01:19:11 -0600 Subject: [PATCH] [add][mod] added getKey and getKeyOrElse for Map[String, Any] in mapUtil - [mod] use getKey and getKeyOrElse from mapUtil in FunctionArgs --- src/main/scala/scim/datastruct/Configuration.scala | 10 +++++----- src/main/scala/scim/lib/Library.scala | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/scala/scim/datastruct/Configuration.scala b/src/main/scala/scim/datastruct/Configuration.scala index 0a7538f..a19d139 100644 --- a/src/main/scala/scim/datastruct/Configuration.scala +++ b/src/main/scala/scim/datastruct/Configuration.scala @@ -3,6 +3,7 @@ package scim.datastruct import scim.lib.ConcurrentBroadcast._ import scim.lib.simInterfaces._ import scim.lib.configInterfaces._ +import scim.lib.mapUtil._ import scala.collection.parallel.ForkJoinTaskSupport import scala.util.control.NonFatal @@ -125,23 +126,22 @@ case class Group(name: String, sensorParent: Option[String] = None){ case class Truth() extends Result[Option[Double]] case class FunctionArgs(args: Map[String, Any]) { def getParam[A](param: String): Option[A] = { - // just try to get the param, otherwise use fallback - try { Some(args(param).asInstanceOf[A]) } catch { case NonFatal(_) => None } + args.getKey[A](param) } def getParam[A](param: String, fallback: A): A = { - getParam(param).getOrElse(fallback) + args.getKeyOrElse[A](param, fallback) } } case class BehaviourVector(function: Vector[Option[(SimulationBehaviour, Option[FunctionArgs])]], defaultFunc: SimulationBehaviour = (_: Cell, _: Time, v: Option[Double], _: Option[FunctionArgs]) => v, - defaultArgs: Option[FunctionArgs] = None){ + defaultArgs: Option[FunctionArgs] = None) { def get(t: Time): (SimulationBehaviour, Option[FunctionArgs]) = { function(t.time).getOrElse((defaultFunc, defaultArgs)) } } -case class Behaviour(behaviour: BehaviourVector){ +case class Behaviour(behaviour: BehaviourVector) { def run(time: Time, cell: Cell, truth: Truth): Option[Double] = { val functionTuple = behaviour.get(time) val function = functionTuple._1 diff --git a/src/main/scala/scim/lib/Library.scala b/src/main/scala/scim/lib/Library.scala index b429d8d..5d3d4b4 100644 --- a/src/main/scala/scim/lib/Library.scala +++ b/src/main/scala/scim/lib/Library.scala @@ -6,6 +6,7 @@ import java.io.{File, FileInputStream} import scim.datastruct.FunctionArgs import scala.collection.immutable.ListMap +import scala.util.control.NonFatal @@ -117,6 +118,16 @@ package object convertUtil { package object mapUtil { + implicit class MapGet(map: Map[String, Any]) { + def getKey[A](key: String): Option[A] = { + // just try to get the param, otherwise use fallback + try { Some(map(key).asInstanceOf[A]) } catch { case NonFatal(_) => None } + } + def getKeyOrElse[A](key: String, fallback: A): A = { + getKey[A](key).getOrElse(fallback) + } + } + def traversableToMap[A, B](traversable: Traversable[Any], getTuple: (Any) => (A, B) = (e: Any) => e.asInstanceOf[(A, B)]._1 -> e.asInstanceOf[(A, B)]._2): Map[A, B] = { // Traversable[Tuple[A, B]] can be converted via .map // .foldLeft used in favor of .map().toMap as the latter needs two traversals