iolite 0.0.3 → 2.0.0
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.
- checksums.yaml +5 -5
- metadata +17 -122
- data/.gitignore +0 -24
- data/.rspec +0 -2
- data/.travis.yml +0 -5
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -22
- data/README.md +0 -88
- data/Rakefile +0 -7
- data/docs/iolite.md +0 -314
- data/docs/release_note.md +0 -15
- data/example/array.rb +0 -17
- data/example/compare_lambda_driver.rb +0 -78
- data/example/fizzbuzz.rb +0 -15
- data/example/hash.rb +0 -14
- data/example/lazy_list.rb +0 -14
- data/example/minimal_implement.rb +0 -42
- data/example/simple.rb +0 -46
- data/example/to_lazy.rb +0 -37
- data/iolite.gemspec +0 -24
- data/lib/iolite/adaptor/all.rb +0 -22
- data/lib/iolite/adaptor/apply.rb +0 -10
- data/lib/iolite/adaptor/bind.rb +0 -9
- data/lib/iolite/adaptor/callable.rb +0 -7
- data/lib/iolite/adaptor/define_send_original_methods.rb +0 -12
- data/lib/iolite/adaptor/method_missing.rb +0 -10
- data/lib/iolite/adaptor/operators.rb +0 -26
- data/lib/iolite/adaptor/send.rb +0 -11
- data/lib/iolite/adaptor/to_lazy.rb +0 -11
- data/lib/iolite/adaptor/to_proc.rb +0 -10
- data/lib/iolite/adaptor.rb +0 -2
- data/lib/iolite/adaptored/array.rb +0 -12
- data/lib/iolite/adaptored/hash.rb +0 -14
- data/lib/iolite/adaptored/iolite_lazy_with_hash.rb +0 -7
- data/lib/iolite/adaptored/object_with_to_lazy.rb +0 -5
- data/lib/iolite/adaptored/proc.rb +0 -5
- data/lib/iolite/adaptored/proc_with_callable.rb +0 -5
- data/lib/iolite/adaptored/string.rb +0 -21
- data/lib/iolite/functinal/bind.rb +0 -12
- data/lib/iolite/functinal/define_iolite_functinal_send_method.rb +0 -9
- data/lib/iolite/functinal/invoke.rb +0 -11
- data/lib/iolite/functinal/send.rb +0 -13
- data/lib/iolite/functinal.rb +0 -4
- data/lib/iolite/lazy.rb +0 -40
- data/lib/iolite/placeholders.rb +0 -30
- data/lib/iolite/refinements/array.rb +0 -16
- data/lib/iolite/refinements/hash.rb +0 -18
- data/lib/iolite/refinements/object_with_to_lazy.rb +0 -9
- data/lib/iolite/refinements/proc.rb +0 -9
- data/lib/iolite/refinements/string.rb +0 -26
- data/lib/iolite/refinements.rb +0 -6
- data/lib/iolite/statement/if.rb +0 -50
- data/lib/iolite/statement/if_else.rb +0 -12
- data/lib/iolite/statement.rb +0 -3
- data/lib/iolite/version.rb +0 -3
- data/lib/iolite.rb +0 -14
- data/spec/iolite_adaptored_spec.rb +0 -105
- data/spec/iolite_functinal_spec.rb +0 -87
- data/spec/iolite_lazy_spec.rb +0 -92
- data/spec/iolite_spec.rb +0 -212
- data/spec/spec_helper.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 33829f18505a25740faa99db57689ce53a1b8bd65b50c2313f3fb0de982d5679
|
4
|
+
data.tar.gz: 03d1ce2de1ad1bc86222146e1654b5e8e1508ffc0290de9cd623279ab55c4c00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f9f475ea7b8dbcd0a402c9f155ba77f275eff212ca507d3d66f00da1de21d5cf903ba85b40fc757d6cdb79bbc9db3c3cd3ea6da07e2a0c8087ea125ca173c7e
|
7
|
+
data.tar.gz: 0e9cc5ccaff33b09efd338e44922f8d4a7aa57cb6202998350b628da43baac43f1d34ca46c7653e6a9c4a51a8929ffd200b1a745560f82e258fd046a73953165
|
metadata
CHANGED
@@ -1,128 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iolite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- manga_osyo
|
8
|
-
autorequire:
|
9
|
-
bindir:
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.6'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.6'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
11
|
+
date: 2022-01-29 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
55
13
|
description: unblockable library
|
56
14
|
email:
|
57
15
|
- manga.osyo@gmail.com
|
58
16
|
executables: []
|
59
17
|
extensions: []
|
60
18
|
extra_rdoc_files: []
|
61
|
-
files:
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
- docs/iolite.md
|
70
|
-
- docs/release_note.md
|
71
|
-
- example/array.rb
|
72
|
-
- example/compare_lambda_driver.rb
|
73
|
-
- example/fizzbuzz.rb
|
74
|
-
- example/hash.rb
|
75
|
-
- example/lazy_list.rb
|
76
|
-
- example/minimal_implement.rb
|
77
|
-
- example/simple.rb
|
78
|
-
- example/to_lazy.rb
|
79
|
-
- iolite.gemspec
|
80
|
-
- lib/iolite.rb
|
81
|
-
- lib/iolite/adaptor.rb
|
82
|
-
- lib/iolite/adaptor/all.rb
|
83
|
-
- lib/iolite/adaptor/apply.rb
|
84
|
-
- lib/iolite/adaptor/bind.rb
|
85
|
-
- lib/iolite/adaptor/callable.rb
|
86
|
-
- lib/iolite/adaptor/define_send_original_methods.rb
|
87
|
-
- lib/iolite/adaptor/method_missing.rb
|
88
|
-
- lib/iolite/adaptor/operators.rb
|
89
|
-
- lib/iolite/adaptor/send.rb
|
90
|
-
- lib/iolite/adaptor/to_lazy.rb
|
91
|
-
- lib/iolite/adaptor/to_proc.rb
|
92
|
-
- lib/iolite/adaptored/array.rb
|
93
|
-
- lib/iolite/adaptored/hash.rb
|
94
|
-
- lib/iolite/adaptored/iolite_lazy_with_hash.rb
|
95
|
-
- lib/iolite/adaptored/object_with_to_lazy.rb
|
96
|
-
- lib/iolite/adaptored/proc.rb
|
97
|
-
- lib/iolite/adaptored/proc_with_callable.rb
|
98
|
-
- lib/iolite/adaptored/string.rb
|
99
|
-
- lib/iolite/functinal.rb
|
100
|
-
- lib/iolite/functinal/bind.rb
|
101
|
-
- lib/iolite/functinal/define_iolite_functinal_send_method.rb
|
102
|
-
- lib/iolite/functinal/invoke.rb
|
103
|
-
- lib/iolite/functinal/send.rb
|
104
|
-
- lib/iolite/lazy.rb
|
105
|
-
- lib/iolite/placeholders.rb
|
106
|
-
- lib/iolite/refinements.rb
|
107
|
-
- lib/iolite/refinements/array.rb
|
108
|
-
- lib/iolite/refinements/hash.rb
|
109
|
-
- lib/iolite/refinements/object_with_to_lazy.rb
|
110
|
-
- lib/iolite/refinements/proc.rb
|
111
|
-
- lib/iolite/refinements/string.rb
|
112
|
-
- lib/iolite/statement.rb
|
113
|
-
- lib/iolite/statement/if.rb
|
114
|
-
- lib/iolite/statement/if_else.rb
|
115
|
-
- lib/iolite/version.rb
|
116
|
-
- spec/iolite_adaptored_spec.rb
|
117
|
-
- spec/iolite_functinal_spec.rb
|
118
|
-
- spec/iolite_lazy_spec.rb
|
119
|
-
- spec/iolite_spec.rb
|
120
|
-
- spec/spec_helper.rb
|
121
|
-
homepage: ''
|
122
|
-
licenses:
|
123
|
-
- MIT
|
124
|
-
metadata: {}
|
125
|
-
post_install_message:
|
19
|
+
files: []
|
20
|
+
homepage: https://github.com/osyo-manga/gem-iolite
|
21
|
+
licenses: []
|
22
|
+
metadata:
|
23
|
+
homepage_uri: https://github.com/osyo-manga/gem-iolite
|
24
|
+
source_code_uri: https://github.com/osyo-manga/gem-iolite
|
25
|
+
changelog_uri: https://github.com/osyo-manga/gem-iolite
|
26
|
+
post_install_message:
|
126
27
|
rdoc_options: []
|
127
28
|
require_paths:
|
128
29
|
- lib
|
@@ -130,21 +31,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
31
|
requirements:
|
131
32
|
- - ">="
|
132
33
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
34
|
+
version: 2.6.0
|
134
35
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
36
|
requirements:
|
136
37
|
- - ">="
|
137
38
|
- !ruby/object:Gem::Version
|
138
39
|
version: '0'
|
139
40
|
requirements: []
|
140
|
-
|
141
|
-
|
142
|
-
signing_key:
|
41
|
+
rubygems_version: 3.3.3
|
42
|
+
signing_key:
|
143
43
|
specification_version: 4
|
144
44
|
summary: unblockable library
|
145
|
-
test_files:
|
146
|
-
- spec/iolite_adaptored_spec.rb
|
147
|
-
- spec/iolite_functinal_spec.rb
|
148
|
-
- spec/iolite_lazy_spec.rb
|
149
|
-
- spec/iolite_spec.rb
|
150
|
-
- spec/spec_helper.rb
|
45
|
+
test_files: []
|
data/.gitignore
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
*.bundle
|
19
|
-
*.so
|
20
|
-
*.o
|
21
|
-
*.a
|
22
|
-
mkmf.log
|
23
|
-
test
|
24
|
-
_lib
|
data/.rspec
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2015 manga_osyo
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
[](https://travis-ci.org/osyo-manga/gem-iolite)
|
2
|
-
|
3
|
-
# Iolite
|
4
|
-
|
5
|
-
Lazy block library.
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
|
-
gem 'iolite'
|
12
|
-
|
13
|
-
And then execute:
|
14
|
-
|
15
|
-
$ bundle
|
16
|
-
|
17
|
-
Or install it yourself as:
|
18
|
-
|
19
|
-
$ gem install iolite
|
20
|
-
|
21
|
-
## Usage
|
22
|
-
|
23
|
-
|
24
|
-
```ruby
|
25
|
-
require "iolite"
|
26
|
-
|
27
|
-
|
28
|
-
#######################################
|
29
|
-
# Using block
|
30
|
-
#######################################
|
31
|
-
|
32
|
-
p (1..5).map { |it| it + 3 }
|
33
|
-
# => [4, 5, 6, 7, 8]
|
34
|
-
|
35
|
-
p (1..5).inject { |memo, item| memo + item }
|
36
|
-
# => 15
|
37
|
-
|
38
|
-
p ["homu", "mami", "an"].inject(0) { |memo, item| memo + item.length }
|
39
|
-
# => 10
|
40
|
-
|
41
|
-
p [{name: :homu}, {name: :mami}].map { |it| it[:name] }
|
42
|
-
# => [:homu, :mami]
|
43
|
-
|
44
|
-
|
45
|
-
#######################################
|
46
|
-
# Using iolite
|
47
|
-
#######################################
|
48
|
-
|
49
|
-
# using arg1, arg2...
|
50
|
-
include Iolite::Placeholders
|
51
|
-
|
52
|
-
p (1..5).map &arg1 + 3
|
53
|
-
# => [4, 5, 6, 7, 8]
|
54
|
-
|
55
|
-
p (1..5).inject &arg1 + arg2
|
56
|
-
# => 15
|
57
|
-
|
58
|
-
p ["homu", "mami", "an"].inject 0, &arg1 + arg2.length
|
59
|
-
# => 10
|
60
|
-
|
61
|
-
p [{name: :homu}, {name: :mami}].map &arg1[:name]
|
62
|
-
# => [:homu, :mami]
|
63
|
-
```
|
64
|
-
|
65
|
-
## Contributing
|
66
|
-
|
67
|
-
1. Fork it ( https://github.com/osyo-manga/gem-iolite )
|
68
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
69
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
71
|
-
5. Create a new Pull Request
|
72
|
-
|
73
|
-
## Release note
|
74
|
-
|
75
|
-
### v0.0.3
|
76
|
-
|
77
|
-
* Fix dcs typo.
|
78
|
-
|
79
|
-
### v0.0.2
|
80
|
-
|
81
|
-
* Fix Iolite::Statement module method.
|
82
|
-
* Add `iolite/adaptored/proc_with_callable`.
|
83
|
-
|
84
|
-
### v0.0.1
|
85
|
-
|
86
|
-
* Release
|
87
|
-
|
88
|
-
|
data/Rakefile
DELETED
data/docs/iolite.md
DELETED
@@ -1,314 +0,0 @@
|
|
1
|
-
# iolite
|
2
|
-
|
3
|
-
## これは何?
|
4
|
-
|
5
|
-
式を遅延評価するためのライブラリです。
|
6
|
-
ブロックで行う処理を抽象化し、コードを簡略化することを目的としています。
|
7
|
-
ちなみにライブラリ名である iolite(アイオライト)は菫青石から取っています。
|
8
|
-
|
9
|
-
## イントロダクション
|
10
|
-
|
11
|
-
さて、Ruby ではブロック付きメソッド呼び出しを行うことが多いです。
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
["homu", "mami", "mado"].map { |it| it.capitalize }
|
15
|
-
# => ["Homu", "Mami", "Mado"]
|
16
|
-
```
|
17
|
-
|
18
|
-
しかし、上記のようにブロックを使用すると it を2回書く必要が出てきてちょっと手間ですね。
|
19
|
-
これは 以下のように Symbol#to_proc を利用するように書き換える事が可能です。
|
20
|
-
|
21
|
-
```ruby
|
22
|
-
["homu", "mami", "mado"].map &:capitalize
|
23
|
-
# => ["Homu", "Mami", "Mado"]
|
24
|
-
```
|
25
|
-
|
26
|
-
これでブロックを記述することなく map を使用する事ができました。
|
27
|
-
では、次のようなコードはどうでしょうか。
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
["homu", "mami", "mado"].select{ |it| it =~ /^m/ }
|
31
|
-
# => ["mami", "mado"]
|
32
|
-
|
33
|
-
[{ name: "homu" }, { name: "mami" }, { name: "mado" }].map { |it| it[:name] }
|
34
|
-
# => ["homu", "mami", "mado"]
|
35
|
-
```
|
36
|
-
|
37
|
-
上記のように呼び出したいメソッドに対して引数を渡したい場合はどうしてもブロックで記述する必要が出てきます。
|
38
|
-
このような場合に iolite を使用することですっきりとした記述をすることができます。
|
39
|
-
|
40
|
-
```ruby
|
41
|
-
# iolite を使って書いてみる
|
42
|
-
# arg1 は第一引数に置き換わり評価される
|
43
|
-
["homu", "mami", "mado"].select &arg1 =~ /^m/
|
44
|
-
# => ["mami", "mado"]
|
45
|
-
|
46
|
-
[{ name: "homu" }, { name: "mami" }, { name: "mado" }].map &arg1[:name]
|
47
|
-
# => ["homu", "mami", "mado"]
|
48
|
-
```
|
49
|
-
|
50
|
-
## 導入
|
51
|
-
|
52
|
-
#### install
|
53
|
-
|
54
|
-
```shell
|
55
|
-
$ gem install iolite
|
56
|
-
```
|
57
|
-
|
58
|
-
#### require
|
59
|
-
|
60
|
-
```ruby
|
61
|
-
require "iolite"
|
62
|
-
```
|
63
|
-
|
64
|
-
## 簡単な使い方
|
65
|
-
|
66
|
-
iolite ではプレースホルダを使用して、式から遅延評価を行うオブジェクトを定義します。
|
67
|
-
プレースホルダは arg1, arg2, ...argN と定義されており、それぞれの引数番目の値に置き換わり評価されます。
|
68
|
-
|
69
|
-
```ruby
|
70
|
-
# プレースホルダは module Iolite::Placeholders で定義されている
|
71
|
-
include Iolite::Placeholders
|
72
|
-
|
73
|
-
# arg1 は第一引数を返す
|
74
|
-
arg1.call(1, 2)
|
75
|
-
# => 1
|
76
|
-
|
77
|
-
# arg1 は第二引数を返す
|
78
|
-
arg2.call(1, 2)
|
79
|
-
# => 2
|
80
|
-
```
|
81
|
-
|
82
|
-
このプレースホルダからメソッドを呼び出すと、そのメソッドを遅延評価するオブジェクトを返します。
|
83
|
-
|
84
|
-
```ruby
|
85
|
-
# 第一引数に対して #capitalize メソッドを呼び出すオブジェクトを返す
|
86
|
-
capitalize_ = arg1.capitalize
|
87
|
-
|
88
|
-
capitalize_.call("homu")
|
89
|
-
# => "Homu"
|
90
|
-
capitalize_.call("an")
|
91
|
-
# => "An"
|
92
|
-
|
93
|
-
# メソッドの引数に対してプレースホルダを渡すこともできる
|
94
|
-
plus = arg1 + arg2
|
95
|
-
# plus = arg1.+(arg2)
|
96
|
-
|
97
|
-
plus.call(1, 2)
|
98
|
-
# => 3
|
99
|
-
```
|
100
|
-
|
101
|
-
次のようにメソッドチェーンやネストしてプレースホルダを使用することもできます。
|
102
|
-
|
103
|
-
```ruby
|
104
|
-
# 連続してメソッドを呼び出すこともできる
|
105
|
-
length_ = arg1.to_s(4).length
|
106
|
-
length_.call(:homu)
|
107
|
-
# => 4
|
108
|
-
length_.call(42)
|
109
|
-
# => 2
|
110
|
-
|
111
|
-
# ネストして呼び出すことも可能
|
112
|
-
f = arg1[arg2].length + arg1[arg3]
|
113
|
-
f.call({ :name => "homu", :age => 13 }, :name, :age)
|
114
|
-
# => 17
|
115
|
-
```
|
116
|
-
|
117
|
-
|
118
|
-
### ブロックに渡す
|
119
|
-
|
120
|
-
& をつけることでブロックに渡すことができます。
|
121
|
-
|
122
|
-
```ruby
|
123
|
-
["homu", "mami", "mado"].select &arg1 =~ /^m/
|
124
|
-
# => ["mami", "mado"]
|
125
|
-
[:homu, :mami, :mado].inject 0, &arg1 + arg2.to_s.length
|
126
|
-
# => 12
|
127
|
-
```
|
128
|
-
|
129
|
-
|
130
|
-
## Iolite::Lazy < BasicObject (class)
|
131
|
-
|
132
|
-
Iolite::Lazy は遅延評価を行うためのオブジェクトです。
|
133
|
-
プレースホルダなどはこのオブジェクトのラッパになります。
|
134
|
-
|
135
|
-
```ruby
|
136
|
-
f = Iolite::Lazy.new { |a, b| a + b }
|
137
|
-
p f.call(1, 2)
|
138
|
-
# => 10
|
139
|
-
```
|
140
|
-
|
141
|
-
これは次のようにメソッド呼び出しを遅延評価する事ができます。
|
142
|
-
|
143
|
-
```ruby
|
144
|
-
twice = Iolite::Lazy.new { |a| a + a }
|
145
|
-
twice.call(2)
|
146
|
-
# => 4
|
147
|
-
|
148
|
-
# 演算子を遅延評価
|
149
|
-
twice_plus3 = (twice + 3)
|
150
|
-
twice_plus3.call(1) # to twice.call(1) + 3
|
151
|
-
# => 5
|
152
|
-
|
153
|
-
# メソッド呼び出しを遅延評価
|
154
|
-
upcase_ = twice.upcase
|
155
|
-
upcase_.call("homu") # to twice.call("homu").upcase
|
156
|
-
# => "HOMUHOMU"
|
157
|
-
```
|
158
|
-
|
159
|
-
また、このクラスは BasicObject を継承していることに注意してください。
|
160
|
-
|
161
|
-
#### Iolite::Lazy#initialize &block
|
162
|
-
|
163
|
-
遅延評価を行うブロックを渡してオブジェクトを作成します。
|
164
|
-
このブロックは `#call` の呼び出し時に評価されます。
|
165
|
-
|
166
|
-
#### Iolite::Lazy#call(*args)
|
167
|
-
|
168
|
-
初期化時に渡したブロックを評価します。
|
169
|
-
|
170
|
-
|
171
|
-
#### Iolite::Lazy#send(name, *args)
|
172
|
-
|
173
|
-
name という名前のメソッドを遅延評価します。
|
174
|
-
遅延評価した結果に対して `#send(name, *args)` を呼び出す Iolite::Lazy を返します。
|
175
|
-
|
176
|
-
```ruby
|
177
|
-
it = Iolite::Lazy.new { |it| it }
|
178
|
-
it.send(:length).call("homu") # to { |it| it }.call("homu").length
|
179
|
-
```
|
180
|
-
|
181
|
-
#### Iolite::Lazy#method_missing(name, *args)
|
182
|
-
|
183
|
-
`Iolite::Lazy#send(name, *args)` を返します。
|
184
|
-
Iolite::Lazy で定義されていないメソッドであれば `#send` を使用することなくメソッドを遅延評価することができます。
|
185
|
-
|
186
|
-
#### Iolite::Lazy#to_proc
|
187
|
-
|
188
|
-
`#call` を呼び出す Proc を返します。
|
189
|
-
これにより & を着けてブロックに渡すことができます。
|
190
|
-
|
191
|
-
```ruby
|
192
|
-
it = Iolite::Lazy.new { |it| it }
|
193
|
-
["homu", "mami", "mado"].map &it.capitalize
|
194
|
-
# => ["Homu", "Mami", "Mado"]
|
195
|
-
|
196
|
-
["homu", "mami", "mado"].select &it =~ /^m/
|
197
|
-
# => ["mami", "mado"]
|
198
|
-
```
|
199
|
-
|
200
|
-
|
201
|
-
## プレースホルダ
|
202
|
-
|
203
|
-
プレースホルダは任意の引数値に対して遅延評価を行うために使用します。
|
204
|
-
プレースホルダは arg1 〜 arg10 まで定義されており、argN 番目の引数に対応します。
|
205
|
-
これは module Iolite::Placeholders で定義されています。
|
206
|
-
|
207
|
-
```ruby
|
208
|
-
include Iolite::Placeholders
|
209
|
-
|
210
|
-
arg1.call(1, 2)
|
211
|
-
# => 1
|
212
|
-
|
213
|
-
arg2.call(1, 2)
|
214
|
-
# => 1
|
215
|
-
```
|
216
|
-
|
217
|
-
このプレースホルダは Iolite::Lazy オブジェクトなので Iolite::Lazy と同様に遅延評価を行うことができます。
|
218
|
-
|
219
|
-
|
220
|
-
```ruby
|
221
|
-
include Iolite::Placeholders
|
222
|
-
|
223
|
-
(arg1 + arg2).call(1, 2)
|
224
|
-
# => 3
|
225
|
-
|
226
|
-
arg1.to_s.length.call(:homu)
|
227
|
-
# => 4
|
228
|
-
|
229
|
-
["homu", "mami", "mado"].select(&arg1 =~ /^m/).map &arg1.capitalize
|
230
|
-
# => ["Mami", "Mado"]
|
231
|
-
|
232
|
-
(1..5).map &arg1.to_s(2)
|
233
|
-
# => ["1", "10", "11", "100", "101"]
|
234
|
-
|
235
|
-
[:homu, :mami, :an].select &arg1.to_s.length > 3
|
236
|
-
# => [:homu, :mami]
|
237
|
-
```
|
238
|
-
|
239
|
-
## Proc と併用して使用する
|
240
|
-
|
241
|
-
定義した式の中で `Iolite::Lazy` やプレースホルダ使用すると評価時に `Iolite::Lazy` オブジェクトが遅延評価されます。
|
242
|
-
しかし、Proc などを渡した場合には `Iolite::Lazy` のように評価時に処理は行われません。
|
243
|
-
|
244
|
-
```ruby
|
245
|
-
a = Iolite::Lazy.new { |it| it }
|
246
|
-
b = Proc.new { |it| it + it }
|
247
|
-
|
248
|
-
# Proc は遅延評価されないので 3 + Proc が行われようとしてエラーになる
|
249
|
-
p (a + b).call(3)
|
250
|
-
# => error: `+': Proc can't be coerced into Fixnum (TypeError)
|
251
|
-
```
|
252
|
-
|
253
|
-
これは、意図しない副作用を抑えるためにデフォルトでは Proc は遅延評価を行わないようにしているからです。
|
254
|
-
Proc も同様に評価して欲しい場合は以下の `require` を追加してモンキーパッチを適用してください。
|
255
|
-
|
256
|
-
```ruby
|
257
|
-
# モンキーパッチを適用させるための require
|
258
|
-
require "iolite/adaptored/proc_with_callable"
|
259
|
-
|
260
|
-
a = Iolite::Lazy.new { |it| it }
|
261
|
-
b = Proc.new { |it| it + it }
|
262
|
-
|
263
|
-
# Proc が遅延評価されるようになるので
|
264
|
-
# a.call(3) + b.call(3)
|
265
|
-
# と評価される
|
266
|
-
(a + b).call(3)
|
267
|
-
# => 9
|
268
|
-
|
269
|
-
# こんな使い方とか
|
270
|
-
p (arg1 + :to_s.to_proc.call(arg2)).call("homu", 42)
|
271
|
-
# => "homu42"
|
272
|
-
```
|
273
|
-
|
274
|
-
## Object#to_lazy
|
275
|
-
|
276
|
-
`Object#to_lazy` は自身を遅延評価するオブジェクト(Iolite::Lazy オブジェクト)として返すメソッドです。
|
277
|
-
`Object#to_lazy` を使用したい場合は refinements が使える環境であれば、
|
278
|
-
|
279
|
-
```ruby
|
280
|
-
using Iolite::Refinements::ObjectWithToLazy
|
281
|
-
```
|
282
|
-
|
283
|
-
refinements が使えない、もしくは直接 Object を拡張したい場合は
|
284
|
-
|
285
|
-
```ruby
|
286
|
-
require "iolite/adaptored/object_with_to_lazy"
|
287
|
-
```
|
288
|
-
|
289
|
-
することで利用することができます。
|
290
|
-
|
291
|
-
|
292
|
-
#### Example
|
293
|
-
|
294
|
-
```ruby
|
295
|
-
# (1..Float::INFINITY) を遅延評価する
|
296
|
-
lazy_list = (1..Float::INFINITY).to_lazy
|
297
|
-
twice_list = lazy_list.first(arg1).map(&arg1 * 2)
|
298
|
-
|
299
|
-
p twice_list.call(5)
|
300
|
-
# => [2, 4, 6, 8, 10]
|
301
|
-
p twice_list.call(10)
|
302
|
-
# => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
|
303
|
-
|
304
|
-
["homu", "mami", "mado"].each &to_lazy.printf("%s:%s, ", arg1, arg1)
|
305
|
-
# => homu:homu, mami:mami, mado:mado,
|
306
|
-
|
307
|
-
a = { :name => "mami", :age => 13 }
|
308
|
-
b = { :name => "mami" }
|
309
|
-
a.reject &arg2 == b.to_lazy[arg1]
|
310
|
-
# => { :age => 13 }
|
311
|
-
```
|
312
|
-
|
313
|
-
|
314
|
-
|
data/docs/release_note.md
DELETED
data/example/array.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require "iolite"
|
2
|
-
|
3
|
-
# Use require
|
4
|
-
# define Array#to_proc
|
5
|
-
require "iolite/adaptored/array"
|
6
|
-
|
7
|
-
include Iolite::Placeholders
|
8
|
-
|
9
|
-
p [1, arg1, 2, arg1 + arg2].to_proc.call(1, 2)
|
10
|
-
# => [1, 1, 2, 3]
|
11
|
-
|
12
|
-
p [1, 2, 3].map &[arg1, arg1 ,arg1]
|
13
|
-
# => [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
|
14
|
-
|
15
|
-
p [1, 2, 3].map &((1..3).map &arg1.to_l + 3)
|
16
|
-
# => [[4, 4, 4], [5, 5, 5], [6, 6, 6]]
|
17
|
-
|