<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6893032696317132921</atom:id><lastBuildDate>Sun, 08 Nov 2009 20:38:25 +0000</lastBuildDate><title>Gabriel's software development blog</title><description>Software surgery, programming, architecture, process, development, design, and more...</description><link>http://gabrielsw.blogspot.com/</link><managingEditor>noreply@blogger.com (Gabriel C.)</managingEditor><generator>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>20</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GabrielsSoftwareDevelopmentBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-4312877071354991392</guid><pubDate>Tue, 02 Jun 2009 23:17:00 +0000</pubDate><atom:updated>2009-06-03T16:10:34.969-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">DSL</category><title>Boolean Algebra Internal DSL in Scala (aka fun with Unicode names )</title><description>In Scala, operator names can be characters from the unicode set of mathematical symbols (Sm) or other symbols (So). That can lead to interesting possibilities:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;val Π = Math.Pi&lt;br /&gt;def √(x:Double)=Math.sqrt(x)&lt;br /&gt;val x= √(9*Π)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here, "Π" is just another constant and "√" is a function like "q".&lt;br /&gt;(To use  unicode in eclipse, you have to go to Preferences-&gt;General-&gt;Workspace, and change the text encoding to UTF-16)&lt;br /&gt;&lt;br /&gt;Another example: with the ∑ and ∏ you can have define summation and the product of a sequence as follows:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; def ∑(r:Range)(f:Int =&gt;Int)=r.reduceLeft(_+ f(_))&lt;br /&gt; def ∏(r:Range)(f:Int =&gt;Int)=r.reduceLeft(_* f(_))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And now we can write:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; val s= ∑(1 to 100)(x=&gt;x^2)&lt;br /&gt; val p= ∑(1 to 100 by 2)(x=&gt;x^2)&lt;br /&gt; val y= ∏(1 to 30 by 3)(_)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Of course, I'm not advocating using Scala as a substitute of a specific mathematical tool, besides, &lt;a href="http://en.wikipedia.org/wiki/APL_%28programming_language%29"&gt;there's already a "language with symbols"&lt;/a&gt; (btw, I wonder if one can make a Scala "skin" that looks like APL). I'm not sure how other languages can do this (except APL maybe?), but this goes to show the power of Scala for "internal DSL".&lt;br /&gt;&lt;br /&gt;For a slightly more complex example, let's define an internal DSL for boolean logic, with the appropriate symbols: ¬,V,Λ,and →.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; class LogicBoolean(val value:Boolean) {&lt;br /&gt;   import LogicBoolean.¬&lt;br /&gt;   override def toString=value.toString&lt;br /&gt; &lt;br /&gt;   def V(b:LogicBoolean)=new LogicBoolean(this.value || b.value)&lt;br /&gt;   def Λ(b:LogicBoolean)=new LogicBoolean(this.value &amp;amp;&amp;amp; b.value)&lt;br /&gt;   def →(b:LogicBoolean)=(¬(this)) V (this Λ b)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; object LogicBoolean {&lt;br /&gt;   def ¬(a:LogicBoolean)=new LogicBoolean(!a.value)&lt;br /&gt;   implicit def boolToLogicBool(x:Boolean)=new LogicBoolean(x)&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The only prefix operators that can be defined in Scala are ‘+’, ‘’, ‘!’ or ‘~’, so no luck for ¬. But we if we define it as a function, we can import it and use it (almost) like a prefix op. As we want an implicit conversion from boolean to our LogicBoolean class, a companion object is the ideal place to put both. By importing all the methods in the companion, we bring the ¬ operator and the implicit conversion into scope:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    import LogicBoolean._&lt;br /&gt;  &lt;br /&gt;    val A=true&lt;br /&gt;    val B=false&lt;br /&gt;&lt;br /&gt;    println("¬A :"+ ¬(A))&lt;br /&gt;    println("¬B :"+ ¬(B))&lt;br /&gt;    println("A Λ B :"+ (A Λ B))&lt;br /&gt;    println("A V B :"+ (A V B))&lt;br /&gt;    println("A → B :" + (A → B))&lt;br /&gt;    println("B → A :" + (B → A))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;With everything in place, with a for comprehension is very easy to print the truth tables of any complex formula (just be careful with the precedence, use parenthesis):&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;     import LogicBoolean._&lt;br /&gt;    &lt;br /&gt;     val r=List(true,false)&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;     def expr(a:Boolean,b:Boolean,c:Boolean,d:Boolean)=&lt;br /&gt;       ( (a Λ b) V ¬(a Λ c) ) Λ ((c V d) Λ ¬(b) )&lt;br /&gt;    &lt;br /&gt;     //let's print the truth table&lt;br /&gt;     println ("\na\tb\tc\td\t(a Λ b) V ¬(a Λ c) ) Λ ((c V d) Λ ¬(b)")&lt;br /&gt;     for (&lt;br /&gt;       a &lt;- r;&lt;br /&gt;       b &lt;- r;&lt;br /&gt;       c &lt;- r;&lt;br /&gt;       d &lt;- r&lt;br /&gt;     ) println (a+"\t"+b+"\t"+c+"\t"+d+"\t"+expr(a,b,c,d)) &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you run the examples you get:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;¬A :false&lt;br /&gt;¬B :true&lt;br /&gt;A Λ B :false&lt;br /&gt;A V B :true&lt;br /&gt;A → B :false&lt;br /&gt;B → A :true&lt;br /&gt;&lt;br /&gt;a b c d (a Λ b) V ¬(a Λ c) ) Λ ((c V d) Λ ¬(b)&lt;br /&gt;true true true true false&lt;br /&gt;true true true false false&lt;br /&gt;true true false true false&lt;br /&gt;true true false false false&lt;br /&gt;true false true true false&lt;br /&gt;true false true false false&lt;br /&gt;true false false true true&lt;br /&gt;true false false false false&lt;br /&gt;false true true true false&lt;br /&gt;false true true false false&lt;br /&gt;false true false true false&lt;br /&gt;false true false false false&lt;br /&gt;false false true true true&lt;br /&gt;false false true false true&lt;br /&gt;false false false true true&lt;br /&gt;false false false false false&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The ability to easily adapt the language to looks like the domain is one of the main selling features of languages like Lisp. Though Scala is no way like Lisp, it can go very far in the "internal DSL" direction and provides many features to make that easy.&lt;br /&gt;&lt;br /&gt;EDIT: &lt;a href="http://www.oreillynet.com/ruby/blog/2007/10/fun_with_unicode_1.html" &gt;Something very similar in Ruby&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-4312877071354991392?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/ufYMAvqJPxU/boolean-algebra-internal-dsl-in-scala.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/06/boolean-algebra-internal-dsl-in-scala.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-3818876624216334321</guid><pubDate>Fri, 22 May 2009 00:07:00 +0000</pubDate><atom:updated>2009-05-21T20:54:20.044-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">exercises</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>My take on 99 problems in Scala (23 to 26)</title><description>I have lot of things going on, but a quick post. Here are 5 more problems solved in Scala.&lt;br /&gt;Note: in all this and the &lt;a href="http://gabrielsw.blogspot.com/2009/04/my-take-on-99-problems-in-scala-first.html"&gt;previous solutions&lt;/a&gt;, I've left out (most of the time) boundary conditions checks, to keep the code simple and as elegant as possible.&lt;br /&gt;&lt;br /&gt;P23: Random select. We reuse P20 (removeAt) and remove a random element of the list recursively.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;//P23&lt;br /&gt; def randomSelect[A](n:Int, xs:List[A]):List[A]=(n,xs) match {&lt;br /&gt;   case (_,Nil) =&gt; Nil&lt;br /&gt;   case (0,_) =&gt; Nil&lt;br /&gt;   case (_,_) =&gt;{&lt;br /&gt;    val x=removeAt(new Random().nextInt(xs.size),xs)&lt;br /&gt;    x._2::randomSelect(n-1,x._1)&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;P24: lotto. we create a list (well, actually is a range converted to a list) of the numbers and use P23 to select a random draw.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; //P24&lt;br /&gt; def lotto(n:Int,max:Int):List[Int] =randomSelect(n,(1 to max).toList)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;P25: random permute. That's easy: we use P23 to do a randomSelect on the whole list&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; //P25&lt;br /&gt; def randomPermute[A](xs:List[A]):List[A] =randomSelect(xs.size,xs)&lt;br /&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;P26: combinations. That one wasn't straightforward, I actually had to think! :)&lt;br /&gt;But the solution can be defined recursively:&lt;br /&gt;to get the combinations of size n, take one element of the set and append it to all the combinations of sets of size n-1 of the remaining elements, union the combinations of size n of the remaining elements.&lt;br /&gt;I had to create an auxiliary function that "lift" a list into a list of lists, (kind of the opposite of flatten).&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; //P26&lt;br /&gt; def combinations[A](n:Int, xs:List[A]):List[List[A]]={&lt;br /&gt;    def lift[A](xs:List[A]):List[List[A]]=xs.foldLeft(List[List[A]]())((ys,y)=&gt;(List(y)::ys))&lt;br /&gt;   &lt;br /&gt;    (n,xs) match {&lt;br /&gt;      case (1,ys)=&gt; lift(ys)&lt;br /&gt;      case (i,xs) if (i==xs.size) =&gt; xs::Nil&lt;br /&gt;      case (i,ys)=&gt; combinations(i-1,ys.tail).map(zs=&gt;ys.head::zs):::combinations(i,ys.tail)&lt;br /&gt;    }&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-3818876624216334321?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/GRqkxXENZ1Q/my-take-on-99-problems-in-scala-23-to.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/05/my-take-on-99-problems-in-scala-23-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-1100643377463536493</guid><pubDate>Tue, 28 Apr 2009 04:24:00 +0000</pubDate><atom:updated>2009-05-02T22:32:34.876-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">exercises</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>My take on 99 problems in Scala (first 22)</title><description>A while ago I saw &lt;a href="https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/"&gt;99 problems in Prolog&lt;/a&gt; they looked really good and I started trying to solve them in Scala. Now, thanks to &lt;a href="http://blog.tmorris.net/22-of-99/"&gt;Tony Morris&lt;/a&gt; I found that there's a &lt;a href="http://aperiodic.net/phil/scala/s-99/"&gt;Scala version&lt;/a&gt;!&lt;br /&gt;Nice stuff to get your skills up to shape. It helped me to improve my understanding of folds, maps, flatMaps, zips, etc. Also I learned new pattern matching techniques (tuples and guards).&lt;br /&gt;You must really give the exercises a shot!&lt;br /&gt;Here are my solutions:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package exercises&lt;br /&gt; &lt;br /&gt;object NinetyNine {&lt;br /&gt;  //P01&lt;br /&gt;  def last[A](xs:List[A]):A = xs match {&lt;br /&gt;    case x::Nil =&gt; x&lt;br /&gt;    case x::xs =&gt; last(xs)&lt;br /&gt;    case Nil =&gt; throw new NoSuchElementException&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  //P02&lt;br /&gt;  def penultimate[A](xs:List[A]):A = xs match {&lt;br /&gt;    case x::y::Nil =&gt; x&lt;br /&gt;    case x::xs =&gt; penultimate(xs)&lt;br /&gt;    case _ =&gt; throw new NoSuchElementException&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  //P03&lt;br /&gt;  def nth[A](i:Int, xs:List[A]):A = xs match {&lt;br /&gt;    case x::xs =&gt; if (i==0) x else nth(i-1,xs)&lt;br /&gt;    case _ =&gt; throw new NoSuchElementException&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  def nth2[A](i:Int, xs:List[A]):A = xs match {&lt;br /&gt;    case x::xs if (i==0) =&gt; x&lt;br /&gt;    case x::xs if (i&gt;0) =&gt; nth(i-1,xs)&lt;br /&gt;    case _ =&gt; throw new NoSuchElementException&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  //P04&lt;br /&gt;  def length[A](xs:List[A]):Int = xs match {&lt;br /&gt;    case x::xs =&gt; 1+ length(xs)&lt;br /&gt;    case Nil =&gt; 0&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  //Although straight recursion is fun, using folds is more effective&lt;br /&gt;  // folds are abstractions for recursion over data structures&lt;br /&gt; &lt;br /&gt;  //P04&lt;br /&gt;  def length1[A](xs:List[A]):Int = xs.foldLeft(0)((a,b)=&gt;a+1)&lt;br /&gt; &lt;br /&gt;  //P05&lt;br /&gt;  def reverse[A](xs:List[A]):List[A] = xs.foldLeft(Nil:List[A])((a,b)=&gt;b::a)&lt;br /&gt; &lt;br /&gt;  //P06&lt;br /&gt;  def isPalindrome[A](xs:List[A]):Boolean = reverse(xs)==xs&lt;br /&gt; &lt;br /&gt;  //P07&lt;br /&gt;  def flatten[A](xs: List[List[A]]):List[A] =xs.foldRight(Nil:List[A])(&lt;br /&gt;    (xs,acc)=&gt; xs match {&lt;br /&gt;      case ys:List[A] =&gt; ys:::acc&lt;br /&gt;      case y:A =&gt; y::acc&lt;br /&gt;      }&lt;br /&gt;    )&lt;br /&gt; &lt;br /&gt;  //P08&lt;br /&gt;  def compress[A](xs: List[A]):List[A]=&lt;br /&gt;    xs.foldRight(List[A]())((y,ys)=&gt;&lt;br /&gt;      if (ys != Nil &amp;&amp; ys.head==y) ys else y::ys )&lt;br /&gt; &lt;br /&gt;  //P09&lt;br /&gt;  def pack[A](xs: List[A]):List[List[A]]= xs match {&lt;br /&gt;    case Nil =&gt; Nil&lt;br /&gt;    case _ =&gt; xs.takeWhile(_ == xs.head) :: pack(xs.dropWhile(_ == xs.head)) //can use span too, see P13&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //P10&lt;br /&gt;  def encode[A](xs: List[A]):List[(Int,A)]=&lt;br /&gt;    pack(xs).map(y=&gt;(y.length,y.head))&lt;br /&gt;  &lt;br /&gt;  //P11&lt;br /&gt;  def encodeModified[A](xs: List[A]):List[Any]=&lt;br /&gt;    pack(xs).map(&lt;br /&gt;      y =&gt; if (y.length==1) y.head else (y.length,y.head)&lt;br /&gt;    )&lt;br /&gt;  &lt;br /&gt;  //Type safe version&lt;br /&gt;  def encodeModifiedTypSafe[A](xs: List[A]):List[Either[A,(Int,A)]]=&lt;br /&gt;    pack(xs).map(&lt;br /&gt;      y=&gt;&lt;br /&gt;      if (y.length ==1) Left(y.head)&lt;br /&gt;      else Right(y.length,y.head)&lt;br /&gt;    )&lt;br /&gt;  &lt;br /&gt;  //P12&lt;br /&gt;  def decode[A](xs: List[(Int,A)]):List[A]={&lt;br /&gt;    def expand(i:Int,a:A):List[A]= if (i==0) Nil else a::expand(i-1,a)&lt;br /&gt;    flatten(xs.foldRight(List[List[A]]())((y,ys)=&gt;expand(y._1,y._2)::ys))&lt;br /&gt;  }&lt;br /&gt;  //is better with flatMap&lt;br /&gt;  def decode1[A](xs: List[(Int,A)]):List[A]=&lt;br /&gt;    xs.flatMap(ny=&gt;List.make(ny._1,ny._2))&lt;br /&gt;  &lt;br /&gt;  //P13&lt;br /&gt;  def encodeDirect[A](xs: List[A]):List[(Int,A)]= xs match {&lt;br /&gt;    case Nil =&gt; Nil&lt;br /&gt;    case _ =&gt; {&lt;br /&gt;      val ys= xs.span( _ == xs.head)&lt;br /&gt;      (ys._1.length,xs.head) :: encodeDirect(ys._2)&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;    &lt;br /&gt;  //P14&lt;br /&gt;  def duplicate[A](xs: List[A]):List[A]=&lt;br /&gt;    xs.foldRight(Nil:List[A])((y,ys)=&gt; y::y::ys )&lt;br /&gt;  //is better with flatMap&lt;br /&gt;  def duplicate1[A](xs: List[A]):List[A]= xs.flatMap(y=&gt; y::y::Nil )&lt;br /&gt;  &lt;br /&gt;  //P15&lt;br /&gt;  def duplicateN[A](n:Int, xs: List[A]):List[A]=&lt;br /&gt;    xs.foldRight(Nil:List[A])((y,ys)=&gt; (1 to n).toList.map(_=&gt;y):::ys )&lt;br /&gt;  //is better with flatMap&lt;br /&gt;  def duplicateN1[A](n:Int, xs: List[A]):List[A]=&lt;br /&gt;    xs.flatMap(y=&gt;List.make(n,y))&lt;br /&gt;  &lt;br /&gt;  //P16&lt;br /&gt;  def drop[A](n:Int, xs: List[A]):List[A]=&lt;br /&gt;    xs.zipWithIndex.filter(_._2 % n !=0).map (_._1)&lt;br /&gt;  &lt;br /&gt;  //P17&lt;br /&gt;  def split[A](n:Int, xs: List[A]):(List[A],List[A])=&lt;br /&gt;    xs.splitAt(n)// or (xs.take(n),xs.drop(n))&lt;br /&gt;  &lt;br /&gt;  //ok, that was too easy, let's try recursion&lt;br /&gt;  def splitRec[A](n:Int, xs: List[A]):(List[A],List[A])=&lt;br /&gt;    (n,xs) match {&lt;br /&gt;      case (0,_)=&gt;(Nil, xs)&lt;br /&gt;      case (_,y::ys) =&gt; {&lt;br /&gt;          val rec=splitRec(n-1,ys)&lt;br /&gt;          (y::rec._1,rec._2)&lt;br /&gt;        }&lt;br /&gt;      case (_,Nil)=&gt;(xs,Nil)&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;  //P18&lt;br /&gt;  def slice[A](s:Int, e:Int, xs: List[A]):List[A]=&lt;br /&gt;    xs.slice(s,e) // or xs.drop(s).take(e-s)&lt;br /&gt;  &lt;br /&gt;  //with recursion&lt;br /&gt;  def sliceRec[A](s:Int, e:Int, xs: List[A]):List[A]=&lt;br /&gt;    (s,e,xs) match {&lt;br /&gt;      case (0,0,xs) =&gt; Nil&lt;br /&gt;      case (0,_,y::ys)=&gt; y::sliceRec(0,e-1,ys)&lt;br /&gt;      case (_,_,y::ys)=&gt; sliceRec(s-1,e-1,ys)&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;  //P19&lt;br /&gt;  def rotate[A](n:Int, xs: List[A]):List[A]={&lt;br /&gt;    val s=split((if (n&gt;0) n else n+xs.length), xs)&lt;br /&gt;    s._2:::s._1&lt;br /&gt;    }&lt;br /&gt;     &lt;br /&gt;  //P20&lt;br /&gt;  def removeAt[A](n:Int, xs: List[A]):(List[A],A)={&lt;br /&gt;    val (heads,tails)=split(n,xs)&lt;br /&gt;    (heads:::tails.tail,tails.head)&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  //P21&lt;br /&gt;  def insertAt[A](e:A, n:Int, xs: List[A]):List[A]={&lt;br /&gt;    val (heads,tails)=split(n,xs)&lt;br /&gt;    heads:::e::tails&lt;br /&gt;  }&lt;br /&gt;  //with recursion&lt;br /&gt;  def insertRecAt[A](e:A, n:Int, xs: List[A]):List[A]=&lt;br /&gt;    (n,xs) match {&lt;br /&gt;      case (0,ys) =&gt; e::ys&lt;br /&gt;      case (_,y::ys) =&gt;y::insertRecAt(e,n-1,ys)&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;  //P22&lt;br /&gt;  def range[A](s:Int, e:Int):List[Int]=(s to e).toList&lt;br /&gt;  &lt;br /&gt;  //I don't think is the purpose of the exercise! Again, let's try recursion&lt;br /&gt;  def rangeRec(s:Int, e:Int):List[Int]= if (e-s==0) e::Nil else s::rangeRec(s+1,e)&lt;br /&gt;  &lt;br /&gt;  //recursion and pattern matching with guards&lt;br /&gt;  //a little more readable&lt;br /&gt;  def rangeRecPm(s:Int, e:Int):List[Int]= (e-s) match {&lt;br /&gt;    case x if (x&gt;0) =&gt;s::rangeRecPm(s+1,e)&lt;br /&gt;    case x if (x==0) =&gt;e::Nil&lt;br /&gt;    case _ =&gt; error("Invalid range")&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;[EDIT: fixed problem 20 ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-1100643377463536493?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/yQFNTTVBgEU/my-take-on-99-problems-in-scala-first.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/04/my-take-on-99-problems-in-scala-first.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-5429368409325840765</guid><pubDate>Tue, 07 Apr 2009 20:50:00 +0000</pubDate><atom:updated>2009-05-05T17:05:22.935-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">humor</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Haskell</category><title>Spare change at the whole Static-vs-Dynamic thingy</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_skxdtFBr4vU/SdvgYps_sRI/AAAAAAAAAoM/szPfzPsDt-0/s1600-h/IMG_1758.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_skxdtFBr4vU/SdvgYps_sRI/AAAAAAAAAoM/szPfzPsDt-0/s400/IMG_1758.JPG" alt="" id="BLOGGER_PHOTO_ID_5322094098784432402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;(NOTE: I'm a software developer, I have a blog, clearly I &lt;a title="Someone is WRONG on the internet" href="http://xkcd.com/386/" id="zjw3"&gt;MUST&lt;/a&gt;  write about &lt;a title="What To Know Before Debating Type Systems" href="http://www.pphsg.org/cdsmith/types.html" id="s0e."&gt;static-vs-dynamic&lt;/a&gt; ... I guess soon I'll be writing a monads tutorial)&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;With all the fuss about Twitter migrating (the back-end) from Ruby to Scala (w00t!), the whole static-vs-dynamic debate has been re-ignited.&lt;br /&gt;As a disclaimer, I'm in the static typing "camp". I've tried Ruby but didn't spark anything. In "dynamic languages", I have more experience with JavaScript (and for the record, I think is awesome: a true underdog of programming languages).&lt;br /&gt;While I can appreciate the freedom and speed of development of  dynamic languages, and I think is a matter of personal styles than about which one is better ("choose your own poison"), I think static typing suits better my frame of mind while creating software.&lt;br /&gt;Anyhow, I felt something was missing in the debate and Twitter's use of "kind_of?" points to one of the reasons for static typing I been trying to articulate for a while.&lt;br /&gt;&lt;i&gt;(First and foremost: if you're going to complain "static typing forces me to add a lot of boilerplate and cruft", look into Haskell, ML, Scala, or F# and then come back or you'll force me to do evil things to cute creatures. And if you want to learn how a type system can be used to PROVE that a program is correct, look into &lt;a title="The Coq proof assistant" href="http://coq.inria.fr/" id="r2s5"&gt;Coq&lt;/a&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Types reduces the possible combinations between components&lt;/b&gt;&lt;br /&gt;Any software program can be seen as a system of interconnected elements (modules/functions/objects, etc.), by adding type information you're restricting the ways those elements can connect to each other and the possible execution paths of the system. By doing that, you're loosing some of the valid combinations, you're also trimming many invalid ones.&lt;br /&gt;The argument is with good unit tests you can check for the same things, but you have to actually write the code for that. While you should have unit tests for your module, without type restrictions, you have to write and test more execution paths. Moreover, writing the test, executing it and analyzing the result are separate steps, where your brain has to switch contexts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Types as a Poka-Yoke&lt;/b&gt;&lt;br /&gt;There's a lot of influence of Lean Manufacturing in software development (all the "Agile" stuff ), and from that perspective, having more restrictions on how you can use the available components acts like a &lt;a title="poka-yoke" href="http://en.wikipedia.org/wiki/Poka_yoke" id="iouf"&gt;poka-yoke&lt;/a&gt;  mechanism: "a &lt;a href="http://en.wikipedia.org/wiki/Behavior-shaping_constraint" title="Behavior-shaping constraint"&gt;behavior-shaping constraint&lt;/a&gt;, or a method of preventing &lt;a href="http://en.wikipedia.org/wiki/Error" title="Error"&gt;errors&lt;/a&gt; by putting limits on how an operation can be performed in order to force the correct completion of the operation".  The same Lean / Total Quality Management recommends catching defects as early as possible and not use testing as a product quality measure. How more agile can you be when you don't have to write and run test to achieve a basic level of integration quality?&lt;br /&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;&lt;br /&gt;&lt;b&gt;Types as (kind-of) contracts&lt;/b&gt;&lt;br /&gt;By using static typing you get self-documenting self-enforcing operation contracts (for a price)&lt;/span&gt;&lt;/span&gt;. I believe the larger and more complex the system, the more static typing can help than hinder your work.&lt;br /&gt;&lt;a title="MARS CLIMATE ORBITER TEAM FINDS LIKELY CAUSE OF LOSS" href="http://marsweb.jpl.nasa.gov/msp98/news/mco990930.html" id="nozq"&gt;NASA could have saved some money&lt;/a&gt;  if they were able to write:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;class MarsObiter {&lt;br /&gt;def setThrust(v:Thrust[MetricUnits])= ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;There's no way you can use a Thrust[ImperialUnits] instead. (For extra points, you can define an implicit conversion in Scala :D )&lt;br /&gt;But even if you have a basic type system like Java, don't just suffer it, use it at your advantage, create the types that can help you to write better code.&lt;br /&gt;Check &lt;a title="Never, never, never use String in Java (or at least less often :-)" href="http://www.codemonkeyism.com/archives/2008/05/02/never-never-never-use-string-in-java-or-at-least-less-often/" id="nirr"&gt;Stephan's excellent post&lt;/a&gt;  on what do you loose if you use only primitive types with no semantic meaning (or no types at all)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_skxdtFBr4vU/SdvhBKvIZ1I/AAAAAAAAAoU/pUhSPLgzyuY/s1600-h/IMG_1652.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 312px; height: 234px;" src="http://2.bp.blogspot.com/_skxdtFBr4vU/SdvhBKvIZ1I/AAAAAAAAAoU/pUhSPLgzyuY/s400/IMG_1652.JPG" alt="" id="BLOGGER_PHOTO_ID_5322094794846529362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Enough!&lt;/b&gt;&lt;br /&gt;But enough babbling, I can show some examples using the "lowly" Java language:&lt;br /&gt;Suppose we have a method to book a shipment for a customer and a container on a specific date.&lt;br /&gt;Let's start without any typing information:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public bookShipment(customerId, containerId, shipmentDate){...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Totally valid, but... is "1234-321" a valid customerId? can I use a string as shipmentDate? in which format? What I get back?&lt;br /&gt;Let's improve things a little by adding some basic typing information:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public boolean bookShipment(int customerId, int containerId, Date shipmentDate){...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Well, now I now that "X123Z" is not a valid customer or that "MRSK0023" is not a valid container, the date must be a proper date object, and it doesn't take a PhD to infer that will return true if the booking is successful.&lt;br /&gt;But still, nothing prevents me to swap customerId with containerId and get a nasty but subtle bug. Wouldn't be nice if the compiler can prevent that? Well, it can if you don't use primitives and use more domain meaningful types, giving you a &lt;a title="Domain Driven Design" href="http://domaindrivendesign.org/" id="dyz:"&gt;DDD&lt;/a&gt; flavor (and that's a win-win situation)&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public boolean bookShipment(Customer customer, Container container, Date time){...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;By examining the signature we know we can't pass a Container when a Customer is expected, and the method reflects better the domain of the application and tries to move towards "an ubiquitous language". But we can improve that:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public bookShipment(customerId, containerId, shipmentDate) { ...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here &lt;a title="Hindley-Milner" href="http://en.wikipedia.org/wiki/Type_inference" id="hu.0"&gt;Hindley-Milner&lt;/a&gt;   type inference takes care of identifying the input and output paremeters. No need to declare a thing and still type safe!&lt;br /&gt;(although for documentation/readability purposes, I prefer explicit type declarations, and seems that the Haskell community agrees... that's why I don't mind typing the types of methods in Scala)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_skxdtFBr4vU/SdvmNav_cBI/AAAAAAAAAoc/-eixofbbSGU/s1600-h/IMG_1760.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 271px; height: 202px;" src="http://2.bp.blogspot.com/_skxdtFBr4vU/SdvmNav_cBI/AAAAAAAAAoc/-eixofbbSGU/s200/IMG_1760.JPG" alt="" id="BLOGGER_PHOTO_ID_5322100502861672466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The whole point about all this? Go back and get things done, use whatever suites you best and don't waste your time reading blogs and stuff ;-)&lt;br /&gt;If you excuse me, I need to step down from my tittle soapbox and go to do some coding...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-5429368409325840765?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/TzinIz03QSU/spare-change-at-whole-static-vs-dynamic.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_skxdtFBr4vU/SdvgYps_sRI/AAAAAAAAAoM/szPfzPsDt-0/s72-c/IMG_1758.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/04/spare-change-at-whole-static-vs-dynamic.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-2014577774252868702</guid><pubDate>Thu, 02 Apr 2009 00:07:00 +0000</pubDate><atom:updated>2009-04-01T20:12:28.087-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">quotes</category><title>Quote of the month</title><description>&lt;span style="font-size:130%;"&gt;"Bad programming is easy. &lt;i&gt;Idiots&lt;/i&gt; can learn it in &lt;i&gt;21 days&lt;/i&gt;, even if they are &lt;i&gt;dummies&lt;/i&gt;."&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a href="http://www.ccs.neu.edu/home/matthias/HtDP2e/index.html"&gt;How to Design Programs, 2nd Edition &lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-2014577774252868702?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/XVGVFIRLs7A/quote-of-month.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/04/quote-of-month.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-8948014180273603324</guid><pubDate>Mon, 09 Feb 2009 00:44:00 +0000</pubDate><atom:updated>2009-04-30T15:38:13.420-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">currying</category><category domain="http://www.blogger.com/atom/ns#">Haskell</category><title>Flavors of Curry: Scala vs Haskell</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_skxdtFBr4vU/SY9_dYYvsVI/AAAAAAAAAjY/UW0SDr3s1nc/s1600-h/IMG_0336.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_skxdtFBr4vU/SY9_dYYvsVI/AAAAAAAAAjY/UW0SDr3s1nc/s400/IMG_0336.JPG" alt="" id="BLOGGER_PHOTO_ID_5300595429177536850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Scala is a nice language to explore functional programming, and for me it was easy to use it as a “stepping stone” and jump to Haskell with all the purity and laziness (I think is because I'm the kind of guy that enter slowly in the cold water...). I'm  using Haskell to learn the theory and tools of functional programming (in a language that forces you to), so I can use them in Scala.&lt;br /&gt;&lt;br /&gt;To that end, I'm going through &lt;a href="http://learnyouahaskell.com"&gt;“Learn You a Haskell for Great Good!”&lt;/a&gt;  (I seem to have a fondness for technical books with silly images). Usually I'll try to do the same exercises in Scala to compare.&lt;br /&gt;&lt;br /&gt;I was going through the chapter about higher order functions and currying. What are curried functions?  You can find a very good explanation in &lt;a href="http://en.wikipedia.org/wiki/Currying"&gt;wikipedia&lt;/a&gt; (of course!). Basically is the transformation of a function with multiple parameters into another function with only one parameter that returns a function of the remaining parameters. With that, your language can care only about functions with only one parameter and still be equally powerful. The advantage is if you call a function with less parameters, you get a partially applied function.&lt;br /&gt;&lt;br /&gt;One of the examples on the “Learn you...” is a “flip” function: a function that exchanges the first and second parameter of a given function. In Haskell is as easy as:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;flip1 f x y = f y x&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That's all! Hindley-Milner type inference ensures the type safety:&lt;br /&gt;&lt;code class="prettyprint"&gt;flip1 :: (t1 -&gt; t -&gt; t2) -&gt; t -&gt; t1 -&gt; t2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As an example:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;f x y =x/y&lt;br /&gt;f 1 2&lt;br /&gt;0.5&lt;br /&gt;&lt;br /&gt;g= flip1 f&lt;br /&gt;g 1 2&lt;br /&gt;2.0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;BTW, there's something odd:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;Prelude&gt; let flip1 f x y = f y x&lt;br /&gt;Prelude&gt; :t flip1&lt;br /&gt;flip1 :: (t1 -&gt; t -&gt; t2) -&gt; t -&gt; t1 -&gt; t2&lt;br /&gt;Prelude&gt; let f x y =x/y&lt;br /&gt;Prelude&gt; :t f&lt;br /&gt;f :: (Fractional a) =&gt; a -&gt; a -&gt; a&lt;br /&gt;Prelude&gt; let g=flip f&lt;br /&gt;Prelude&gt; :t g&lt;br /&gt;g :: Double -&gt; Double -&gt; Double&lt;br /&gt;Prelude&gt; :t flip1 f&lt;br /&gt;flip1 f :: (Fractional t1) =&gt; t1 -&gt; t1 -&gt; t1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The type of flip1 f is (Fractional t1) =&gt; t1 -&gt; t1 -&gt; t1, meaning that t1 is restricted to be of Fractional typeclass, but if I bind g to flip f, now the type is Double... that's not what one would expect! (Any Haskell expert can tell me what's happening?)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As usual, I'll tried to do the same in Scala to see how far it can goes.&lt;br /&gt;The main difference is of course, type inference: in Scala you need to declare the function types. The other major difference is Haskell every function is curried by default, in Scala you need to explicitly curry the function by separating each parameter between parentheses.&lt;br /&gt;&lt;br /&gt;In Scala, our (curried) f function will be:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;def f(x:Int)(y:Int)=x/y&lt;br /&gt;f: (Int)(Int)Int&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The flip function in Scala would be:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;def flip1[A,B,C]( f:A=&gt;B=&gt;C)(x:B)(y:A) =f(y)(x)&lt;br /&gt;flip1: [A,B,C]((A) =&gt; (B) =&gt; C)(B)(A)C&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Is clearly more verbose than the Haskell version, but equally powerful:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;def g = flip1 (f) _&lt;br /&gt;g: (Int) =&gt; (Int) =&gt; Int&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The underscore is needed to get the partially applied function and the f must be in parentheses (again,  all curried parameters must have their own parentheses).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conclusion? Nothing. Haskell and Scala are obviously different, but they share some common ground... just wanted to show it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-8948014180273603324?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/hTpH8Bg1PdI/flavors-of-curry-scala-vs-haskell.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_skxdtFBr4vU/SY9_dYYvsVI/AAAAAAAAAjY/UW0SDr3s1nc/s72-c/IMG_0336.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2009/02/flavors-of-curry-scala-vs-haskell.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-4756504619393631789</guid><pubDate>Fri, 19 Dec 2008 03:22:00 +0000</pubDate><atom:updated>2009-04-28T11:18:23.400-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">pathfinding</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">optimization</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><title>Playing with Scala 5 ½: More variations</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_skxdtFBr4vU/SUsUN-XaoBI/AAAAAAAAAi0/DAs4kC5z6Aw/s1600-h/095.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_skxdtFBr4vU/SUsUN-XaoBI/AAAAAAAAAi0/DAs4kC5z6Aw/s400/095.JPG" alt="" id="BLOGGER_PHOTO_ID_5281337218334105618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt; &lt;p style="margin-bottom: 0in;"&gt;As &lt;a href="http://gabrielsw.blogspot.com/2008/12/playing-with-scala-5-improving-code-use.html?showComment=1229353440000#c6142691751585604111"&gt;James pointed out&lt;/a&gt;, the implicit conversion creates a new object every time we convert the Node to Ordered[Node], and although the JVM and the GC can deal pretty well with that kind of scenario, it will be better if we can avoid the creation of the object  (BTW, the fact that Scala can leverage years of work on JIT optimizations is something that shouldn't be taken lightly... I still want tail call optimization, though)&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;We need to add the Ordered trait for Node somewhere in the hierarchy. The reasonable place is when we add the Weight trait (once we have weight we can compare the nodes):&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;DfsNode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;extends&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;NodeImpl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;with&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;with&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Ordered&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;DfsNode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;]{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;): &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;Now we can compare the nodes by their weight: “lighter” nodes are before “heavier” nodes, but the comparation is not what we need for the priority queue, we need to reverse the the ordering.&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;The most immediate way is just reverse DfsNode's comparation function:&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;def&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;compare&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;: &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;): &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; = -&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;weight&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;compare&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;weight&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;but this has the undesirable effect of reversing all the node comparations, and most of the time I'll bet we want to have the lighter nodes before the heavier ones, the reverse is counter-intuitive (and the potential source of nightmares). The solution? Let's create our particular flavor of DfsNode with the comparation reversed to use it in the PriorityQeue:&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;PQNode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;extends&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;DfsNode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;override&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;): &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = -&lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;super&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;And we just need to change our newNode method to return PQNodes instead of DfsNodes:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;protected&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;newNode&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;PQNode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;For extra points on modularization, we can extract those changes and the code related to the algorithm in a subclass of DfsGraph.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Here is the complete code:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;package dfs2;&lt;br /&gt; &lt;br /&gt;abstract class Graph {&lt;br /&gt;  type Edge&lt;br /&gt;  type Node &lt;: NodeIntf&lt;br /&gt;  abstract class NodeIntf {&lt;br /&gt;   def connectWith(node: Node): Edge&lt;br /&gt;  }&lt;br /&gt;  def nodes: Set[Node]&lt;br /&gt;  def edges: Set[Edge]&lt;br /&gt;  def addNode: Node&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;abstract class DirectedGraph extends Graph {&lt;br /&gt;  type Edge &lt;: EdgeImpl&lt;br /&gt;  class EdgeImpl(origin: Node, dest: Node) {&lt;br /&gt;    def from = origin&lt;br /&gt;    def to = dest&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  class NodeImpl extends NodeIntf {&lt;br /&gt;    self: Node =&gt;&lt;br /&gt;    def connectWith(node: Node): Edge = {&lt;br /&gt;     val edge = newEdge(this, node)&lt;br /&gt;     edges = edges + edge&lt;br /&gt;     edge&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  protected def newNode: Node&lt;br /&gt;  protected def newEdge(from: Node, to: Node): Edge&lt;br /&gt;  &lt;br /&gt;  var nodes: Set[Node] =Set()&lt;br /&gt;  var edges: Set[Edge] =Set()&lt;br /&gt;  def addNode: Node = {&lt;br /&gt;    val node = newNode&lt;br /&gt;    nodes = nodes + node&lt;br /&gt;    node&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;trait Weight {&lt;br /&gt;  var weight= Float.PositiveInfinity&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;import scala.collection.mutable.PriorityQueue;&lt;br /&gt; &lt;br /&gt;class DfsGraph extends DirectedGraph {&lt;br /&gt;  class DfsNode extends NodeImpl with Weight with Ordered[DfsNode]{&lt;br /&gt;  var previous: DfsNode = _&lt;br /&gt;  var label:String = _&lt;br /&gt;  var nodeEdges: Set[Edge] = Set()&lt;br /&gt;  &lt;br /&gt;  override def connectWith(node: Node): Edge = {&lt;br /&gt;    val newEdge=super.connectWith(node)&lt;br /&gt;    nodeEdges = nodeEdges + newEdge&lt;br /&gt;    newEdge&lt;br /&gt;  }&lt;br /&gt;    def --&gt;(n2:Node):DfsEdge =connectWith(n2)&lt;br /&gt; &lt;br /&gt;    override def toString()= label+ " w:"+weight&lt;br /&gt;    def compare(y: Node): Int = this.weight.compare(y.weight)&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;  class DfsEdge(origin:Node, dest:Node) extends EdgeImpl(origin, dest) with Weight {&lt;br /&gt;    override def toString()= from.label+"--&gt;"+to.label+" w:"+weight&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  def addNewNode(l:String):Node={&lt;br /&gt;    val newNode=super.addNode&lt;br /&gt;    newNode.label=l&lt;br /&gt;    newNode&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  type Node= DfsNode&lt;br /&gt;  type Edge= DfsEdge&lt;br /&gt; &lt;br /&gt;  protected def newEdge(from: Node, to: Node): Edge = new DfsEdge(from,to)&lt;br /&gt;  protected def newNode: Node = new DfsNode&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;class DijkstraSPGraph extends DfsGraph {&lt;br /&gt;  &lt;br /&gt;  class PQNode extends DfsNode {&lt;br /&gt;    override def compare(y: Node): Int = -super.compare(y)&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  override protected def newNode: Node = new PQNode&lt;br /&gt;  &lt;br /&gt;  def shortestPath(start: DfsNode, end: DfsNode) = {&lt;br /&gt;  val unvisited=new PriorityQueue[Node]()&lt;br /&gt;    unvisited++=(nodes)&lt;br /&gt;  start.weight=0&lt;br /&gt;  while (!unvisited.isEmpty) {&lt;br /&gt;    val vertx=unvisited.dequeue&lt;br /&gt;        for (v &lt;- vertx.nodeEdges if canImprove(v)){&lt;br /&gt;          unvisited+improveDistance(v)&lt;br /&gt;        }&lt;br /&gt;  }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  def canImprove(a:Edge)=(a.from.weight+a.weight&lt; a.to.weight)&lt;br /&gt;  &lt;br /&gt;  def improveDistance(a:Edge) ={&lt;br /&gt;    val v=a.to&lt;br /&gt;  v.weight=a.from.weight+a.weight&lt;br /&gt;  v.previous=a.from&lt;br /&gt;    v&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  def pathToStart(end:DfsNode):List[DfsNode] = {&lt;br /&gt;    if (end == null)&lt;br /&gt;      Nil&lt;br /&gt;    else&lt;br /&gt;        end :: pathToStart(end.previous)&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;object Example extends Application {&lt;br /&gt; &lt;br /&gt;  val graph = new DijkstraSPGraph&lt;br /&gt; &lt;br /&gt;  val n1=graph addNewNode "start"&lt;br /&gt;  val n2=graph addNewNode "n2"&lt;br /&gt;  val n3=graph addNewNode "n3"&lt;br /&gt;  val n4=graph addNewNode "n4"&lt;br /&gt;  val n5=graph addNewNode "n5"&lt;br /&gt;  val n6=graph addNewNode "end"&lt;br /&gt;  graph addNewNode "alone"&lt;br /&gt;  &lt;br /&gt;  n1--&gt;n2 weight=2&lt;br /&gt;  n1--&gt;n3 weight=1&lt;br /&gt;  n2--&gt;n4 weight=1&lt;br /&gt;  n3--&gt;n4 weight=3&lt;br /&gt;  n2--&gt;n5 weight=1&lt;br /&gt;  n4--&gt;n6 weight=1&lt;br /&gt;  n5--&gt;n6 weight=3&lt;br /&gt;  &lt;br /&gt;  n1--&gt;n6 weight=7&lt;br /&gt;  n1--&gt;n4 weight=10&lt;br /&gt;  &lt;br /&gt;  graph.shortestPath(n1,n6)&lt;br /&gt;  println("Path")&lt;br /&gt;  graph.pathToStart(n6).reverse.map(println(_))&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-4756504619393631789?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/IhNvqLtRtZs/playing-with-scala-5-more-variations.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_skxdtFBr4vU/SUsUN-XaoBI/AAAAAAAAAi0/DAs4kC5z6Aw/s72-c/095.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/12/playing-with-scala-5-more-variations.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-4288549009546759320</guid><pubDate>Mon, 15 Dec 2008 03:28:00 +0000</pubDate><atom:updated>2008-12-14T22:51:33.372-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">pathfinding</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">optimization</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><title>Playing with Scala 5: improving code, use of views and comprehensions</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_skxdtFBr4vU/SUXSJUuQr9I/AAAAAAAAAis/TZ81i9QkdK0/s1600-h/IMG_0329.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 345px; height: 259px;" src="http://1.bp.blogspot.com/_skxdtFBr4vU/SUXSJUuQr9I/AAAAAAAAAis/TZ81i9QkdK0/s400/IMG_0329.JPG" alt="" id="BLOGGER_PHOTO_ID_5279857195785170898" border="0" /&gt;&lt;/a&gt;&lt;style type="text/css"&gt;e { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;&lt;/style&gt;After reading about different optimization to pathfinding algorithms, I decided to improve my Dijkstra implementation by using a priority queue instead of a set for the unvisited nodes. Using the “weight” of the vertex as the priority, we can avoid searching the whole set for the minimum and we reduce the cost of the operation from  O(n) to O(log n).&lt;br /&gt;&lt;p style="margin-bottom: 0in;"&gt;The first change is replace the set with Scala's priority queue:&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;val&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;unvisited&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;PriorityQueue&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;]()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;But as it is, it will not compile: the priority queue's signature is &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;code&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; PriorityQueue[A](&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;implicit&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; view$1 : (A) =&gt; Ordered[A])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="text-decoration: none;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="text-decoration: none;"&gt;extends  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ResizableArray[A] &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;with&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; CloneableCollection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;You need to provide an implicit conversion from the parameter type A to the type Ordered[A]. But nothing to worry about: is as easy as&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;implicit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;node2ordered&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;n&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;): &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Ordered&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;] = &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Ordered&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;] {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(255, 94, 94);"&gt;//reverse the comparation so highest priority = lower cost&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Node&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;): &lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = -(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;n&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;compare&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;y&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Look at the improveDistance function, it does two things: filters the nodes and updates the distance if we can improve it. I think is better if we split into two different functions, separating the filtering from the updating, so instead of:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(127, 127, 127);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;improveDistance&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;:Edge) ={&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 127, 127);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;&lt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;weight&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;previous&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;b&gt;a&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;we get:&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;def&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;canImprove&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;Edge&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)=(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;to&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;and   &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(76, 76, 76);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;def&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;improveDistance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(142, 62, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Edge&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;) ={&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;to&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;from&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;weight&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;to&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;previous&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;from&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;to&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Then, instead of a function map over the nodeEdges, we have to filter and then map:  &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;vertx&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(27, 27, 215);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;nodeEdges&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;map&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(30, 144, 255);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;improveDistance&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;(_))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;is replaced by&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;vertx&lt;/span&gt;.&lt;span style="color: rgb(35, 0, 251);"&gt;nodeEdges&lt;/span&gt;.&lt;span style="color: rgb(0, 62, 133);"&gt;filter&lt;/span&gt;(&lt;span style="color: rgb(0, 62, 133);"&gt;canImprove&lt;/span&gt;(_))).&lt;span style="color: rgb(0, 62, 133);"&gt;map&lt;/span&gt;(&lt;span style="color: rgb(0, 62, 133);"&gt;improveDistance&lt;/span&gt;(_)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;that gives a better picture of the steps involved.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;As we need to add the updated nodes to the priority queue so they can “float” to the top, the line would look like:&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;unvisited&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;++&lt;/span&gt; (&lt;span style="color: rgb(35, 0, 251);"&gt;vertx&lt;/span&gt;.&lt;span style="color: rgb(35, 0, 251);"&gt;nodeEdges&lt;/span&gt;.&lt;span style="color: rgb(0, 62, 133);"&gt;filter&lt;/span&gt;(&lt;span style="color: rgb(0, 62, 133);"&gt;canImprove&lt;/span&gt;(_))).&lt;span style="color: rgb(0, 62, 133);"&gt;map&lt;/span&gt;(&lt;span style="color: rgb(0, 62, 133);"&gt;improveDistance&lt;/span&gt;(_))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;But I don't really think the explicit use of map and filter helps readability.&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Enter Scala's for comprehensions: we can replace the map/filter with a comprehension:&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(76, 76, 76);"&gt; for&lt;/span&gt; (&lt;span style="color: rgb(35, 0, 251);"&gt;v&lt;/span&gt; &lt;- &lt;span style="color: rgb(35, 0, 251);"&gt;vertx&lt;/span&gt;.&lt;span style="color: rgb(35, 0, 251);"&gt;nodeEdges&lt;/span&gt; &lt;span style="color: rgb(76, 76, 76);"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 62, 133);"&gt;canImprove&lt;/span&gt;(&lt;span style="color: rgb(35, 0, 251);"&gt;v&lt;/span&gt;)){&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;          &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;unvisited&lt;/span&gt;&lt;span style="color: rgb(0, 62, 133);"&gt;+improveDistance&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(35, 0, 251);"&gt;v&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Nothing fantastic, but an improvement, isn't it?&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;For future posts, I'm planning on generalizing the algorithm into a A* pathfinding with different heuristic functions... stay tuned!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-4288549009546759320?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/QVuzOSDgDek/playing-with-scala-5-improving-code-use.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_skxdtFBr4vU/SUXSJUuQr9I/AAAAAAAAAis/TZ81i9QkdK0/s72-c/IMG_0329.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/12/playing-with-scala-5-improving-code-use.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-7352821789510968348</guid><pubDate>Thu, 23 Oct 2008 01:46:00 +0000</pubDate><atom:updated>2008-10-22T22:10:40.338-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">risk</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">security</category><title>Simple Java tricks to protect your web application against SQL injection</title><description>Your application is vulnerable to &lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL Injection&lt;/a&gt; when you send unfiltered strings to the database. Most modern ORM frameworks should take care of it (but don't take my word!... go ahead and check how secure your framework is).&lt;br /&gt;Sometimes,  you have to work with plain JDBC (or ODBC). Here is a couple of tricks that help:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First and foremost, avoid concatenating strings for SQL queries. Use prepared statements unless is not possible (i.e. cases when you have undefined number of parameters)&lt;/li&gt;&lt;li&gt;Leverage the language type system: If you're passing a number, use Integer instead of String... any invalid character will fail the conversion and will not reach the DB.&lt;/li&gt;&lt;li&gt;If there's no option but concatenate strings, make sure the database comment quotes are escaped (for example, in DB2 you have to replace the single quote character with 2 single quote characters:  instead of &lt;span style="font-family: courier new;"&gt;"SELECT * FROM users WHERE name='"+param+"'" &lt;span style="font-family: arial;"&gt;use &lt;/span&gt;"SELECT * FROM users WHERE name='"+param.replaceAll("'","''")+"'"&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;For something a little more advanced, you can wrap the strings in some kind of "EscapedString" class, and use that class in the signature of the DAOs (related to 2. )&lt;br /&gt;&lt;br /&gt;Note: by no means this is a comprehensive list. Application security is very hard, check your database documentation...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-7352821789510968348?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/8doa6ML6hwg/simple-java-tricks-to-protect-your-web.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/10/simple-java-tricks-to-protect-your-web.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-8054537599498881967</guid><pubDate>Thu, 25 Sep 2008 03:49:00 +0000</pubDate><atom:updated>2008-09-25T08:36:57.199-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">ICFP</category><category domain="http://www.blogger.com/atom/ns#">humor</category><title>Java: The programming tool of choice for discriminating hackers</title><description>In spite of all the Java bashing that's so in vogue this days, Team Smartass won the &lt;a href="http://www.icfpcontest.org/"&gt;ICFP Programming Contest&lt;/a&gt; using Java, giving bragging rights to say that Java is "The programming tool of choice for discriminating hackers".&lt;br /&gt;while(tongue in cheek){&lt;br /&gt;   take(this);&lt;br /&gt;   (lisp (snobs all))&lt;br /&gt;   fuctional_programing = Maybe[zealots]&lt;br /&gt;   ruby('fanboys')&lt;br /&gt;}&lt;br /&gt;Another proof of what matters is not the tool, is how you use it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-8054537599498881967?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/CAPgt6wG5CM/java-programming-tool-of-choice-for.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/09/java-programming-tool-of-choice-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-824877044245591867</guid><pubDate>Tue, 26 Aug 2008 00:02:00 +0000</pubDate><atom:updated>2008-08-26T12:13:39.791-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OOAD</category><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">DSL</category><category domain="http://www.blogger.com/atom/ns#">software engineering</category><category domain="http://www.blogger.com/atom/ns#">FluentInterfaces</category><title>State machines using "Fluent interfaces/ DSL" in Java</title><description>I always found state machines very useful for describing particular aspects of object behavior. A classic example can be a shopping order: it can be "pending","in progress", "shipped", etc.&lt;br /&gt;In my previous project, I started with a simple design using a transition matrix. I must confess it didn't work well. It was hard to explain and it grew more complex as new requirements were added. I though it would be simpler if I didn't use any  "fancy OO stuff" and advanced idioms. I've should  know better!&lt;br /&gt;This time I wanted to try something different, and based in my previous experiments with internal DSLs with Scala and my (very limited)  knowledge of the patters to achieve that in java, I just went ahead and tried to come up with something useful and understandable. This time  seems to be  working: although it has some "magic" behind curtains is only in the creation and is very easy to add or modify the configuration class for new or updated states and events. Other members of my project were able to add and remove states and transitions with only a brief explanation.&lt;br /&gt;&lt;br /&gt;The basic classes are pretty simple: State and Event.&lt;br /&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; statemachine;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event(String newLabel){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;        label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=newLabel;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;    /**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;    *&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;label.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; String getLabel() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; String toString(){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;        return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; statemachine;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; java.util.HashMap;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; java.util.Map;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    private&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;  private&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Map&amp;lt;Event,Transition&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt; transitions&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; HashMap&amp;lt;Event,Transition&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;  //no public access to the constructor, must be in the same package&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    State(String newLabel){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=newLabel;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;    &lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    void&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; addTransition(Transition t){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;    transitions&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.put(t.getEvent(),t);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State doEvent(Event e){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;        return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;transitions&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.get(e)).getDestination();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;    /**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;    *&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;label.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; String getLabel() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;            &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;label&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;  *&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;transitions.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;  */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Map&amp;lt;Event,Transition&gt; getTransitions() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;            &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;transitions&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;You send a event to a sate and it returns the next state:&lt;br /&gt;State newState=state.doEvent(event);&lt;br /&gt;The State class holds a map of  [event-&gt;state]  (with the Transition class in the middle, for added effect :) )&lt;br /&gt;As an extra safety measure, the State constructor and the addTransition method is accessible only to the package (well, unless you subclass it)&lt;br /&gt;The "fluency" is provided by the Transition class (the useful methods return &lt;span style="font-weight: bold; font-style: italic;"&gt;this&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;to allow method chaining), so you can write:&lt;br /&gt;new Transition(event).from(origin).to(destination)&lt;br /&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; statemachine;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;origin&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;destination&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;event&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition(Event e){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;event&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=e;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;  public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition from(State orig){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;    origin&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=orig;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;origin&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.addTransition(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition to(State dest){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;        &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;destination&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=dest;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;destination.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;      &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State getDestination() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;    return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;destination&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;event.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event getEvent() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;event&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;&lt;b&gt;@return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;Returns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;the&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;origin.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State getOrigin() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;origin&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;How this will look? Suppose you have a pretty simple FSM:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_skxdtFBr4vU/SLNeQ1AeKdI/AAAAAAAAAcg/BKLMaBHpcfE/s1600-h/StatechartDiagram1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_skxdtFBr4vU/SLNeQ1AeKdI/AAAAAAAAAcg/BKLMaBHpcfE/s400/StatechartDiagram1.jpg" alt="" id="BLOGGER_PHOTO_ID_5238634434761992658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Using the previous pseudoDSL/Fluent interface will look like:&lt;br /&gt;&lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; statemachine;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; FSMDef {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;SUBMITTED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Submitted"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Open"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CANCELLED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Cancelled"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CLOSED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; State(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Closed"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;//Events&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Events {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Open"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CLOSE&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Close"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;REOPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Re-Open"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event &lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CANCEL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Event(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Cancel"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition(Events.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).from(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;SUBMITTED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).to(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition(Events.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CLOSE&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).from(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).to(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CLOSED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition(Events.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;REOPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).from(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CLOSED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).to(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; Transition(Events.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CANCEL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).from(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;OPEN&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;).to(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;i&gt;CANCELLED&lt;/i&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Doesn't seems too complex, right?&lt;br /&gt;I'm just starting with this, and probably barely skim the surface (sure it has some drawbacks), but so far it worked :)&lt;br /&gt;&lt;br /&gt;[EDIT: Fixed the generics declarations that were eaten by the HTML format. BTW, if anybody knows a good code formatter for blog posts, let me know ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-824877044245591867?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/ZpW2XTpQL4I/state-machines-using-fluent-interfaces.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_skxdtFBr4vU/SLNeQ1AeKdI/AAAAAAAAAcg/BKLMaBHpcfE/s72-c/StatechartDiagram1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/08/state-machines-using-fluent-interfaces.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-8055574241022657933</guid><pubDate>Tue, 22 Jul 2008 00:23:00 +0000</pubDate><atom:updated>2008-07-31T09:17:13.668-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><title>Scala: fold/reduce cheatsheet</title><description>&lt;span style=";font-family:Verdana,Arial;font-size:85%;"  &gt;My fold/reduce 'cheat sheet' is something like:&lt;br /&gt;&lt;br /&gt;For the list (a,b,c,d) fold/reduce is:&lt;br /&gt;&lt;br /&gt;reduceLeft(f) =&gt; f(f(f(a,b),c),d)&lt;br /&gt;&lt;br /&gt;foldLeft(Z)(f) =&gt; f(f(f(f(Z,a),b),c),d)&lt;br /&gt;&lt;br /&gt;("applies the function from the left")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;reduceRight(f) =&gt; f(a,f(b,f(c,d)))&lt;br /&gt;&lt;br /&gt;foldRight(Z)(f) =&gt; f(a,f(b,f(c,f(d,Z))))&lt;br /&gt;&lt;br /&gt;("&lt;/span&gt;&lt;span style=";font-family:Verdana,Arial;font-size:85%;"  &gt;applies the function&lt;/span&gt;&lt;span style=";font-family:Verdana,Arial;font-size:85%;"  &gt; from the right")&lt;br /&gt;&lt;br /&gt;[EDIT: as you see, fold and reduce are essentially the same, but fold starts with an outside element ]&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-8055574241022657933?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/8khfv0Bvk3Q/scala-foldreduce-cheatsheet.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/07/scala-foldreduce-cheatsheet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-342783842011845463</guid><pubDate>Sat, 31 May 2008 02:26:00 +0000</pubDate><atom:updated>2008-05-30T22:42:51.528-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">process</category><category domain="http://www.blogger.com/atom/ns#">software engineering</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Questions, only questions</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_skxdtFBr4vU/SEC7ESN6O2I/AAAAAAAAAOU/CM6zPJwT1dM/s1600-h/IMG_0175.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_skxdtFBr4vU/SEC7ESN6O2I/AAAAAAAAAOU/CM6zPJwT1dM/s320/IMG_0175.JPG" alt="" id="BLOGGER_PHOTO_ID_5206366851524344674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Today I'm full of questions. Software development and programming is hard. Is a close encounter with layers and layers of complexity. Once we master one level, we open a whole new level. To tackle it one must employ multiple techniques. But they always involve trade-offs. How to balance programming using standard and maybe cumbersome idioms vs more elegant but more obscure idioms? What if the programming style is too personal and strange to others? Shall we settle for the lowest common denominator ? How do we balance the conflict between something harder to understand at first but easier to extend and maintain against something more familiar but with exponential complexity growth after each change? How do we maintain the "conceptual integrity" (F. Brooks) through the life of the system?   As the project complexity grows, the need for sophisticated techniques increases. (I'm coming to the conclusion that if a developer can't comprehend some level of complexity, shouldn't be allowed to participate in the project without close mentoring).  Refactoring is necessary because entropy. Every code base starts to degrade and loose integrity as evolves. I wonder if there's a code entropy metric... At what point a refactoring is good enough? When do you stop? At least your architecture should be stable, or you didn't validate it.   I guess complexity is in the eye of the beholder. I found  that a system composed of  smaller simple pieces with complex interactions is easier to evolve than bigger pieces with simple interactions because each piece is internally complex and the limited interactions means its harder to combinate them in new ways. Of course, gratuitous complexity should be avoided at all costs. Sometimes I look for a "zen" approach to coding. At the end, I always take a pragmatic approach and find a trade-off that balances the forces. Isn't coding about that? Each line you write is a choice you need to make... At some point we need to use "introspection" and "metaprogramming" but not the programming techniques: introspection on how we approach problem solving and programming and metaprogramming on what we can do to program better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-342783842011845463?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/WFhSNEXMsS0/questions-only-questions.html</link><author>noreply@blogger.com (Gabriel C.)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_skxdtFBr4vU/SEC7ESN6O2I/AAAAAAAAAOU/CM6zPJwT1dM/s72-c/IMG_0175.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/05/questions-only-questions.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-5844695993087030200</guid><pubDate>Mon, 04 Feb 2008 01:45:00 +0000</pubDate><atom:updated>2008-02-03T20:52:28.721-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">OO</category><title>Playing with Scala 4: Abstract types and Self-types</title><description>Thanks to the scala mailing list, and to Eric, I have a satisfying enough model of a graph to be used by the Dijkstra's algorithm.&lt;br /&gt;(well, there already was a generic graph and directed graph written in Scala...  talking about reinventing the wheel!. The solution in &lt;a title="Eric's comment" href="http://gabrielsw.blogspot.com/2008/01/playing-with-scala-3-oo-traits-and.html#c8692825781706817554" id="emp2"&gt;Eric's comment&lt;/a&gt; works great too... is almost the same, but he was faster than me on coming up with it :D )&lt;br /&gt;http://www.scala-lang.org/intro/abstracttypes.html&lt;br /&gt;http://www.scala-lang.org/intro/selfrefs.html&lt;br /&gt;I just used the same code, and changed the nodes and edges to use sets instead of lists (really, we don't care about the order)&lt;br /&gt;The Scala example of Graph uses abstract types: it declares type Node and type Edge as type "parameters" to be defined by concrete implementation. Even more, by declaring type Node &lt;: NodeIntf, we're restricting Node to be subtypes of NodeIntf. The declaration "self: Node =&gt;" tells "I'll use self as Node type"&lt;br /&gt;Then I declared the trait Weighted and extended the class DirectedGraph adding my extensions to NodeImpl and EdgeImpl to use weighted trait and add the node label and the previous property. I had to add a collection of the adjacent arcs, because they weren't in the original Graph and is easier for the algorithm. I overrode the connectWith method to keep track of the adjacent arcs as they're added, also I defined our --&gt; operator to call the connectWith method.&lt;br /&gt;&lt;br /&gt;    class DfsNode extends NodeImpl with Weighted {&lt;br /&gt;&lt;div style="margin-left: 40px;"&gt;    var previous: DfsNode = _&lt;br /&gt;    var label:String = _&lt;br /&gt;    var nodeEdges: Set[Edge] = Set()&lt;br /&gt;   &lt;br /&gt;    override def connectWith(node: Node): Edge = {&lt;br /&gt;      val newEdge=super.connectWith(node)&lt;br /&gt;      nodeEdges = nodeEdges + newEdge&lt;br /&gt;      newEdge&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    def --&gt;(n2:Node):DfsEdge =connectWith(n2)&lt;br /&gt;   &lt;br /&gt;    override def toString()= label+ " w:"+weight&lt;br /&gt;&lt;/div&gt;   }&lt;br /&gt;&lt;br /&gt;Edges are simpler, just add the weight and override toString:&lt;br /&gt; class DfsEdge(origin:Node, dest:Node) extends EdgeImpl(origin, dest) with Weighted {&lt;br /&gt;    override def toString()= from.label+"--&gt;"+to.label+" w:"+weight&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;All are enclosed in the DfsGraph class extending the DirectedGraph class, now I can assign the concrete types for Node and Edge:&lt;br /&gt;  type Node= DfsNode&lt;br /&gt;  type Edge= DfsEdge&lt;br /&gt;&lt;br /&gt;The DirectedGraph class has a addNode method. To keep the DSL-ish quality of the construction of the graph, I added the method addNewNode to take the node label as parameter&lt;br /&gt;  def addNewNode(l:String):Node={&lt;br /&gt;    val newNode=super.addNode&lt;br /&gt;    newNode.label=l&lt;br /&gt;    newNode&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;So we can write: graph addNewNode "nodeLabel".&lt;br /&gt;&lt;br /&gt;The example looks like this:&lt;br /&gt;&lt;br /&gt; &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Example&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Application&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsGraph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                                        &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"start"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"n2"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"n3"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"n4"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"n5"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"end"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=2&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=3&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=3&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;shortestPath&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;println&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Path"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathToStart&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;).&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;reverse&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;println&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(_))&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  Pretty easy to read, don't you think?&lt;br /&gt;In the next post, I'll show you how we can use this algorithm to solve the &lt;a title="&amp;quot;Abbott's revenge&amp;quot;" href="http://acm.uva.es/p/v8/816.html" id="rg0."&gt;"Abbott's revenge"&lt;/a&gt; type of maze. Ideally, I want to create an interpreter for the input, exploring Scala's features for creating language interpreters.&lt;br /&gt;Here is the complete code:&lt;br /&gt;&lt;br /&gt;              &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;package&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; dfs2;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                                            &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;abstract&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;type&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;type&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;: NodeIntf&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;abstract&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;NodeIntf&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;connectWith&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;): &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;nodes&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;]&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;edges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;]&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;              &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;abstract&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DirectedGraph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;type&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;: EdgeImpl&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;EdgeImpl&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;origin&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;dest&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;from&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;origin&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;dest&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;NodeImpl&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;NodeIntf&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;self: Node =&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;connectWith&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;): &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;from&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;to&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;): &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] =&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;edges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] =&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;o:p&gt;&lt;br /&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                                  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Weighted&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= Float.PositiveInfinity&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsGraph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DirectedGraph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;NodeImpl&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Weighted&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodeEdges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;connectWith&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: Node): Edge = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;super&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;connectWith&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodeEdges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodeEdges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;        &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;--&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:Node):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; =&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;connectWith&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" w:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                            &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;origin&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:Node, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;dest&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:Node) &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;EdgeImpl&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;origin&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;dest&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Weighted&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;from&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"--&gt;"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" w:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNewNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;l&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;):Node={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;super&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;addNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;l&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;type&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;type&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;Edge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;from&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: Node, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;to&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: Node): Edge =&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsEdge&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;from&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;to&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;protected&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;newNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: Node = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;shortestPath&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=0&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;while&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (!&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;isEmpty&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{ &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodeEdges&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(_))&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;-&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                                        &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:Edge) ={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;from&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;&lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;from&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;to&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;from&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;]): &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;reduceLeft&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;((&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)=&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; )&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathToStart&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;==&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathToStart&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-5844695993087030200?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/XH20exCPk50/playing-with-scala-4-abstract-types-and.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/02/playing-with-scala-4-abstract-types-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-6580712106124452073</guid><pubDate>Wed, 23 Jan 2008 05:25:00 +0000</pubDate><atom:updated>2008-01-23T00:39:02.337-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">OO</category><title>Playing with Scala 3: OO, Traits, and Views</title><description>&lt;div class="Section1"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;OO&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt; &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Look at graph classes my &lt;a href="http://gabrielsw.blogspot.com/2008/01/playing-with-scala-2-dijkstras-shortest.html"&gt;previous  post&lt;/a&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;       &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;] =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;= &lt;span class="SpellE"&gt;Float.PositiveInfinity&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;visited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;false&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;and&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;, &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Float&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;...&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;Don't you feel that something  doesn't really fit? What are previous, visited, and weight are doing in Node?  And weight in Arc?&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Those properties doesn't really  belong to a generic Node or Arc, they're specific for our algorithm. &lt;span class="GramE"&gt;So, why having them there?&lt;/span&gt; Let's put those attributes on  special cases of Node and Arc: &lt;span class="SpellE"&gt;DfsNode&lt;/span&gt; and &lt;span class="SpellE"&gt;DfsArc&lt;/span&gt;. But wait! Putting weight in both doesn't seem right  either... we're defining the same thing twice! Weight is some kind of  "cross-cutting" attribute. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Traits&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Luckily modern OO languages had a  very elegant way of solving this kind of problems by means of &lt;a href="http://www.scala-lang.org/intro/traits.html"&gt;traits&lt;/a&gt; (usually are described as  "interfaces with implementation" but a very powerful concept), so let's define  our weight as a trait:&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;trait&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Weighted&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;  var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;= &lt;span class="SpellE"&gt;Float.PositiveInfinity&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;So we can clean our Node and Arc  classes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;  var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;] =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;            &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;()=  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;--&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;head&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;br /&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;, &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;()=  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;"--&gt;"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Now they look useful for any graph  application, and we can define our particular versions for the &lt;span class="SpellE"&gt;Dfs&lt;/span&gt; algorithm:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;        &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;extends&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;with&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Weighted&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;: &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;visited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;false&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;()=  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;super&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;" &lt;span class="SpellE"&gt;w:"&lt;span style="color: black; font-style: normal;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(27, 27, 215); font-style: normal;"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;" &lt;span class="SpellE"&gt;p:"&lt;span style="color: black; font-style: normal;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="color: rgb(27, 27, 215); font-style: normal;"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;, &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;) {  &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;()=  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;"--&gt;"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;br /&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;And I just need to change the  signatures of the functions of the algorithm:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                               &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Dijkstra&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;shortestPath&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;graph&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;],  &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;: &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;,  &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;: &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;) =  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;graph&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=0&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;while&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  (!&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;isEmpty&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{ &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(_))&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;-&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  ={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;&lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;]):  &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;reduceLeft&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)=&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; )&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;pathTo&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;] =  {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;==&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;pathTo&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;What? It doesn't compile! &lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;node.transitions&lt;/span&gt;&lt;/span&gt; returns a list of  Nodes and not &lt;span class="SpellE"&gt;DfsNodes&lt;/span&gt;! &lt;span class="SpellE"&gt;Argh&lt;/span&gt;! We've been bitten by the static typing! ("Ha-ha" will  shout the Dynamic typing Nelson). I could use a .&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;asInstanceOf&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;[&lt;/span&gt;type] everywhere  (like a Java cast) but it looks like a kludge and you have to put everywhere!  There must be a better solution, after all, &lt;span class="SpellE"&gt;Scala&lt;/span&gt; is  supposed to look elegant, right?&lt;o:p&gt;&lt;br /&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Views (implicit  conversions)&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Scala&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt; has a very interesting way of  dealing with that kind of problem: by creating &lt;a href="http://www.scala-lang.org/intro/views.html"&gt;views using implicit conversions&lt;/a&gt;, we can convert  from one type to &lt;span class="GramE"&gt;other,&lt;/span&gt; the compiler will insert the  appropriate call when needed. So I defined a conversion from Arc to &lt;span class="SpellE"&gt;DfsArc&lt;/span&gt; and Node to &lt;span class="SpellE"&gt;DfsNode&lt;/span&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;                     &lt;p class="MsoNormal" style=""&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Implicits&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;implicit&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;node2DfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;):&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;isInstanceOf&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;])&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;asInstanceOf&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;]&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;dfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;dfsNode&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;node&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;dfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;implicit&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;arc2DfsArc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;arc&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;):&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; (&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;arc&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;isInstanceOf&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;])&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;arc&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;asInstanceOf&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;]&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;arc&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;arc&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;        &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;And now, everything will &lt;span class="SpellE"&gt;happly&lt;/span&gt; compile. The only caveat is as I defined the method  --&gt; returning an Arc and arc2DfsArc creating a new instance if I pass an Arc,  the use of &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;=2&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt; sets the weight in a new object and  not in &lt;span class="GramE"&gt;the&lt;span style=""&gt;   &lt;/span&gt;object&lt;/span&gt; in the transitions collection. I'm sure there's a better  solution, but meanwhile if we &lt;span class="SpellE"&gt;overrride&lt;/span&gt; the --&gt;  method in &lt;span class="SpellE"&gt;DfsNode&lt;/span&gt; will work:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span class="GramE"&gt;def&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;--&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;: &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsNode&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;):&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; =  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;(&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;)  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;  &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span class="GramE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(27, 27, 215); font-family: 'Courier New';"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;head&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: dodgerblue; font-family: 'Courier New';"&gt;asInstanceOf&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="GramE"&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="SpellE"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: brown; font-family: 'Courier New';"&gt;DfsArc&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;]&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt; color: black; font-family: 'Courier New';"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;(Let me know if you want the full  code posted)&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; color: rgb(127, 127, 127); font-family: 'Courier New';"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-6580712106124452073?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/gVJWtzw7ucQ/playing-with-scala-3-oo-traits-and.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/01/playing-with-scala-3-oo-traits-and.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-469011099818761883</guid><pubDate>Tue, 15 Jan 2008 15:43:00 +0000</pubDate><atom:updated>2008-01-15T10:46:05.897-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">code</category><title>Playing with SCALA 2: Dijkstra’s shortest path (Dsp) algorithm</title><description>&lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;As I continue to play with Scala, I wanted to do something non-trivial, so I decided to to implement &lt;a href="http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm"&gt;Dijstra’s shortest path algorithm&lt;/a&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;As background, my experience is mostly object oriented OOAD and programming in Java (I use it at work).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;The first challenge was getting the algorithm right (the first attempt ended in a beautiful recursive algorithm that just traversed the graph greedily selecting the shortest arc), but wikipedia’s page helped &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: Wingdings; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Just in case, be aware that I’m no Scala expert and no functional programming expert… (I’m no expert on anything at all) I’m just trying to share what I found, I’m sure there’s a better way, feel free to suggest it.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;So far, I’ve enjoyed the experience: programming in Scala is easy and fun (at least compared to Java or C++, … yes, yes, it doesn’t require much, I can think many jokes, leave your in the comments ;-)). &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Sure, I spend a while on seemingly trivial stuff, but that happens when you learn any language (or framework, or anything new!):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;I tried to define a property for a class, in Scala you can do it in the declaration, like this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;      &lt;/span&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{ … }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;But I couldn’t do node.label!! Then I realized I was declaring a private property, if you want accessors you need to use val (and you get a getter) or a var (and you get a getter and a setter), so I’ve changed it to &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) { … }&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;And worked :-D&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;I did a quick search but couldn’t find a quick and easy functional Dsp implementation (seems that there isn’t one, and makes sense as it relies on shared state) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;One of the main steps of the algorithm is find the node with the lower cost. I came up with:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;reduceLeft&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;((&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)=&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Maybe there’s a better way, but I learned how to use “reduce” and looks quite concise and clear &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: Wingdings; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Then, you need to check if you can improve the cost of the adjacent nodes using the one you just found, so I defined:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) ={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;&lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Nothing magic, but then I can use “map” to apply it to all the arcs from the node:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(_))&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Don’t be scared by the “_”, just I’m too lazy and glad that Scala allows me not to type “&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;((a:Arc)=&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(a))”&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;I didn’t use Scala’s available unit testing frameworks, but I did my sort of unit test, so I declared the arcs;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a12&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(n1,n2,1.0)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a13&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(n1,n3,2.2)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a24&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(n2,n4,1.5) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;…&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;But it felt too “Java”, I wanted to try something more “DSL-ish”, and Scala can help because almost any character is valid as a method name, so I added the following to the Node class (transitions is the arc list of the node):&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;--&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;head&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Why? Because now, to add an arc of weight 2 from node N1 to node N2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;, I can write:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;N1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;N2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=2&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Isn’t that neat? &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: Wingdings; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;(I used &lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="background: blue none repeat scroll 0% 50%; font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;--&gt;&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt; instead of -&gt; because I didn’t want to freak out the people scared about changing the meaning of the operators, and Scala uses -&gt; for maps)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;Nodes are declared var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Start"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;), &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;It would be nicer to declare the nodes with “var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Node2"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; “ &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;but it didn’t bother me that much and couldn’t find a quicker way other than use Case classes. If somebody knows a better way, let me know!&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;I leave you here with the full code. Please suggest improvements!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;package&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; myScala;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;= Float.PositiveInfinity&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;visited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;false&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()= {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" w:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" p:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;--&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;head&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Float&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = _&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;override&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;toString&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;()= {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"--&gt;"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" w:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;package&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; myScala;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Dijkstra&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;shortestPath&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;], &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=0&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;while&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (!&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;isEmpty&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;span style=""&gt;  &lt;/span&gt;{ &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;transitions&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(_))&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;unvisited&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;-&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;vertx&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;improveDistance&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Arc&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) ={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;&lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;start&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;min&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;]): &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;nodes&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;reduceLeft&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;((&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;) &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;a&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;b&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathTo&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;):&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;List&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;] = {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; (&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;==&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;null&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Nil&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;::&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathTo&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;end&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;previous&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;package&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; myScala;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;import&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; scala.collection.mutable.HashSet&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;object&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Test&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;/*&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;n1 --2--&gt; n2--1--&gt; n5&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;|&lt;span style=""&gt;         &lt;/span&gt;|&lt;span style=""&gt;        &lt;/span&gt;|&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;1&lt;span style=""&gt;         &lt;/span&gt;1&lt;span style=""&gt;        &lt;/span&gt;3&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;|&lt;span style=""&gt;         &lt;/span&gt;|&lt;span style=""&gt;        &lt;/span&gt;|&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;V&lt;span style=""&gt;         &lt;/span&gt;V&lt;span style=""&gt;        &lt;/span&gt;V&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;n3--3---&gt; n4--1--&gt; n6&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;&lt;span style=""&gt;    &lt;/span&gt;*/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Start"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Node2"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Node3"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Node4"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Node5"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"End"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=2&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=3&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=1&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;--&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=3&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;var&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;=&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;Set&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n2&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n3&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n4&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n5&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;def&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;main&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;args&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Array&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;[&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(139, 105, 20);"&gt;String&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;]) {&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Dijkstra&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;shortestPath&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;graph&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n1&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;println&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;"Path"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Dijkstra&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;pathTo&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;n6&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;).&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;reverse&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;map&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 0.5in; text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;v&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;:&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: brown;"&gt;Node&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)=&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;println&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;(&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;v&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;label&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: dodgerblue;"&gt;+&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(127, 127, 127);"&gt;" dist:"&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;+&lt;/span&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;v&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: rgb(27, 27, 215);"&gt;weight&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;; color: black;"&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-469011099818761883?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/vGIxVnVUmG0/playing-with-scala-2-dijkstras-shortest.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/01/playing-with-scala-2-dijkstras-shortest.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-5368076090930469213</guid><pubDate>Wed, 09 Jan 2008 01:43:00 +0000</pubDate><atom:updated>2009-05-27T00:44:01.112-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">code</category><title>Playing with SCALA: interoperation with Java</title><description>I'm toying with the &lt;a href="http://www.scala-lang.org/"&gt;Scala language&lt;/a&gt; and it looks like what the future Java could be (or a great candidate at least).&lt;br /&gt;It feels like at the sweet spot between OO and functional paradigms.&lt;br /&gt;It has first order functions, closures, comprehensions, type inference, mixing composition, Erlang-style concurrency, pattern matching, and more interesting stuff that makes coding easier and concise.&lt;br /&gt;And the best thing is it compiles to .class files so it integrates seamlessly with Java: you have all your Java libraries when programming in Scala and you can call your Scala classes from your Java code as just another java class.&lt;br /&gt;Of course, I'm not aware of anybody using it in a production environment, but looks VERY promising.&lt;br /&gt;Having this kind of language makes less necessary to "bolt-in" those features in the core Java language.&lt;br /&gt;&lt;br /&gt;So I installed the &lt;a href="http://www.scala-lang.org/downloads/eclipse/index.html"&gt;eclipse plugin&lt;/a&gt; and started to play with it.&lt;br /&gt;&lt;br /&gt;I knew you could use Java libraries in Scala (even you can &lt;a href="http://sntx.livejournal.com/33780.html"&gt;use Hibernate&lt;/a&gt; !) , so I was interested in the opposite way: calling Scala code from Java.&lt;br /&gt;I created a Scala project and copied the QuickSort implementation:&lt;br /&gt;(I put it in an "object", the  Scala's singleton)&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;object MyScalaObj {&lt;br /&gt; def sort(xs: Array[Int]): Array[Int] =&lt;br /&gt;   if (xs.length &lt;= 1)       xs     &lt;br /&gt;   else {       &lt;br /&gt;     val pivot = xs(xs.length / 2)       &lt;br /&gt;     Array.concat(sort(xs filter (pivot &gt;)), xs filter (pivot ==), sort(xs filter (pivot &lt;)))&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After the project is compiled, I created a Java project and used the output path of the Scala project as a library, and voila! I could access the Scala classes from my Java code (even with code-completion). So my Java class is:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class PruebaJavaScalaInterop {&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * @param args&lt;br /&gt;    */&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       int[] org={4,2,5,3,1,9};&lt;br /&gt;       int[] res=MyScalaObj.sort(org);&lt;br /&gt;       System.out.println("Org:");&lt;br /&gt;       dumpArray(org);&lt;br /&gt;       System.out.println("Res:");&lt;br /&gt;       dumpArray(res);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void dumpArray(int[] arr){&lt;br /&gt;       for (int i=0;i&lt;arr.length;&gt;&lt;br /&gt;           System.out.print(arr[i]+" ");&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The nice thing is the complex algorithms can be coded concisely in Scala using a Functional paradigm, and be called seamlessly from plain Java code.&lt;br /&gt;I still need to learn more about it, but the possibilities seems very interesting, don't you think?&lt;/arr.length;&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-5368076090930469213?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/BqurE_QOjw0/playing-with-scala-interoperation-with.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2008/01/playing-with-scala-interoperation-with.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-3444140704555167637</guid><pubDate>Mon, 03 Dec 2007 19:27:00 +0000</pubDate><atom:updated>2007-12-03T14:28:16.315-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">quotes</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">OO</category><title>Quote of the month</title><description>&lt;span style="font-style: italic;"&gt;"Object-oriented programming is like money, as the old joke has it: It's not everything, but it's way ahead of whatever's in second place."&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.dreamsongs.com/ObjectsHaveNotFailedNarr.html"&gt;Objects have not failed - Guy L. Steele Jr.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-3444140704555167637?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/Q9ULRl0mT9w/quote-of-month.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2007/12/quote-of-month.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-8014478437444090961</guid><pubDate>Mon, 19 Nov 2007 03:40:00 +0000</pubDate><atom:updated>2007-11-18T22:55:01.750-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">functional programming</category><category domain="http://www.blogger.com/atom/ns#">code</category><title>Javascript, the underdog</title><description>&lt;p style="margin-bottom: 0in;"&gt;I'm back working on some JavaScript, just like the old times, adding client-side UI dynamics. In spite of still being hard to work and debug (at least in IE), it allows me to play with a different language. I realized the worst thing you can do with JavaScript is use it like Java, it works but you'll miss the interesting features like prototyping and higher order functions.&lt;br /&gt;This week I found that Mozilla JavaScript implements &lt;a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Iteration_methods" target="_blank"&gt;useful iteration methods&lt;/a&gt; were you can pass functions to operate on the collection:&lt;br /&gt;filter, forEach, every, map, and some:&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;filter&lt;/span&gt;&lt;br /&gt;Selects the elements of the collection that satisfy the function&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;forEach&lt;/span&gt;&lt;br /&gt;Applies a function to all the elements of the array&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;every&lt;/span&gt;&lt;br /&gt;Returns true if every element of the array satisfies the function&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;some&lt;/span&gt;&lt;br /&gt;Returns true if at least one element satisfies the function&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;map&lt;/span&gt;&lt;br /&gt;Creates a new array with the results of calling a provided function on every element in this array.&lt;/p&gt;  &lt;p style="margin-bottom: 0in;"&gt;As an example, you can easily write:&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family: courier new;"&gt;    funtion doSomethig(element){ /*whatever*/}&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;and then:&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="font-family: courier new;"&gt;    aCollection.forEach(doSomething)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Suddenly, JavaScript coolness factor has increased for me :-)&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;Those functions are standard in Mozilla JavaScript, but they provide the source code, and is small enough to include it if you're using another browser. And as the objects are “open” and you create new ones by prototyping, you just need to add the code to the object you want (as long as is “array” like) it will work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-8014478437444090961?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/4vJeo55f2h8/javascript-underdog.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2007/11/javascript-underdog.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6893032696317132921.post-5686869483266107323</guid><pubDate>Sat, 10 Nov 2007 01:26:00 +0000</pubDate><atom:updated>2007-11-09T20:31:32.395-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">podcasts</category><category domain="http://www.blogger.com/atom/ns#">OOPSLA</category><category domain="http://www.blogger.com/atom/ns#">software engineering</category><title>OOPSLA keynotes podcasts</title><description>Very interesting software engineering pioneers's podcasts from the OOPSLA 2007 conference:&lt;br /&gt;&lt;a href="http://www.oopsla.org/podcasts/Keynote_DavidLorgeParnas.mp3"&gt;David Parnas&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oopsla.org/podcasts/Keynote_JohnMcCarthy.mp3"&gt;John McCarthy&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.oopsla.org/podcasts/Keynote_FrederickBrooks.mp3"&gt;Frederick Brooks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I couldn't recommend them more!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6893032696317132921-5686869483266107323?l=gabrielsw.blogspot.com'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/GabrielsSoftwareDevelopmentBlog/~3/Z3P5zZLpROM/oopsla-keynotes-podcasts.html</link><author>noreply@blogger.com (Gabriel C.)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://gabrielsw.blogspot.com/2007/11/oopsla-keynotes-podcasts.html</feedburner:origLink></item></channel></rss>
