Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.90 KB | None | 0 0
  1. class SuperNumber[T](val list: List[T]) {
  2.   def sum(othr: SuperNumber[T])(implicit processor: Processor[T]): SuperNumber[T] = {
  3.     processor.sum(this, othr)
  4.   }
  5.  
  6.   def ||(othr: SuperNumber[T])(implicit logic: Processor.Logic[T]): SuperNumber[T] = {
  7.     logic.or(this, othr)
  8.   }
  9.  
  10.   def &&(othr: SuperNumber[T])(implicit logic: Processor.Logic[T]): SuperNumber[T] = {
  11.     logic.and(this, othr)
  12.   }
  13.  
  14. }
  15.  
  16. abstract class Processor[T] {
  17.   def sum(a: SuperNumber[T], b: SuperNumber[T]): SuperNumber[T]
  18. }
  19.  
  20. object Processor {
  21.  
  22.   implicit object int extends Processor[Int] {
  23.     override def sum(a: SuperNumber[Int], b: SuperNumber[Int]): SuperNumber[Int] = {
  24.       new SuperNumber[Int]((a.list, b.list).zipped.map(_ + _))
  25.     }
  26.   }
  27.  
  28.   abstract class Logic[T] extends Processor[T] {
  29.     def or(a: SuperNumber[T], b: SuperNumber[T]): SuperNumber[T]
  30.     def and(a: SuperNumber[T], b: SuperNumber[T]): SuperNumber[T]
  31.   }
  32.  
  33.   implicit object bool extends Logic[Boolean] {
  34.  
  35.     val binarySum: (Boolean, List[Boolean], List[Boolean]) => List[Boolean] = {
  36.       case (flag, Nil, Nil) if flag => List(flag)
  37.       case (flag, Nil, Nil) if !flag => List()
  38.       case (flag, Nil, second) if !flag => second
  39.       case (flag, Nil, s::second) if flag => if(s) false::binarySum(true, Nil, second) else true::binarySum(false, Nil, second)
  40.       case (flag, first, Nil) if !flag => first
  41.       case (flag, f::first, Nil) if flag => if(f) false::binarySum(true, Nil, first) else true::binarySum(false, Nil, first)
  42.       case (flag, f :: first, s :: second) if !flag => if (f && s || !f && !s) false :: binarySum(f && s, first, second) else true :: binarySum(false, first, second)
  43.       case (flag, f :: first, s :: second) if flag => if (f && s || !f && !s) true :: binarySum(f && s, first, second) else false :: binarySum(true, first, second)
  44.     }
  45.  
  46.     override def or(a: SuperNumber[Boolean], b: SuperNumber[Boolean]): SuperNumber[Boolean] = {
  47.       new SuperNumber[Boolean]((a.list.reverse, b.list.reverse).zipped.map(_ | _).reverse)
  48.     }
  49.  
  50.     override def and(a: SuperNumber[Boolean], b: SuperNumber[Boolean]): SuperNumber[Boolean] = {
  51.       new SuperNumber[Boolean]((a.list.reverse, b.list.reverse).zipped.map(_ & _).reverse)
  52.     }
  53.  
  54.     override def sum(a: SuperNumber[Boolean], b: SuperNumber[Boolean]): SuperNumber[Boolean] = {
  55.       new SuperNumber[Boolean](binarySum(false, a.list.reverse, b.list.reverse).reverse)
  56.     }
  57.   }
  58.  
  59. }
  60.  
  61. object Hello {
  62.   def main(args: Array[String]): Unit = {
  63.     val s1 = new SuperNumber[Int](List(1, 2, 3))
  64.     val s2 = new SuperNumber[Boolean](List( false,true, true))
  65.     val s3 = new SuperNumber[Boolean](List( true ,true, true))
  66.     println(s1.sum(new SuperNumber[Int](List(3, 2, 1))).list)
  67.     println((s2 sum s3).list)
  68.     println((s2 && new SuperNumber[Boolean](List(true, true, false))).list)
  69.     println((s2 || new SuperNumber[Boolean](List(true, true, false))).list)
  70.  
  71.   }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement