6.35. kink/container/SET

6.35.1. set型

setは、一意な要素のコンテナの抽象型である。setの中で、要素は、実装定義の同値性において一意でなければならない。

ordered_setは、要素の全順序をサポートするsetの部分型である。kink/container/ORDERED_SETを見よう。

6.35.1.1. Set.have?(Elem)

have?は、SetがElemと同値の要素を持っているかどうかを戻す。

事前条件

Elemは、要素の同値関係の定義域に属さなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar')
stdout.print_line(Set.have?('foo').repr)  # => true
stdout.print_line(Set.have?('xxx').repr)  # => false

6.35.1.2. Set.size

sizeは、Setの要素の数を整数のnum値として戻す。

:TREE_SET.require_from('kink/container/')

:Set <- TREE_SET.of('foo' 'bar')
stdout.print_line(Set.size.repr)  # => 2

6.35.1.3. Set.push(Elem)

pushはElemをSetに挿入する。

SetがすでにElemと同値の要素を持っている場合、pushは何もしないかもしれないし、要素をElemで置き換えるかもしれない。

事前条件

Elemは、要素の同値関係の定義域に属さなければならない。

:TREE_SET.require_from('kink/container/')

:Set <- TREE_SET.of()
Set.push('foo')
Set.push('bar')
Set.push('foo')
stdout.print_line(Set.repr) # => (tree_set "bar" "foo")

6.35.1.4. Set.append(Eacher)

appendはEacherの要素をSetに挿入する。

事前条件

Eacherは、.each($consume)メソッドを提供しなければならない。eachメソッドは、Eacherのそれぞれの要素について$consumeを呼ぶものでなければならない。

Eacherの要素は、Setの要素の定義域に含まれなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar')

Set.append(['bar' 'baz'])
stdout.print_line(Set.repr) # => (flat_set "bar" "baz" "foo")

6.35.1.5. Set.remove(Elem)

removeは、Elemと同値の要素を消す。Setがそのような要素を持っていない場合、removeは何もしない。

事前条件

Elemは、要素の同値関係の定義域に属さなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar' 'baz')
Set.remove('foo')
Set.remove('xxx')
stdout.print_line(Set.repr) # => (flat_set "bar" "baz")

6.35.1.6. Set.clear

clearはすべての要素を消す。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar' 'baz')
Set.clear
stdout.print_line(Set.repr) # => (flat_set)

6.35.1.7. Set.iter

iterメソッドは、Setの要素を含むiterを戻す。

:TREE_SET.require_from('kink/container/')

:Set <- TREE_SET.of('foo' 'bar' 'baz')
Set.iter.each{(:E)
  stdout.print_line(E.repr)
}
# Output:
#   "bar"
#   "baz"
#   "foo"

6.35.1.8. Set.each($consume)

eachは、Setのそれぞれの要素について$consumeを呼び出す。

事前条件

$consumeは、引数ひとつを取る関数でなければならない。

:TREE_SET.require_from('kink/container/')

:Set <- TREE_SET.of('foo' 'bar' 'baz')
Set.each{(:E)
  stdout.print_line(E.repr)
}
# Output:
#   "bar"
#   "baz"
#   "foo"

6.35.1.9. Set.all?($match?)

all?は、Setのすべての要素が述語$match?を満たすかどうかを戻す。

事前条件

$match?は述語でなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of(1 2 3 4 5)
stdout.print_line(Set.all?{(:E) E % 2 == 0 }.repr)  # => false
stdout.print_line(Set.all?{(:E) E < 10 }.repr)    # => true
stdout.print_line(Set.all?{(:E) E >= 10 }.repr)   # => false

6.35.1.10. Set.any?(...[$match?={ true }])

any?はSetの1個以上の要素が述語$match?を満たすかどうかを戻す。

$match?はオプショナルな引数で、デフォルト値は{ true }である。したがって、$match?が渡されない場合、any?はSetが空でないかどうかを戻す。

事前条件

$match?は述語でなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of(1 2 3 4 5)
stdout.print_line(Set.any?{(:E) E % 2 == 0 }.repr) # => true
stdout.print_line(Set.any?{(:E) E < 10 }.repr)     # => true
stdout.print_line(Set.any?{(:E) E >= 10 }.repr)    # => false

:FLAT_SET.require_from('kink/container/')

stdout.print_line(FLAT_SET.of().any?.repr)    # => false
stdout.print_line(FLAT_SET.of(1).any?.repr)   # => true
stdout.print_line(FLAT_SET.of(1 2).any?.repr) # => true

6.35.1.11. Set.count($counted?)

countは、Setの要素のうちで述語$counted?を満たすものの数を、整数のnum値として戻す。

事前条件

$counted?は述語でなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of(1 2 3 4 5)
:Even_count <- Set.count{(:E) E % 2 == 0 }
stdout.print_line(Even_count.repr)  # => 2

6.35.1.12. Set.fold(Init $combine)

foldは、Setの要素をInitを種として畳み込む。

Setが要素E1, E2, E3, ,,, En_1, Enを持つとき、reduceはcombine(combine(,,,combine(combine(E1 E2) E3),,, En_1) En)を戻す。Setが順序付けられていない限り、要素がどんな順番で現れるか決まりはない。

Setが空の場合、foldはInitを戻す。

事前条件

$combineはふたつの値を取る関数でなければならない。

:TREE_SET.require_from('kink/container/')

:Set <- TREE_SET.of(1 2 3 4 5)
:N <- Set.fold(100){(:X :Y) X + Y }
stdout.print_line(N.repr) # => 115

6.35.1.13. Set.reduce($combine ...[$empty_fallback])

reduceは、Setの要素を相互に畳み込む。

Setの要素がE1, E2, E3, ,,, En_1, Enのとき、reduceはcombine(combine(,,,combine(combine(E1 E2) E3),,, En_1) En)を戻す。Setが順序付けられていない限り、要素がどんな順番で現れるか決まりはない。

Setの要素が単一のEのとき、reduceはEを戻す。

Setが空で、$empty_fallbackが与えられている場合、reduceは$empty_fallbackを引数なしで末尾呼び出しする。

Setが空で、$empty_fallbackが与えられていない場合、reduceは例外を投げる。

事前条件

$combineはふたつの値を取る関数でなければならない。

$empty_fallbackはサンクでなければならない。

:TREE_SET.require_from('kink/container/')

:Empty <- TREE_SET.of()
:Non_empty <- TREE_SET.of(1 2 3 4 5)

stdout.print_line(Non_empty.reduce{(:X :Y) X + Y}.repr) # => 15
stdout.print_line(Empty.reduce({(:X :Y) X + Y} { 'empty' }).repr) # => "empty"

6.35.1.14. Set.have_all?(Vals)

have_all?は、Valsのすべての要素をSetが持っているかどうかを戻す。

事前条件

Valsは.all?($match?)メソッドを実装していなければならない。

Valsの要素は、Setの要素の同値関係の定義域に属さなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar' 'baz')

stdout.print_line(Set.have_all?(['foo' 'bar']).repr)  # => true
stdout.print_line(Set.have_all?(['foo' 'X']).repr)    # => false
stdout.print_line(Set.have_all?(['X' 'Y' 'Z']).repr)  # => false

6.35.1.15. Set.have_any?(Vals)

have_any?は、Valsのいずれかの要素をSetが持っているかどうかを戻す。

事前条件

Valsは.any?($match?)メソッドを実装していなければならない。

Valsの要素は、Setの要素の同値関係の定義域に属さなければならない。

:FLAT_SET.require_from('kink/container/')

:Set <- FLAT_SET.of('foo' 'bar' 'baz')

stdout.print_line(Set.have_any?(['foo' 'bar']).repr)  # => true
stdout.print_line(Set.have_any?(['foo' 'X']).repr)    # => true
stdout.print_line(Set.have_any?(['X' 'Y' 'Z']).repr)  # => false

6.35.1.16. Set1 == Set2

== 演算子、つまりop_eqメソッドは、Set1がSet2とおなじ要素のコレクションを持っているかどうかを戻す。

言い換えると、op_eqは、Set1がSet2のすべての要素を持っていて、かつSet2がSet1のすべての要素を持っているかどうかを戻す。

事前条件

Set2はsetでなければならない。

Set1とSet2の要素の同値関係は同じでなければならない。

:TREE_SET.require_from('kink/container/')

:X <- TREE_SET.of('foo' 'bar' 'baz')
:Y <- TREE_SET.of('foo' 'bar' 'baz')
:Z <- TREE_SET.of('A' 'B' 'C')
stdout.print_line((X == Y).repr)  # => true
stdout.print_line((X == Z).repr)  # => false

6.35.2. SET.is?(Val)

is?は、Valがsetであるかどうかを戻す。