Advertisement
Guest User

Untitled

a guest
May 6th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.15 KB | None | 0 0
  1. package mi.scala.utils.abstractions
  2.  
  3. import cats.kernel.Monoid
  4. import mi.scala.utils.math.Interval
  5.  
  6. object Mapping {
  7.  
  8.   implicit def toAB[A, B](mapping: Mapping[A, B]): A => B = mapping.fun
  9.  
  10.   case class IntervalMapping[A, +B](interval: Interval[A], f: Mapping[A, B])(implicit m: Monoid[B]) extends Mapping[A, B] with OptionMapping[A, B] {
  11.     def funOption(v: A): Option[B] = Option.when(interval.contains(v))(f(v))
  12.  
  13.     def fun(v: A): B = funOption(v).getOrElse(m.empty)
  14.   }
  15.  
  16.  
  17.   case class CombinedMapping[-A, +B](mappings: Seq[Mapping[A, B]])(implicit m: Monoid[B]) extends Mapping[A, B] {
  18.     override def fun(v: A): B = m.combineAll(mappings.map(_.fun(v)))
  19.   }
  20.  
  21.   case class CombinedOptionMapping[-A, +B](mappings: Seq[OptionMapping[A, B]])(implicit m: Monoid[B]) extends OptionMapping[A, B] {
  22.     override def funOption(v: A): Option[B] = mappings.flatMap(m => m.funOption(v)).reduceOption(m.combine)
  23.   }
  24.  
  25. }
  26.  
  27. trait Mapping[-A, +B] {
  28.   def fun(v: A): B
  29. }
  30.  
  31. trait OptionMapping[-A, +B] {
  32.   def funOption(v: A): Option[B]
  33. }
  34. /////использование
  35.  val lodLevels:Mapping[Float, Int] = CombinedMapping(Seq(
  36.       IntervalMapping[Float,Int](Interval(Float.MinValue, 0, containsEnd = false ), _ => 0),
  37.       IntervalMapping[Float,Int](Interval(0, 64, containsEnd = false ), _ => 0),
  38.       IntervalMapping[Float,Int](Interval(64, 128, containsEnd = false ), _ => 1),
  39.       IntervalMapping[Float,Int](Interval(128, 256, containsEnd = false ), _ => 2),
  40.       IntervalMapping[Float,Int](Interval(256, 512, containsEnd = false ), _ => 3),
  41.       IntervalMapping[Float,Int](Interval(512, 768, containsEnd = false ), _ => 4),
  42.       IntervalMapping[Float,Int](Interval(768, 1024, containsEnd = false ), _ => 5),
  43.       IntervalMapping[Float,Int](Interval(1024, 1536, containsEnd = false ), _ => 6),
  44.       IntervalMapping[Float,Int](Interval(1536, 2048, containsEnd = false ), _ => 7),
  45.       IntervalMapping[Float,Int](Interval(2048, 4096, containsEnd = false ), _ => 8),
  46.       IntervalMapping[Float,Int](Interval(4096, 8192, containsEnd = false ), _ => 9),
  47.       IntervalMapping[Float,Int](Interval(8192, Float.MaxValue, containsEnd = true), _ => 10)
  48.     ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement