Re: Filter on future doesn't make sense
Viktor Klang <[email protected]> Fri, 1 Jul 2016 20:48:26 +0200
| Newsgroups | gmane.comp.lang.scala |
|---|---|
| Message-ID | <CANPzfU_AeG6sTVME4+Gx_LgPY2=-Wm3wvqSz72VJTS87RUh-+A@mail.gmail.com> |
--001a1134feceb5a44e0536976f47 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Fri, Jul 1, 2016 at 8:12 PM, Avi Levi <[email protected]> wrote: > Viktor, Oliver > I guess you are correct . > But > scala> Some(1).filter(_ =3D=3D 0) > res0: Option[Int] =3D None > scala> Set(1, 2, 3).filter(_ =3D=3D 0) > res1: scala.collection.immutable.Set[Int] =3D Set() > BUT > val x =3D Future{1}.filter(_ =3D=3D 0) > Failure(java.util.NoSuchElementException: Future.filter predicate is not > satisfied)) > So you'd be happy(?) if the toString on a failed future said "Future()"? (Keep in mind the comment I had about toString earlier in the thread :)) > > > > 2016-07-01 20:52 GMT+03:00 Viktor Klang <[email protected]>: > >> Hi Avi, >> >> I'm unsure "seems odd" can be discussed successfully, I'm afraid. >> >> As have been demonstrated, filter on Future behaves semantically >> equivalent to the methods used by for-comprehensions (map, flatMap, >> filter/withFilter and foreach) >> >> -- >> Cheers, >> =E2=88=9A >> On Jul 1, 2016 4:17 PM, "Avi Levi" <[email protected]> wrote: >> >>> Hi Ronald , >>> taking the example above >>> scala>val x =3D Future{1}.filter(_ =3D=3D 0) >>> scala>x.value >>> res2: Option[scala.util.Try[Int]] =3D >>> Some(Failure(java.util.NoSuchElementException: Future.filter predicate = is >>> not satisfied)) >>> >>> It seems odd that a legit action such as filter yields a failure with a= n >>> exception . >>> >>> Cheers >>> Avi >>> >>> >>> 2016-07-01 17:02 GMT+03:00 Roland Kuhn <[email protected]>: >>> >>>> Well =E2=80=A6 technically (and no, this is NOT a good idea, and hence= it looks >>>> a little odd): >>>> >>>> scala> import concurrent._ >>>> import concurrent._ >>>> >>>> scala> import ExecutionContext.Implicits._ >>>> import ExecutionContext.Implicits._ >>>> >>>> scala> import duration._ >>>> import duration._ >>>> >>>> scala> Future(42) >>>> res0: scala.concurrent.Future[Int] =3D >>>> scala.concurrent.impl.Promise$DefaultPromise@25bbf683 >>>> >>>> scala> Await.ready(res0, 1.second).value.get.toOption >>>> res1: Option[Int] =3D Some(42) >>>> >>>> scala> Await.ready(res0.filter(_ =3D=3D 1), 1.second).value.get.toOpti= on >>>> res2: Option[Int] =3D None >>>> >>>> Regards, >>>> >>>> Roland >>>> >>>> 1 juli 2016 kl. 15:18 skrev Oliver Ruebenacker <[email protected]>: >>>> >>>> >>>> Hello Roland, >>>> >>>> Option has get, getOrElse and the possibility to match against >>>> Some(value), but Future does not have these. >>>> >>>> Best, Oliver >>>> >>>> On Fri, Jul 1, 2016 at 9:06 AM, Roland Kuhn <[email protected]> wrote: >>>> >>>>> The difference is that Option does not have onComplete: if you >>>>> restrict yourself to the Option API then Future behaves observably in= the >>>>> same way. If you want to have something like onComplete you should lo= ok at Either[NoSuchElementException, >>>>> T]#fold. >>>>> >>>>> In general there is no .filter on monads because that would require >>>>> the explicit ability to represent emptiness (which is not part of the >>>>> contract); the success path for the combinators could be seen as such= a >>>>> representation and it is indeed often used as such, so Future is quit= e >>>>> well-behaved in this regard. Another comment I=E2=80=99d like to make= on the >>>>> discussed change is that it is not reasonable to expect that the resu= lt of >>>>> filtering returns a different type than the original one=E2=80=94no o= ther container >>>>> has this behavior. >>>>> >>>>> Regards, >>>>> >>>>> Roland >>>>> >>>>> >>>>> 1 juli 2016 kl. 14:54 skrev Oliver Ruebenacker <[email protected]>: >>>>> >>>>> >>>>> Hello, >>>>> >>>>> Looks like sometimes you do get an exception: >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> *Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java >>>>> 1.8.0_45).Type in expressions for evaluation. Or try :help.scala> imp= ort >>>>> scala.concurrent.Futureimport scala.concurrent.Futurescala> import >>>>> scala.concurrent.ExecutionContext.Implicits.globalimport >>>>> scala.concurrent.ExecutionContext.Implicits.globalscala> >>>>> Future{1}.onComplete { case _ =3D> println("Complete!") }scala> >>>>> Complete!scala> Future{1}.filter(_ =3D=3D 0).onComplete { case _ =3D> >>>>> println("Complete!") }Complete!scala> import scala.util.{Success, Fai= lure >>>>> }import scala.util.{Success, Failure}scala> Future{1}.filter(_ =3D=3D >>>>> 0).onComplete { | case Success(value) =3D> println(value) | c= ase >>>>> Failure(ex) =3D> println(ex) | }java.util.NoSuchElementException: >>>>> Future.filter predicate is not satisfiedscala>* >>>>> >>>>> Best, Oliver >>>>> >>>>> >>>>> On Fri, Jul 1, 2016 at 5:44 AM, Viktor Klang <[email protected]> >>>>> wrote: >>>>> >>>>>> I think you are conflating the notion of optionality here. >>>>>> >>>>>> option.filter(p).map(f).foreach(println) >>>>>> >>>>>> behaves exactly like >>>>>> >>>>>> future.filter(p).map(f).foreach(println) >>>>>> >>>>>> -- >>>>>> Cheers, >>>>>> =E2=88=9A >>>>>> On Jul 1, 2016 11:36 AM, "Avi Levi" <[email protected]> wrote: >>>>>> >>>>>>> Correct, just on future you get an exception if element does not >>>>>>> pass the filter. Wouldn't it be better if we can get something that= express >>>>>>> an empty future? >>>>>>> On Jul 1, 2016 12:30 PM, "Viktor Klang" <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> But you don't get an exception on the success path. All operations >>>>>>>> on the success path will be skipped, just as for Option. >>>>>>>> >>>>>>>> -- >>>>>>>> Cheers, >>>>>>>> =E2=88=9A >>>>>>>> On Jul 1, 2016 10:35 AM, "Avi Levi" <[email protected]> wrote: >>>>>>>> >>>>>>>>> Hi Victor , >>>>>>>>> I totally agree that expectations are subjective . >>>>>>>>> But like you said a filter on List will return a List if no >>>>>>>>> element comply than we will get Nil which represents an empty con= tainer >>>>>>>>> (empty list) >>>>>>>>> a filter on option will return a option if the element doesn't >>>>>>>>> comply than we will get None which represents an empty container >>>>>>>>> following the same logic a filter on future should return >>>>>>>>> something that express empty container , defiantly not an excepti= on, >>>>>>>>> because it is not an exception we do intend to filter those eleme= nts. >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> 2016-07-01 10:50 GMT+03:00 Viktor Klang <[email protected]>: >>>>>>>>> >>>>>>>>>> Hi Avi, >>>>>>>>>> >>>>>>>>>> I see what you mean. >>>>>>>>>> >>>>>>>>>> I'd want to avoid discussing expectation since it is subjective. >>>>>>>>>> I will however note that the actualnsemantics of the filter meth= od on >>>>>>>>>> Future needs improvement: >>>>>>>>>> http://www.scala-lang.org/api/2.11.8/index.html#scala.concurrent= .Future@filter(p:T=3D >>>>>>>>>> >Boolean)(implicitexecutor:scala.concurrent.ExecutionContext):sc= ala.concurrent.Future[T] >>>>>>>>>> >>>>>>>>>> As for might not return the value, the same goes for all >>>>>>>>>> filter-methods: >>>>>>>>>> >>>>>>>>>> List returns List, but it might not have any elements at all. >>>>>>>>>> Option returns Option but can be Some or None, Future is either = Success or >>>>>>>>>> Failure. >>>>>>>>>> >>>>>>>>>> If success has an optionality aspect in your usage, use Future o= f >>>>>>>>>> Option to express that, that would be my recommendation. >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Cheers, >>>>>>>>>> =E2=88=9A >>>>>>>>>> On Jul 1, 2016 9:20 AM, "Avi Levi" <[email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> Thanks Victor, >>>>>>>>>>> Of course it can be implemented as you suggested. But still I >>>>>>>>>>> can argue that the current implementation is not "really filter= ing" the >>>>>>>>>>> results as one might expect and less expressive if it might or = not return >>>>>>>>>>> the value than Option is more expressive, don't you agree? >>>>>>>>>>> On Jul 1, 2016 10:06 AM, "Viktor Klang" <[email protected]= > >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Avi, >>>>>>>>>>>> >>>>>>>>>>>> Use Fututre[Option[Int]] if you want to deal with Some/None as >>>>>>>>>>>> a result of filter ( f.map(_.filter(p) ) (alt. see monad trans= formers) >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Cheers, >>>>>>>>>>>> =E2=88=9A >>>>>>>>>>>> On Jul 1, 2016 8:53 AM, "Avi Levi" <[email protected]> wrote: >>>>>>>>>>>> >>>>>>>>>>>> I was trying to figure out what should I accept when filtering >>>>>>>>>>>> over a future . >>>>>>>>>>>> the current implementation yields either a T or an exception >>>>>>>>>>>> which kind of breaks referential transparency (doesn't it ?) . >>>>>>>>>>>> on the other hand what can I expect given this expression >>>>>>>>>>>> >>>>>>>>>>>> *def foo(i:Int):Future[Int]* >>>>>>>>>>>> >>>>>>>>>>>> the type result of >>>>>>>>>>>> >>>>>>>>>>>> *foo(1).filter(_ % 2 =3D=3D 0)* >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> I.M.H.O I would expect it to yield Option[T] which makes more >>>>>>>>>>>> sense to express that we might get a value that pass the filte= r or not . is >>>>>>>>>>>> that make sense ? >>>>>>>>>>>> >>>>>>>>>>>> Cheers >>>>>>>>>>>> Avi >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>>> Google Groups "scala-language" group. >>>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>>> it, send an email to >>>>>>>>>>>> [email protected]. >>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> You received this message because you are subscribed to a topi= c >>>>>>>>>>>> in the Google Groups "scala-language" group. >>>>>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/u= nsubscribe >>>>>>>>>>>> . >>>>>>>>>>>> To unsubscribe from this group and all its topics, send an >>>>>>>>>>>> email to [email protected]. >>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>> Google Groups "scala-language" group. >>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>> it, send an email to [email protected]= m >>>>>>>>>>> . >>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to a topic >>>>>>>>>> in the Google Groups "scala-language" group. >>>>>>>>>> To unsubscribe from this topic, visit >>>>>>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/uns= ubscribe >>>>>>>>>> . >>>>>>>>>> To unsubscribe from this group and all its topics, send an email >>>>>>>>>> to [email protected]. >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Sincerely, >>>>>>>>> Avi Levi >>>>>>>>> m: +972-52-3459959 >>>>>>>>> <https://www.linkedin.com/in/leviavi> >>>>>>>>> https://about.me/avi.levi >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Googl= e >>>>>>>>> Groups "scala-language" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to [email protected]. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to a topic in >>>>>>>> the Google Groups "scala-language" group. >>>>>>>> To unsubscribe from this topic, visit >>>>>>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsub= scribe >>>>>>>> . >>>>>>>> To unsubscribe from this group and all its topics, send an email t= o >>>>>>>> [email protected]. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "scala-language" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "scala-language" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> Oliver Ruebenacker >>>>> Senior Software Engineer, Diabetes Portal >>>>> <http://www.type2diabetesgenetics.org/>, Broad Institute >>>>> <http://www.broadinstitute.org/> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "scala-language" group. >>>>> To unsubscribe from this group and stop receiving emails from it, sen= d >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "scala-language" group. >>>>> To unsubscribe from this group and stop receiving emails from it, sen= d >>>>> an email to [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> >>>> -- >>>> Oliver Ruebenacker >>>> Senior Software Engineer, Diabetes Portal >>>> <http://www.type2diabetesgenetics.org/>, Broad Institute >>>> <http://www.broadinstitute.org/> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "scala-language" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "scala-language" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscri= be >>>> . >>>> To unsubscribe from this group and all its topics, send an email to >>>> [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> >>> -- >>> Sincerely, >>> Avi Levi >>> m: +972-52-3459959 >>> <https://www.linkedin.com/in/leviavi> >>> https://about.me/avi.levi >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "scala-language" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "scala-language" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe= . >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Sincerely, > Avi Levi > m: +972-52-3459959 > <https://www.linkedin.com/in/leviavi> > https://about.me/avi.levi > > -- > You received this message because you are subscribed to the Google Groups > "scala-language" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > --=20 Cheers, =E2=88=9A --=20 You received this message because you are subscribed to the Google Groups "= scala-language" group. To unsubscribe from this group and stop receiving emails from it, send an e= mail to [email protected]. For more options, visit https://groups.google.com/d/optout. --001a1134feceb5a44e0536976f47 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo= te">On Fri, Jul 1, 2016 at 8:12 PM, Avi Levi <span dir=3D"ltr"><<a href= =3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>></sp= an> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;= border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"rtl"><div dir=3D"l= tr">Viktor, Oliver=C2=A0</div><div dir=3D"ltr">I guess you are correct .</d= iv><div dir=3D"ltr">But=C2=A0</div><div dir=3D"ltr"><div dir=3D"ltr">scala&= gt; Some(1).filter(_ =3D=3D 0)</div><div dir=3D"ltr">res0: Option[Int] =3D = None</div><div dir=3D"ltr"><span class=3D""><div dir=3D"ltr">scala> Set(= 1, 2, 3).filter(_ =3D=3D 0)</div></span><div dir=3D"ltr">res1: scala.collec= tion.immutable.Set[Int] =3D Set()</div><div>BUT</div><span class=3D""><div>= val x =3D Future{1}.filter(_ =3D=3D 0)<br></div></span><span class=3D""><di= v>Failure(java.util.NoSuchElementException: Future.filter predicate is not = satisfied))<br></div></span></div></div></div></blockquote><div><br></div><= div>So you'd be happy(?) if the toString on a failed future said "= Future()"?</div><div><br></div><div>(Keep in mind the comment I had ab= out toString earlier in the thread :))</div><div>=C2=A0</div><blockquote cl= ass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;p= adding-left:1ex"><div dir=3D"rtl"><div dir=3D"ltr"><div dir=3D"ltr"><span c= lass=3D""><div></div><div><br></div><div><br></div></span></div></div></div= ><div class=3D"HOEnZb"><div class=3D"h5"><div class=3D"gmail_extra"><br><di= v class=3D"gmail_quote"><div dir=3D"ltr">2016-07-01 20:52 GMT+03:00 Viktor = Klang <span dir=3D"ltr"><<a href=3D"mailto:[email protected]" targe= t=3D"_blank">[email protected]</a>></span>:</div><blockquote class= =3D"gmail_quote" style=3D"margin:0 .8ex;border-left:1px #ccc solid;border-r= ight:1px #ccc solid;padding-left:1ex;padding-right:1ex"><p dir=3D"ltr">Hi A= vi,</p> <p dir=3D"ltr">I'm unsure "seems odd" can be discussed succes= sfully, I'm afraid.</p> <p dir=3D"ltr">As have been demonstrated, filter on Future behaves semantic= ally equivalent to the methods used by for-comprehensions (map, flatMap, fi= lter/withFilter and foreach)</p><span><font color=3D"#888888"> <p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p></font></span><div><div> <div class=3D"gmail_quote">On Jul 1, 2016 4:17 PM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>= > wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" style= =3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir= =3D"rtl"><div dir=3D"ltr">Hi Ronald ,</div><div dir=3D"ltr">taking the exam= ple above=C2=A0</div><div dir=3D"ltr">scala>val x =3D Future{1}.filter(_= =3D=3D 0)</div><div dir=3D"ltr"><div dir=3D"ltr">scala>x.value</div><di= v dir=3D"ltr">res2: Option[scala.util.Try[Int]] =3D Some(Failure(java.util.= NoSuchElementException: Future.filter predicate is not satisfied))</div></d= iv><div dir=3D"ltr"><br></div><div dir=3D"ltr">It seems odd that a legit ac= tion such as filter yields a failure with an exception .=C2=A0<br></div><di= v dir=3D"ltr"><br></div><div dir=3D"ltr">Cheers=C2=A0</div><div dir=3D"ltr"= >Avi</div><div dir=3D"ltr"><div><br></div></div></div><div class=3D"gmail_e= xtra"><br><div class=3D"gmail_quote"><div dir=3D"ltr">2016-07-01 17:02 GMT+= 03:00 Roland Kuhn <span dir=3D"ltr"><<a href=3D"mailto:[email protected]= " target=3D"_blank">[email protected]</a>></span>:</div><blockquote clas= s=3D"gmail_quote" style=3D"margin:0 .8ex;border-left:1px #ccc solid;border-= right:1px #ccc solid;padding-left:1ex;padding-right:1ex"><div style=3D"word= -wrap:break-word">Well =E2=80=A6 technically (and no, this is NOT a good id= ea, and hence it looks a little odd):<div><br></div><div><div><font face=3D= "Courier">scala> import concurrent._</font></div><div><font face=3D"Cour= ier">import concurrent._</font></div><div><font face=3D"Courier"><br></font= ></div><div><font face=3D"Courier">scala> import ExecutionContext.Implic= its._</font></div><div><font face=3D"Courier">import ExecutionContext.Impli= cits._</font></div><div><font face=3D"Courier"><br></font></div><div><font = face=3D"Courier">scala> import duration._</font></div><div><font face=3D= "Courier">import duration._</font></div><div><font face=3D"Courier"><br></f= ont></div><div><font face=3D"Courier">scala> Future(42)</font></div><div= ><font face=3D"Courier">res0: scala.concurrent.Future[Int] =3D scala.concur= rent.impl.Promise$DefaultPromise@25bbf683</font></div><div><font face=3D"Co= urier"><br></font></div><div><font face=3D"Courier">scala> Await.ready(r= es0, 1.second).value.get.toOption</font></div><div><font face=3D"Courier">r= es1: Option[Int] =3D Some(42)</font></div></div><div><font face=3D"Courier"= ><br></font></div><div><font face=3D"Courier"><div>scala> Await.ready(re= s0.filter(_ =3D=3D 1), 1.second).value.get.toOption</div><div>res2: Option[= Int] =3D None</div></font></div><div><br></div><div>Regards,</div><div><br>= </div><div>Roland</div><div><div><div><br><div><blockquote type=3D"cite"><d= iv>1 juli 2016 kl. 15:18 skrev Oliver Ruebenacker <<a href=3D"mailto:cur= [email protected]" target=3D"_blank">[email protected]</a>>:</div><br><div><d= iv dir=3D"ltr"><div><div><div><br></div>=C2=A0=C2=A0=C2=A0=C2=A0 Hello Rola= nd,<br><br></div>=C2=A0 Option has get, getOrElse and the possibility to ma= tch against Some(value), but Future does not have these.<br><br></div>=C2= =A0=C2=A0=C2=A0=C2=A0 Best, Oliver<br></div><div class=3D"gmail_extra"><br>= <div class=3D"gmail_quote">On Fri, Jul 1, 2016 at 9:06 AM, Roland Kuhn <spa= n dir=3D"ltr"><<a href=3D"mailto:[email protected]" target=3D"_blank">go= [email protected]</a>></span> wrote:<br><blockquote class=3D"gmail_quote" = style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><di= v style=3D"word-wrap:break-word">The difference is that Option does not hav= e onComplete: if you restrict yourself to the Option API then Future behave= s observably in the same way. If you want to have something like onComplete= you should look at <font face=3D"Courier">Either[NoSuchElementException, T= ]#fold</font>.<div><br></div><div>In general there is no .filter on monads = because that would require the explicit ability to represent emptiness (whi= ch is not part of the contract); the success path for the combinators could= be seen as such a representation and it is indeed often used as such, so F= uture is quite well-behaved in this regard. Another comment I=E2=80=99d lik= e to make on the discussed change is that it is not reasonable to expect th= at the result of filtering returns a different type than the original one= =E2=80=94no other container has this behavior.</div><div><br></div><div>Reg= ards,</div><div><br></div><div>Roland<div><div><br><div><br><div><blockquot= e type=3D"cite"><div>1 juli 2016 kl. 14:54 skrev Oliver Ruebenacker <<a = href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>>= :</div><br><div><div dir=3D"ltr"><div><div><br></div>=C2=A0=C2=A0=C2=A0=C2= =A0 Hello,<br><br></div>=C2=A0 Looks like sometimes you do get an exception= :<br><div><div><br><b><span style=3D"font-family:monospace,monospace">Welco= me to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).<br>T= ype in expressions for evaluation. Or try :help.<br><br>scala> import sc= ala.concurrent.Future<br>import scala.concurrent.Future<br><br>scala> im= port scala.concurrent.ExecutionContext.Implicits.global<br>import scala.con= current.ExecutionContext.Implicits.global<br><br>scala> Future{1}.onComp= lete { case _ =3D> println("Complete!") }<br><br>scala> Com= plete!<br><br><br>scala> Future{1}.filter(_ =3D=3D 0).onComplete { case = _ =3D> println("Complete!") }<br>Complete!<br><br>scala> im= port scala.util.{Success, Failure }<br>import scala.util.{Success, Failure}= <br><br>scala> Future{1}.filter(_ =3D=3D 0).onComplete {<br>=C2=A0=C2=A0= =C2=A0=C2=A0 | case Success(value) =3D> println(value)<br>=C2=A0=C2=A0= =C2=A0=C2=A0 | case Failure(ex) =3D> println(ex)<br>=C2=A0=C2=A0=C2=A0= =C2=A0 | }<br><br>java.util.NoSuchElementException: Future.filter predicate= is not satisfied<br>scala></span></b><br><br></div><div>=C2=A0=C2=A0=C2= =A0=C2=A0 Best, Oliver<br></div><div><br></div></div></div><div class=3D"gm= ail_extra"><br><div class=3D"gmail_quote">On Fri, Jul 1, 2016 at 5:44 AM, V= iktor Klang <span dir=3D"ltr"><<a href=3D"mailto:[email protected]"= target=3D"_blank">[email protected]</a>></span> wrote:<br><blockqu= ote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc s= olid;padding-left:1ex"><p dir=3D"ltr">I think you are conflating the notion= of optionality here.</p><p dir=3D"ltr">option.filter(p).map(f).foreach(pri= ntln)</p><p dir=3D"ltr">behaves exactly like</p><p dir=3D"ltr">future.filte= r(p).map(f).foreach(println)</p><span><font color=3D"#888888"><p dir=3D"ltr= ">-- <br> Cheers,<br> =E2=88=9A</p></font></span><div><div> <div class=3D"gmail_quote">On Jul 1, 2016 11:36 AM, "Avi Levi" &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a= >> wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" styl= e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir= =3D"ltr">Correct, just on future you get an exception if element does not p= ass the filter. Wouldn't it be better if we can get something that expr= ess an empty future? </p> <div class=3D"gmail_quote">On Jul 1, 2016 12:30 PM, "Viktor Klang"= ; <<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl= [email protected]</a>> wrote:<br type=3D"attribution"><blockquote class=3D"g= mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l= eft:1ex"><p dir=3D"ltr">But you don't get an exception on the success p= ath. All operations on the success path will be skipped, just as for Option= .</p><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 10:35 AM, "Avi Levi" &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a= >> wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" styl= e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div di= r=3D"rtl"><div dir=3D"ltr">Hi Victor ,</div><div dir=3D"ltr">I totally agre= e that expectations are subjective .</div><div dir=3D"ltr">But like you sai= d a filter on List will return a List if no element comply than we will get= Nil which represents an empty container (empty list)</div><div dir=3D"ltr"= >a filter on option will return a option if the element doesn't comply = than we will get None which represents an empty container=C2=A0</div><div d= ir=3D"ltr">following the same logic a filter on future should return someth= ing that express empty container , defiantly not an exception, because it i= s not an exception we do intend to filter those elements.</div><div dir=3D"= ltr"><br></div><div dir=3D"ltr">=C2=A0</div></div><div class=3D"gmail_extra= "><br><div class=3D"gmail_quote"><div dir=3D"ltr">2016-07-01 10:50 GMT+03:0= 0 Viktor Klang <span dir=3D"ltr"><<a href=3D"mailto:[email protected]= om" target=3D"_blank">[email protected]</a>></span>:</div><blockquo= te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so= lid;padding-left:1ex"><p dir=3D"ltr">Hi Avi,</p><p dir=3D"ltr">I see what y= ou mean.</p><p dir=3D"ltr">I'd want to avoid discussing expectation sin= ce it is subjective. I will however note that the actualnsemantics of the f= ilter method on Future needs improvement: <a href=3D"http://www.scala-lang.= org/api/2.11.8/index.html#scala.concurrent.Future@filter(p:T=3D" target=3D"= _blank">http://www.scala-lang.org/api/2.11.8/index.html#scala.concurrent.Fu= ture@filter(p:T=3D</a>>Boolean)(implicitexecutor:scala.concurrent.Execut= ionContext):scala.concurrent.Future[T]</p><p dir=3D"ltr">As for might not r= eturn the value, the same goes for all filter-methods:</p><p dir=3D"ltr">Li= st returns List, but it might not have any elements at all. Option returns = Option but can be Some or None, Future is either Success or Failure.</p><p = dir=3D"ltr">If success has an optionality aspect in your usage, use Future = of Option to express that, that would be my recommendation. </p><span><font= color=3D"#888888"><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p></font></span><div><div> <div class=3D"gmail_quote">On Jul 1, 2016 9:20 AM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>= > wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quote" style= =3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir= =3D"ltr">Thanks Victor,<br> Of course it can be implemented as you suggested. But still I can argue th= at the current implementation is not "really filtering" the resul= ts as one might expect and less expressive if it might or not return the va= lue than Option is more expressive, don't you agree? </p> <div class=3D"gmail_quote">On Jul 1, 2016 10:06 AM, "Viktor Klang"= ; <<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl= [email protected]</a>> wrote:<br type=3D"attribution"><blockquote class=3D"g= mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l= eft:1ex"><p dir=3D"ltr">Hi Avi,</p><p dir=3D"ltr">Use Fututre[Option[Int]] = if you want to deal with Some/None as a result of filter ( f.map(_.filter(p= ) ) (alt. see monad transformers)</p><p dir=3D"ltr">-- <br> Cheers,<br> =E2=88=9A</p> <div class=3D"gmail_quote">On Jul 1, 2016 8:53 AM, "Avi Levi" <= ;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>= > wrote:<br type=3D"attribution"><blockquote style=3D"margin:0 0 0 .8ex;= border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">I was trying = to figure out what should I accept when filtering over a future .<div>the c= urrent implementation yields either a T or an exception which kind of break= s referential transparency (doesn't it ?) .</div><div>on the other hand= what can I expect given this expression=C2=A0</div><div><p><span><i>def fo= o(i:Int):Future[Int]</i></span></p><p><span>the type result of=C2=A0</span>= </p><p><i>foo(1).filter(_ % 2 =3D=3D 0)</i></p><p><span><br></span></p></di= v><div>I.M.H.O I would expect it to yield Option[T] =C2=A0which makes more = sense to express that we might get a value that pass the filter or not . is= that make sense ?</div><div><br></div><div>Cheers</div><font color=3D"#888= 888"><div>Avi=C2=A0</div></font></div><font color=3D"#888888"><div><br></di= v> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </font></blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div data-smartmail=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"r= tl"><div><div dir=3D"rtl"><div dir=3D"ltr"><span style=3D"color:rgb(51,51,5= 1);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-= serif;font-size:14px;line-height:21px">Sincerely,</span><br style=3D"color:= rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Ve= rdana,sans-serif;font-size:14px;line-height:21px"><span style=3D"color:rgb(= 51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdan= a,sans-serif;font-size:14px;line-height:21px">Avi Levi</span></div><div dir= =3D"ltr"><span style=3D"color:rgb(51,51,51);font-family:proxima-nova-1,prox= ima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;font-size:14px;line-height:2= 1px">m: <a href=3D"tel:%2B972-52-3459959" value=3D"+972523459959" target=3D= "_blank">+972-52-3459959</a></span><span style=3D"color:rgb(51,51,51);font-= family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;fo= nt-size:14px;line-height:21px"><br></span></div><div dir=3D"ltr"><span styl= e=3D"color:rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,H= elvetica,Verdana,sans-serif;font-size:14px;line-height:21px"><a href=3D"htt= ps://www.linkedin.com/in/leviavi" target=3D"_blank"><img src=3D"https://doc= s.google.com/uc?export=3Ddownload&id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&= ;revid=3D0B82ayL0XJaZ5YklVWjUvcG9tQmNrVEFRSDhNd0lNLzUwKzlvPQ"><span></span>= <span></span></a></span></div><div dir=3D"ltr"><span style=3D"margin:0px;pa= dding:0px;border:0px;outline:0px;font-size:14px;font-family:proxima-nova-1,= proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;vertical-align:baseline;= color:rgb(43,130,173);line-height:21px"><a href=3D"https://about.me/avi.lev= i" target=3D"_blank">https://about.me/avi.levi</a></span><br></div></div></= div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><br>-- <br><div data-s= martmail=3D"gmail_signature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div><d= iv dir=3D"ltr"><div><div dir=3D"ltr"><div>Oliver Ruebenacker<br></div><div>= Senior Software Engineer, <a href=3D"http://www.type2diabetesgenetics.org/"= target=3D"_blank">Diabetes Portal</a>, <a href=3D"http://www.broadinstitut= e.org/" target=3D"_blank">Broad Institute</a><br></div><br></div></div></di= v></div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></blockquote></div><br></div></div></div></div></div><div><div><div><= br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><br>-- <br><div data-s= martmail=3D"gmail_signature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div><d= iv dir=3D"ltr"><div><div dir=3D"ltr"><div>Oliver Ruebenacker<br></div><div>= Senior Software Engineer, <a href=3D"http://www.type2diabetesgenetics.org/"= target=3D"_blank">Diabetes Portal</a>, <a href=3D"http://www.broadinstitut= e.org/" target=3D"_blank">Broad Institute</a><br></div><br></div></div></di= v></div></div></div></div></div> </div><div><br></div> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></blockquote></div><br></div></div></div></div><div><div> <p></p> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div data-smartmail=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"r= tl"><div><div dir=3D"rtl"><div dir=3D"ltr"><span style=3D"color:rgb(51,51,5= 1);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-= serif;font-size:14px;line-height:21px">Sincerely,</span><br style=3D"color:= rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Ve= rdana,sans-serif;font-size:14px;line-height:21px"><span style=3D"color:rgb(= 51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdan= a,sans-serif;font-size:14px;line-height:21px">Avi Levi</span></div><div dir= =3D"ltr"><span style=3D"color:rgb(51,51,51);font-family:proxima-nova-1,prox= ima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;font-size:14px;line-height:2= 1px">m: <a href=3D"tel:%2B972-52-3459959" value=3D"+972523459959" target=3D= "_blank">+972-52-3459959</a></span><span style=3D"color:rgb(51,51,51);font-= family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;fo= nt-size:14px;line-height:21px"><br></span></div><div dir=3D"ltr"><span styl= e=3D"color:rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,H= elvetica,Verdana,sans-serif;font-size:14px;line-height:21px"><a href=3D"htt= ps://www.linkedin.com/in/leviavi" target=3D"_blank"><img src=3D"https://doc= s.google.com/uc?export=3Ddownload&id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&= ;revid=3D0B82ayL0XJaZ5YklVWjUvcG9tQmNrVEFRSDhNd0lNLzUwKzlvPQ"><span></span>= <span></span></a></span></div><div dir=3D"ltr"><span style=3D"margin:0px;pa= dding:0px;border:0px;outline:0px;font-size:14px;font-family:proxima-nova-1,= proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;vertical-align:baseline;= color:rgb(43,130,173);line-height:21px"><a href=3D"https://about.me/avi.lev= i" target=3D"_blank">https://about.me/avi.levi</a></span><br></div></div></= div></div></div></div></div> </div> <p></p> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </blockquote></div> <p></p> -- <br> You received this message because you are subscribed to a topic in the Goog= le Groups "scala-language" group.<br> To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/= d/topic/scala-language/wpGOB8f7qmY/unsubscribe" target=3D"_blank">https://g= roups.google.com/d/topic/scala-language/wpGOB8f7qmY/unsubscribe</a>.<br> To unsubscribe from this group and all its topics, send an email to <a href= =3D"mailto:[email protected]" target=3D"_blank">s= [email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div data-smartmail=3D"gmail_signature"><div dir=3D"rtl"><div><div dir=3D"r= tl"><div><div dir=3D"rtl"><div dir=3D"ltr"><span style=3D"color:rgb(51,51,5= 1);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-= serif;font-size:14px;line-height:21px">Sincerely,</span><br style=3D"color:= rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Ve= rdana,sans-serif;font-size:14px;line-height:21px"><span style=3D"color:rgb(= 51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdan= a,sans-serif;font-size:14px;line-height:21px">Avi Levi</span></div><div dir= =3D"ltr"><span style=3D"color:rgb(51,51,51);font-family:proxima-nova-1,prox= ima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;font-size:14px;line-height:2= 1px">m: <a href=3D"tel:%2B972-52-3459959" value=3D"+972523459959" target=3D= "_blank">+972-52-3459959</a></span><span style=3D"color:rgb(51,51,51);font-= family:proxima-nova-1,proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;fo= nt-size:14px;line-height:21px"><br></span></div><div dir=3D"ltr"><span styl= e=3D"color:rgb(51,51,51);font-family:proxima-nova-1,proxima-nova-2,Tahoma,H= elvetica,Verdana,sans-serif;font-size:14px;line-height:21px"><a href=3D"htt= ps://www.linkedin.com/in/leviavi" target=3D"_blank"><img src=3D"https://doc= s.google.com/uc?export=3Ddownload&id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&= ;revid=3D0B82ayL0XJaZ5YklVWjUvcG9tQmNrVEFRSDhNd0lNLzUwKzlvPQ"><span></span>= <span></span></a></span></div><div dir=3D"ltr"><span style=3D"margin:0px;pa= dding:0px;border:0px;outline:0px;font-size:14px;font-family:proxima-nova-1,= proxima-nova-2,Tahoma,Helvetica,Verdana,sans-serif;vertical-align:baseline;= color:rgb(43,130,173);line-height:21px"><a href=3D"https://about.me/avi.lev= i" target=3D"_blank">https://about.me/avi.levi</a></span><br></div></div></= div></div></div></div></div> </div> <p></p> -- <br> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]" targ= et=3D"_blank">[email protected]</a>.<br> For more options, visit <a href=3D"https://groups.google.com/d/optout" targ= et=3D"_blank">https://groups.google.com/d/optout</a>.<br> </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= <div class=3D"gmail_signature" data-smartmail=3D"gmail_signature"><div dir= =3D"ltr"><div><span style=3D"border-collapse:separate;color:rgb(0,0,0);font= -family:Times;font-variant:normal;letter-spacing:normal;line-height:normal;= text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:nor= mal;word-spacing:0px;font-size:medium"><div style=3D"color:rgb(34,34,34);fo= nt-family:arial,sans-serif;font-size:13.333333969116211px">Cheers,</div><di= v style=3D"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13.33= 3333969116211px">=E2=88=9A</div></span></div></div></div> </div></div> <p></p> -- <br /> You received this message because you are subscribed to the Google Groups &= quot;scala-language" group.<br /> To unsubscribe from this group and stop receiving emails from it, send an e= mail to <a href=3D"mailto:[email protected]">scal= [email protected]</a>.<br /> For more options, visit <a href=3D"https://groups.google.com/d/optout">http= s://groups.google.com/d/optout</a>.<br /> --001a1134feceb5a44e0536976f47--