scaruby 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/scaruby/concurrent.rb +46 -46
- data/lib/scaruby/core_ext/enumerable.rb +1 -1
- data/lib/scaruby/core_ext/hash.rb +1 -1
- data/lib/scaruby/io.rb +62 -62
- data/lib/scaruby/map.rb +141 -141
- data/lib/scaruby/option.rb +46 -38
- data/lib/scaruby/seq.rb +395 -395
- data/lib/scaruby/version.rb +1 -1
- data/lib/scaruby.rb +59 -58
- data/scaruby.gemspec +23 -23
- data/spec/scaruby/converter_spec.rb +27 -27
- data/spec/scaruby/core_ext/enumerable_spec.rb +288 -288
- data/spec/scaruby/core_ext/hash_spec.rb +92 -92
- data/spec/scaruby/io_spec.rb +56 -56
- data/spec/scaruby/map_spec.rb +117 -117
- data/spec/scaruby/option_spec.rb +50 -43
- data/spec/scaruby/seq_spec.rb +301 -301
- data/spec/scaruby_spec.rb +32 -32
- metadata +19 -27
data/lib/scaruby/concurrent.rb
CHANGED
@@ -1,46 +1,46 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
module Scaruby
|
4
|
-
|
5
|
-
class Future
|
6
|
-
|
7
|
-
attr_accessor :result, :mutex
|
8
|
-
|
9
|
-
def initialize(mutex)
|
10
|
-
assert_type(mutex, Mutex)
|
11
|
-
@mutex = mutex
|
12
|
-
@result = nil
|
13
|
-
end
|
14
|
-
|
15
|
-
def get
|
16
|
-
@mutex.synchronize {
|
17
|
-
@result
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
module ConcurrentOps
|
24
|
-
|
25
|
-
def spawn(&block)
|
26
|
-
Thread.new do
|
27
|
-
yield
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def future(&block)
|
32
|
-
f = Future.new(Mutex.new)
|
33
|
-
Thread.new do
|
34
|
-
f.mutex.synchronize do
|
35
|
-
f.result = yield
|
36
|
-
end
|
37
|
-
end
|
38
|
-
f
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
include Scaruby::ConcurrentOps
|
46
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Scaruby
|
4
|
+
|
5
|
+
class Future
|
6
|
+
|
7
|
+
attr_accessor :result, :mutex
|
8
|
+
|
9
|
+
def initialize(mutex)
|
10
|
+
assert_type(mutex, Mutex)
|
11
|
+
@mutex = mutex
|
12
|
+
@result = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def get
|
16
|
+
@mutex.synchronize {
|
17
|
+
@result
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module ConcurrentOps
|
24
|
+
|
25
|
+
def spawn(&block)
|
26
|
+
Thread.new do
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def future(&block)
|
32
|
+
f = Future.new(Mutex.new)
|
33
|
+
Thread.new do
|
34
|
+
f.mutex.synchronize do
|
35
|
+
f.result = yield
|
36
|
+
end
|
37
|
+
end
|
38
|
+
f
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
include Scaruby::ConcurrentOps
|
46
|
+
|
data/lib/scaruby/io.rb
CHANGED
@@ -1,62 +1,62 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'net/http'
|
4
|
-
require 'uri'
|
5
|
-
|
6
|
-
module Scaruby
|
7
|
-
module IO
|
8
|
-
class Source
|
9
|
-
|
10
|
-
attr :string_io
|
11
|
-
|
12
|
-
def initialize(string_io)
|
13
|
-
assert_type(string_io, StringIO)
|
14
|
-
@string_io = string_io
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.from_bytes(bytes, encoding='UTF-8')
|
18
|
-
content = bytes.to_a.pack('c*').force_encoding(encoding)
|
19
|
-
Source.new(StringIO.new(content))
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.from_file(file, encoding='UTF-8')
|
23
|
-
content = ''
|
24
|
-
File::open(file, "r:#{encoding}") do |file|
|
25
|
-
while line = file.gets
|
26
|
-
content += line
|
27
|
-
end
|
28
|
-
end
|
29
|
-
Source.new(StringIO.new(content))
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.from_url(url, encoding='UTF-8')
|
33
|
-
uri = URI.parse(url)
|
34
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
35
|
-
http.use_ssl = uri.is_a?(URI::HTTPS)
|
36
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
|
-
|
38
|
-
http.start {|http|
|
39
|
-
req = Net::HTTP::Get.new(uri.request_uri)
|
40
|
-
res = http.request(req)
|
41
|
-
Source.new(StringIO.new(res.body))
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_lines
|
46
|
-
Seq.new(@string_io.map {|line| line })
|
47
|
-
end
|
48
|
-
|
49
|
-
def to_seq
|
50
|
-
chars = []
|
51
|
-
while @string_io.eof? do
|
52
|
-
chars.push(@string_io.getc)
|
53
|
-
end
|
54
|
-
Seq.new(chars)
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
include Scaruby::IO
|
62
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Scaruby
|
7
|
+
module IO
|
8
|
+
class Source
|
9
|
+
|
10
|
+
attr :string_io
|
11
|
+
|
12
|
+
def initialize(string_io)
|
13
|
+
assert_type(string_io, StringIO)
|
14
|
+
@string_io = string_io
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_bytes(bytes, encoding='UTF-8')
|
18
|
+
content = bytes.to_a.pack('c*').force_encoding(encoding)
|
19
|
+
Source.new(StringIO.new(content))
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.from_file(file, encoding='UTF-8')
|
23
|
+
content = ''
|
24
|
+
File::open(file, "r:#{encoding}") do |file|
|
25
|
+
while line = file.gets
|
26
|
+
content += line
|
27
|
+
end
|
28
|
+
end
|
29
|
+
Source.new(StringIO.new(content))
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.from_url(url, encoding='UTF-8')
|
33
|
+
uri = URI.parse(url)
|
34
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
35
|
+
http.use_ssl = uri.is_a?(URI::HTTPS)
|
36
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
|
+
|
38
|
+
http.start { |http|
|
39
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
40
|
+
res = http.request(req)
|
41
|
+
Source.new(StringIO.new(res.body))
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_lines
|
46
|
+
Seq.new(@string_io.map { |line| line })
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_seq
|
50
|
+
chars = []
|
51
|
+
while @string_io.eof? do
|
52
|
+
chars.push(@string_io.getc)
|
53
|
+
end
|
54
|
+
Seq.new(chars)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
include Scaruby::IO
|
62
|
+
|
data/lib/scaruby/map.rb
CHANGED
@@ -1,141 +1,141 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
module Scaruby
|
4
|
-
class Map < Hash
|
5
|
-
|
6
|
-
attr :hash
|
7
|
-
|
8
|
-
def each(&block)
|
9
|
-
@hash.each do |k,v|
|
10
|
-
yield k, v
|
11
|
-
end
|
12
|
-
nil
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.empty
|
16
|
-
{}
|
17
|
-
end
|
18
|
-
|
19
|
-
def initialize(hash)
|
20
|
-
assert_type(hash, Hash)
|
21
|
-
@hash = hash
|
22
|
-
end
|
23
|
-
|
24
|
-
def to_hash
|
25
|
-
@hash
|
26
|
-
end
|
27
|
-
|
28
|
-
def to_a
|
29
|
-
@hash.to_a
|
30
|
-
end
|
31
|
-
|
32
|
-
def contains(key)
|
33
|
-
@hash.include?(key)
|
34
|
-
end
|
35
|
-
|
36
|
-
def count(&predicate)
|
37
|
-
@hash.count(&predicate)
|
38
|
-
end
|
39
|
-
|
40
|
-
def exists(&predicate)
|
41
|
-
@hash.any?(&predicate)
|
42
|
-
end
|
43
|
-
|
44
|
-
def filter(&predicate)
|
45
|
-
Map.new(@hash.reject {|k,v| !
|
46
|
-
end
|
47
|
-
|
48
|
-
def filter_keys(&predicate)
|
49
|
-
Map.new(@hash.reject {|k,v| !
|
50
|
-
end
|
51
|
-
|
52
|
-
def filter_not(&predicate)
|
53
|
-
Map.new(@hash.reject {|k,v| yield k, v })
|
54
|
-
end
|
55
|
-
|
56
|
-
def find(&predicate)
|
57
|
-
Option.new(@hash.find(&predicate))
|
58
|
-
end
|
59
|
-
|
60
|
-
def forall(&predicate)
|
61
|
-
@hash.all?(&predicate)
|
62
|
-
end
|
63
|
-
|
64
|
-
def foreach(&block)
|
65
|
-
@hash.each do |k,v|
|
66
|
-
yield k, v
|
67
|
-
end
|
68
|
-
nil
|
69
|
-
end
|
70
|
-
|
71
|
-
def get_or_else(key, default_value)
|
72
|
-
value = @hash[key]
|
73
|
-
value.nil? ? default_value : value
|
74
|
-
end
|
75
|
-
|
76
|
-
def is_empty
|
77
|
-
@hash.nil? || @hash.empty?
|
78
|
-
end
|
79
|
-
|
80
|
-
def key_set
|
81
|
-
@hash.keys
|
82
|
-
end
|
83
|
-
|
84
|
-
def lift
|
85
|
-
AppliableProc.new {|k| Option.new(@hash[k]) }
|
86
|
-
end
|
87
|
-
|
88
|
-
def map(&block)
|
89
|
-
#Map.new(Hash[*@hash.to_a.collect {|k,v| yield k, v }.flatten])
|
90
|
-
Map.new(Hash[*@hash.to_a.map {|k,v| yield k, v }.flatten])
|
91
|
-
end
|
92
|
-
|
93
|
-
def minus(*keys)
|
94
|
-
copied = @hash.dup
|
95
|
-
keys.each do |key|
|
96
|
-
copied.delete(key)
|
97
|
-
end
|
98
|
-
Map.new(copied)
|
99
|
-
end
|
100
|
-
|
101
|
-
def plus(elems)
|
102
|
-
copied = @hash.dup
|
103
|
-
elems.each do |elm|
|
104
|
-
k,v = elm[0], elm[1]
|
105
|
-
copied[k] = v
|
106
|
-
end
|
107
|
-
Map.new(copied)
|
108
|
-
end
|
109
|
-
|
110
|
-
def mk_string(*args)
|
111
|
-
case args.size
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
end
|
121
|
-
#start_part + @hash.to_a.collect {|k,v| k.to_s + '=>' + v.to_s }.join(sep) + end_part
|
122
|
-
start_part + @hash.to_a.map {|k,v| k.to_s + '=>' + v.to_s }.join(sep) + end_part
|
123
|
-
end
|
124
|
-
|
125
|
-
def non_empty
|
126
|
-
!
|
127
|
-
end
|
128
|
-
|
129
|
-
def updated(k, v)
|
130
|
-
copied = @hash.dup
|
131
|
-
copied[k] = v
|
132
|
-
Map.new(copied)
|
133
|
-
end
|
134
|
-
|
135
|
-
def unzip
|
136
|
-
Seq.new([@hash.keys
|
137
|
-
end
|
138
|
-
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Scaruby
|
4
|
+
class Map < Hash
|
5
|
+
|
6
|
+
attr :hash
|
7
|
+
|
8
|
+
def each(&block)
|
9
|
+
@hash.each do |k, v|
|
10
|
+
yield k, v
|
11
|
+
end
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.empty
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(hash)
|
20
|
+
assert_type(hash, Hash)
|
21
|
+
@hash = hash
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_hash
|
25
|
+
@hash
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_a
|
29
|
+
@hash.to_a
|
30
|
+
end
|
31
|
+
|
32
|
+
def contains(key)
|
33
|
+
@hash.include?(key)
|
34
|
+
end
|
35
|
+
|
36
|
+
def count(&predicate)
|
37
|
+
@hash.count(&predicate)
|
38
|
+
end
|
39
|
+
|
40
|
+
def exists(&predicate)
|
41
|
+
@hash.any?(&predicate)
|
42
|
+
end
|
43
|
+
|
44
|
+
def filter(&predicate)
|
45
|
+
Map.new(@hash.reject { |k, v| !yield k, v })
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter_keys(&predicate)
|
49
|
+
Map.new(@hash.reject { |k, v| !yield k })
|
50
|
+
end
|
51
|
+
|
52
|
+
def filter_not(&predicate)
|
53
|
+
Map.new(@hash.reject { |k, v| yield k, v })
|
54
|
+
end
|
55
|
+
|
56
|
+
def find(&predicate)
|
57
|
+
Option.new(@hash.find(&predicate))
|
58
|
+
end
|
59
|
+
|
60
|
+
def forall(&predicate)
|
61
|
+
@hash.all?(&predicate)
|
62
|
+
end
|
63
|
+
|
64
|
+
def foreach(&block)
|
65
|
+
@hash.each do |k, v|
|
66
|
+
yield k, v
|
67
|
+
end
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_or_else(key, default_value)
|
72
|
+
value = @hash[key]
|
73
|
+
value.nil? ? default_value : value
|
74
|
+
end
|
75
|
+
|
76
|
+
def is_empty
|
77
|
+
@hash.nil? || @hash.empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
def key_set
|
81
|
+
@hash.keys
|
82
|
+
end
|
83
|
+
|
84
|
+
def lift
|
85
|
+
AppliableProc.new { |k| Option.new(@hash[k]) }
|
86
|
+
end
|
87
|
+
|
88
|
+
def map(&block)
|
89
|
+
#Map.new(Hash[*@hash.to_a.collect {|k,v| yield k, v }.flatten])
|
90
|
+
Map.new(Hash[*@hash.to_a.map { |k, v| yield k, v }.flatten])
|
91
|
+
end
|
92
|
+
|
93
|
+
def minus(*keys)
|
94
|
+
copied = @hash.dup
|
95
|
+
keys.each do |key|
|
96
|
+
copied.delete(key)
|
97
|
+
end
|
98
|
+
Map.new(copied)
|
99
|
+
end
|
100
|
+
|
101
|
+
def plus(elems)
|
102
|
+
copied = @hash.dup
|
103
|
+
elems.each do |elm|
|
104
|
+
k, v = elm[0], elm[1]
|
105
|
+
copied[k] = v
|
106
|
+
end
|
107
|
+
Map.new(copied)
|
108
|
+
end
|
109
|
+
|
110
|
+
def mk_string(*args)
|
111
|
+
case args.size
|
112
|
+
when 0
|
113
|
+
start_part, sep, end_part = '{', ', ', '}'
|
114
|
+
when 1
|
115
|
+
start_part, sep, end_part = '', args[0], ''
|
116
|
+
when 2
|
117
|
+
raise 'Illegal number of arguments (2)'
|
118
|
+
else
|
119
|
+
start_part, sep, end_part = args[0], args[1], args[2]
|
120
|
+
end
|
121
|
+
#start_part + @hash.to_a.collect {|k,v| k.to_s + '=>' + v.to_s }.join(sep) + end_part
|
122
|
+
start_part + @hash.to_a.map { |k, v| k.to_s + '=>' + v.to_s }.join(sep) + end_part
|
123
|
+
end
|
124
|
+
|
125
|
+
def non_empty
|
126
|
+
!is_empty
|
127
|
+
end
|
128
|
+
|
129
|
+
def updated(k, v)
|
130
|
+
copied = @hash.dup
|
131
|
+
copied[k] = v
|
132
|
+
Map.new(copied)
|
133
|
+
end
|
134
|
+
|
135
|
+
def unzip
|
136
|
+
Seq.new([@hash.keys, @hash.values])
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
data/lib/scaruby/option.rb
CHANGED
@@ -1,38 +1,46 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
module Scaruby
|
4
|
-
class Option
|
5
|
-
|
6
|
-
attr :value
|
7
|
-
|
8
|
-
def self.apply(value)
|
9
|
-
Option.new(value)
|
10
|
-
end
|
11
|
-
|
12
|
-
def initialize(value)
|
13
|
-
@value = value
|
14
|
-
end
|
15
|
-
|
16
|
-
def
|
17
|
-
@value
|
18
|
-
end
|
19
|
-
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def
|
33
|
-
is_defined ?
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Scaruby
|
4
|
+
class Option
|
5
|
+
|
6
|
+
attr :value
|
7
|
+
|
8
|
+
def self.apply(value)
|
9
|
+
Option.new(value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(value)
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_empty
|
17
|
+
@value == nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def is_defined
|
21
|
+
@value != nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def get
|
25
|
+
if is_defined
|
26
|
+
@value
|
27
|
+
else
|
28
|
+
raise NoSuchElementException
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_or_else(default_value)
|
33
|
+
is_defined ? get : default_value
|
34
|
+
end
|
35
|
+
|
36
|
+
def map(&block)
|
37
|
+
is_defined ? Option.new(yield @value) : self
|
38
|
+
end
|
39
|
+
|
40
|
+
def fold(if_empty, &block)
|
41
|
+
is_empty ? if_empty : yield(@value)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|