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">&lt;<a href=
=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>&gt;</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&gt; 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&#39;d be happy(?) if the toString on a failed future said &quot;=
Future()&quot;?</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">&lt;<a href=3D"mailto:[email protected]" targe=
t=3D"_blank">[email protected]</a>&gt;</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&#39;m unsure &quot;seems odd&quot; can be discussed succes=
sfully, I&#39;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, &quot;Avi Levi&quot; &lt=
;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>=
&gt; 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&gt;val x =3D Future{1}.filter(_=
 =3D=3D 0)</div><div dir=3D"ltr"><div dir=3D"ltr">scala&gt;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">&lt;<a href=3D"mailto:[email protected]=
" target=3D"_blank">[email protected]</a>&gt;</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&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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 &lt;<a href=3D"mailto:cur=
[email protected]" target=3D"_blank">[email protected]</a>&gt;:</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">&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">go=
[email protected]</a>&gt;</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 &lt;<a =
href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>&gt;=
:</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&gt; import sc=
ala.concurrent.Future<br>import scala.concurrent.Future<br><br>scala&gt; im=
port scala.concurrent.ExecutionContext.Implicits.global<br>import scala.con=
current.ExecutionContext.Implicits.global<br><br>scala&gt; Future{1}.onComp=
lete { case _ =3D&gt; println(&quot;Complete!&quot;) }<br><br>scala&gt; Com=
plete!<br><br><br>scala&gt; Future{1}.filter(_ =3D=3D 0).onComplete { case =
_ =3D&gt; println(&quot;Complete!&quot;) }<br>Complete!<br><br>scala&gt; im=
port scala.util.{Success, Failure }<br>import scala.util.{Success, Failure}=
<br><br>scala&gt; Future{1}.filter(_ =3D=3D 0).onComplete {<br>=C2=A0=C2=A0=
=C2=A0=C2=A0 | case Success(value) =3D&gt; println(value)<br>=C2=A0=C2=A0=
=C2=A0=C2=A0 | case Failure(ex) =3D&gt; println(ex)<br>=C2=A0=C2=A0=C2=A0=
=C2=A0 | }<br><br>java.util.NoSuchElementException: Future.filter predicate=
 is not satisfied<br>scala&gt;</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">&lt;<a href=3D"mailto:[email protected]"=
 target=3D"_blank">[email protected]</a>&gt;</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, &quot;Avi Levi&quot; &l=
t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a=
>&gt; 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&#39;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, &quot;Viktor Klang&quot=
; &lt;<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl=
[email protected]</a>&gt; 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&#39;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, &quot;Avi Levi&quot; &l=
t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a=
>&gt; 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&#39;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">&lt;<a href=3D"mailto:[email protected]=
om" target=3D"_blank">[email protected]</a>&gt;</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&#39;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>&gt;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, &quot;Avi Levi&quot; &lt=
;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>=
&gt; 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 &quot;really filtering&quot; 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&#39;t you agree? </p>
<div class=3D"gmail_quote">On Jul 1, 2016 10:06 AM, &quot;Viktor Klang&quot=
; &lt;<a href=3D"mailto:[email protected]" target=3D"_blank">viktor.kl=
[email protected]</a>&gt; 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, &quot;Avi Levi&quot; &lt=
;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>=
&gt; 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&#39;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&quot; 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 &quot;scala-language&quot; 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&quot; 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 &quot;scala-language&quot; 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&amp;id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&amp=
;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&quot; 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 &quot;scala-language&quot; 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&quot; 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&quot; 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&quot; 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&quot; 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&quot; 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 &quot;scala-language&quot; 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&amp;id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&amp=
;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&quot; 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 &quot;scala-language&quot; 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&amp;id=3D0B82ayL0XJaZ5WEY0c2xWQWYxNDQ&amp=
;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&quot; 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&quot; 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--