root/lang/scala/sandbox/src/jp/ne/cappuccino/keisuken/scl/lang/Loop.scala @ 6683

Revision 6683, 3.3 kB (checked in by keisuken, 5 years ago)

String value compare is == changed.

  • Property svn:executable set to *
Line 
1package jp.ne.cappuccino.keisuken.scl.lang
2
3object Loop {
4
5  class BreakWithValue[T](var cond: Boolean, var value: Option[T]) {
6    def this() = this(true, None)
7    def apply(): Unit = {cond = false; value = None}
8    def apply(v: T): Unit = {cond = false; value = Some(v)}
9  }
10
11  class Break(var cond: Boolean) {
12    def this() = this(true)
13    def apply(): Unit = cond = false
14  }
15
16  def forEach[A](iterable: Iterable[A])(p: (A, Break) => Unit): Unit = {
17    val break = new Break()
18    val iterator = iterable.elements
19    while(break.cond && iterator.hasNext)
20      p(iterator.next, break)
21  }
22
23  def findFor[A, B]
24    (iterable: Iterable[A])(p: (A, BreakWithValue[B]) => Unit): Option[B] = {
25    val break = new BreakWithValue[B]()
26    val iterator = iterable.elements
27    while(break.cond && iterator.hasNext)
28      p(iterator.next, break)
29    break.value
30  }
31
32  def whileLoop(cond: => Boolean)(p: Break => Unit): Unit = {
33    val break = new Break()
34    while(break.cond && cond) p(break)
35  }
36
37  def findWhile[A]
38    (cond: => Boolean)(p: BreakWithValue[A] => Unit): Option[A] = {
39    val break = new BreakWithValue[A]()
40    while(break.cond && cond) p(break)
41    break.value
42  }
43
44  def doWhile(cond: => Boolean)(p: Break => Unit): Unit = {
45    val break = new Break()
46    do p(break) while(break.cond && cond)
47  }
48
49  def findDoWhile[A]
50    (cond: => Boolean)(p: BreakWithValue[A] => Unit): Option[A] = {
51    val break = new BreakWithValue[A]()
52    do p(break) while(break.cond && cond)
53    break.value
54  }
55
56  def main(args: Array[String]) {
57
58    forEach(1 to 10) {(i, break) =>
59      if(i == 5) {
60        println(i)
61        break()
62      }
63    }
64
65    var i = 0
66    whileLoop(i < 10) {break =>
67      if(i >= 5) {
68        println(i)
69        break()
70      } else
71        i += 1
72    }
73
74    i = 0
75    doWhile({i += 1; i < 10}) {break =>
76      if(i >= 5) {
77        println(i)
78        break()
79      }
80    }
81
82    i = 0
83    var result1 = findWhile[Int](true) {break =>
84      if(i >= 5)
85        break(i)
86      else
87        i += 1
88    }
89    result1 match {
90      case Some(result) => println(result)
91      case None => println("Not found")
92    }
93
94    i = 0
95    val result2 = findWhile[Int](i < 10) {break =>
96      if(i == 20)
97        break(i)
98      else
99        i += 1
100    }
101    result2 match {
102      case Some(result) => println(result)
103      case None => println("Not found")
104    }
105
106    i = 0
107    val result3 = findDoWhile[Int]({i += 1; i < 10}) {break =>
108      if(i == 5) break(i)
109    }
110    result3 match {
111      case Some(result) => println(result)
112      case None => println("Not found")
113    }
114
115    val result4 = findFor[String, String](
116      Array("aaa", "bbb", "ccc")) {(value, break) =>
117      if(value == "ddd")
118        break(value)
119    }
120    println(result4)
121
122    val result5 = findFor[String,String](Array("aaa", "bbb", "ccc"))
123    {(value, break) =>
124      if(value == "bbb")
125        break(value)
126    } match {
127      case Some(result) => println(result)
128      case None => println("Not found")
129    }
130
131    val result6 = findFor[Int,Int](1 to 10) {(i, break) =>
132      if(i % 2 == 1) break(i)
133    }
134    result6 match {
135      case Some(result) => println(result)
136      case None => println("Not found")
137    }
138  }
139}
Note: See TracBrowser for help on using the browser.