ruby->clojure[.contrib]?.set

 rubyでやる*1

class Set (Ruby 1.8.7)

union,intersection,difference

require 'set'

a = Set[1,2,3,4,5]
b = Set[3,4,5,6,7]

p a + b  #=> #<Set: {5, 6, 1, 7, 2, 3, 4}>
p a & b  #=> #<Set: {5, 3, 4}>
p a - b  #=> #<Set: {1, 2}>

#p a.union b
#p a.intersection b
#p a.difference b

select

 実装するとしたら、こんな感じ。

p Set[0,1,2,3,4,5,6,7,8,9].map!{|n| n.even? ? n : nil}.delete(nil) #=> #<Set: {0, 6, 2, 8, 4}>

project,index


rename-keys,rename


map-invert

 keyとvalueの入れ替えするとなると、こんな感じかな。

#h = {};{:a=>2,:b=>3, :c=>5, :d=>7}.map{|k,v| h[v] = k}
{:a=>2,:b=>3, :c=>5, :d=>7}.inject({}){|r,i| r[i[1]] = i[0]; r } #=>{5=>:c, 7=>:d, 2=>:a, 3=>:b}

join


subset?,superset?,proper-subset?,proper-superset?

p Set[1,2,3].subset? Set[ 2,3 ]          #=> false
p Set[1,2,3].subset? Set[1,2,3]          #=> true
p Set[ 2,3 ].subset? Set[1,2,3]          #=> true

p Set[1,2,3].superset? Set[ 2,3 ]        #=> true
p Set[1,2,3].superset? Set[1,2,3]        #=> true
p Set[ 2,3 ].superset? Set[1,2,3]        #=> false

p Set[1,2,3].proper_subset? Set[ 2,3 ]   #=> false
p Set[1,2,3].proper_subset? Set[1,2,3]   #=> false
p Set[ 2,3 ].proper_subset? Set[1,2,3]   #=> true

p Set[1,2,3].proper_superset? Set[ 2,3 ] #=> true
p Set[1,2,3].proper_superset? Set[1,2,3] #=> true
p Set[ 2,3 ].proper_superset? Set[1,2,3] #=> false

 アイデア募集中><

*1:集合使わないので、内容は新鮮^^だが面白くない><