kirinnee_core 0.1.0 → 0.2.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 +4 -4
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +38 -15
- data/.idea/encodings.xml +3 -3
- data/.idea/kirinnee_core.iml +54 -54
- data/.idea/misc.xml +6 -6
- data/.idea/modules.xml +7 -7
- data/.idea/runConfigurations/Unit_Test.xml +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +342 -7
- data/lib/kirinnee_core/enumerable.rb +161 -0
- data/lib/kirinnee_core/string.rb +282 -0
- data/lib/kirinnee_core/version.rb +1 -1
- data/lib/kirinnee_core.rb +2 -5
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7f4c87ce2cbfdebdb3300709a2be01ad032187ea1862fd1e57beebec6e03027c
|
|
4
|
+
data.tar.gz: ed9d0c8448169569302e264e485f98a311bfdf4afc8f918de879797f9c0d26b9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 29f6adf809bb257e53bc881d9a63025e3c9a1252ba48d86a8202aa9e1b3451140f445e7142062afece38d79843918f42b3e60d659e16f71f93c8911443d32b69
|
|
7
|
+
data.tar.gz: a8c29f487565169043cf78b066b6a57100dcabf19f39b252ba20c42b9e8e02e79555270d3d8e5f8753184593da1c22386374f526ba8d36eb043b57a86c8fcf2e
|
data/.gitignore
CHANGED
data/.gitlab-ci.yml
CHANGED
|
@@ -1,15 +1,38 @@
|
|
|
1
|
-
stages:
|
|
2
|
-
- test
|
|
3
|
-
- build
|
|
4
|
-
- publish
|
|
5
|
-
|
|
6
|
-
Unit Test:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
stages:
|
|
2
|
+
- test
|
|
3
|
+
- build
|
|
4
|
+
- publish
|
|
5
|
+
|
|
6
|
+
Unit Test:
|
|
7
|
+
tags:
|
|
8
|
+
- ruby
|
|
9
|
+
- kirinnee
|
|
10
|
+
stage: test
|
|
11
|
+
script:
|
|
12
|
+
- bundle install
|
|
13
|
+
- bundle exec rspec
|
|
14
|
+
Build:
|
|
15
|
+
tags:
|
|
16
|
+
- ruby
|
|
17
|
+
- kirinnee
|
|
18
|
+
stage: build
|
|
19
|
+
script: gem build $GEM_NAME
|
|
20
|
+
artifacts:
|
|
21
|
+
paths:
|
|
22
|
+
- ./*.gem
|
|
23
|
+
Publish:
|
|
24
|
+
tags:
|
|
25
|
+
- ruby
|
|
26
|
+
- kirinnee
|
|
27
|
+
stage: publish
|
|
28
|
+
script:
|
|
29
|
+
- mkdir ~/.gem
|
|
30
|
+
- "echo \":rubygems_api_key: $API_KEY\" > ~/.gem/credentials"
|
|
31
|
+
- chmod 0600 ~/.gem/credentials
|
|
32
|
+
- gem push $GEM_NAME-*.gem
|
|
33
|
+
after_script:
|
|
34
|
+
- shred -vfu ~/.gem/credentials
|
|
35
|
+
only:
|
|
36
|
+
- /v[0-9\.]*/
|
|
37
|
+
except:
|
|
38
|
+
- branches
|
data/.idea/encodings.xml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
|
4
4
|
</project>
|
data/.idea/kirinnee_core.iml
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="RUBY_MODULE" version="4">
|
|
3
|
-
<component name="ModuleRunConfigurationManager">
|
|
4
|
-
<shared>
|
|
5
|
-
<configuration default="false" name="Unit Test" type="RSpecRunConfigurationType" factoryName="RSpec">
|
|
6
|
-
<module name="kirinnee_core" />
|
|
7
|
-
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
|
8
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
|
9
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="" />
|
|
10
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
|
|
11
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
|
|
12
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
|
|
13
|
-
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
|
|
14
|
-
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
|
15
|
-
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" />
|
|
16
|
-
<EXTENSION ID="net.ashald.envfile">
|
|
17
|
-
<option name="IS_ENABLED" value="false" />
|
|
18
|
-
<option name="IS_SUBST" value="false" />
|
|
19
|
-
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
|
|
20
|
-
<option name="IS_IGNORE_MISSING_FILES" value="false" />
|
|
21
|
-
<ENTRIES>
|
|
22
|
-
<ENTRY IS_ENABLED="true" PARSER="runconfig" />
|
|
23
|
-
</ENTRIES>
|
|
24
|
-
</EXTENSION>
|
|
25
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
|
|
26
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
|
|
27
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
|
28
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="" />
|
|
29
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
|
|
30
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="ALL_IN_FOLDER" />
|
|
31
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
|
32
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
|
33
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
|
|
34
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
|
|
35
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
|
|
36
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
|
|
37
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="
|
|
38
|
-
<method v="2" />
|
|
39
|
-
</configuration>
|
|
40
|
-
</shared>
|
|
41
|
-
</component>
|
|
42
|
-
<component name="NewModuleRootManager">
|
|
43
|
-
<content url="file://$MODULE_DIR$" />
|
|
44
|
-
<orderEntry type="inheritedJdk" />
|
|
45
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
46
|
-
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.17.2, ruby-2.6.0-p0) [gem]" level="application" />
|
|
47
|
-
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, ruby-2.6.0-p0) [gem]" level="application" />
|
|
48
|
-
<orderEntry type="library" scope="PROVIDED" name="rake (v10.5.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
49
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
50
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
51
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.8.2, ruby-2.6.0-p0) [gem]" level="application" />
|
|
52
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
53
|
-
<orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
54
|
-
</component>
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
|
3
|
+
<component name="ModuleRunConfigurationManager">
|
|
4
|
+
<shared>
|
|
5
|
+
<configuration default="false" name="Unit Test" type="RSpecRunConfigurationType" factoryName="RSpec">
|
|
6
|
+
<module name="kirinnee_core" />
|
|
7
|
+
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
|
8
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
|
9
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="" />
|
|
10
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
|
|
11
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
|
|
12
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
|
|
13
|
+
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
|
|
14
|
+
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
|
15
|
+
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" />
|
|
16
|
+
<EXTENSION ID="net.ashald.envfile">
|
|
17
|
+
<option name="IS_ENABLED" value="false" />
|
|
18
|
+
<option name="IS_SUBST" value="false" />
|
|
19
|
+
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
|
|
20
|
+
<option name="IS_IGNORE_MISSING_FILES" value="false" />
|
|
21
|
+
<ENTRIES>
|
|
22
|
+
<ENTRY IS_ENABLED="true" PARSER="runconfig" />
|
|
23
|
+
</ENTRIES>
|
|
24
|
+
</EXTENSION>
|
|
25
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
|
|
26
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
|
|
27
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
|
28
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="" />
|
|
29
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
|
|
30
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="ALL_IN_FOLDER" />
|
|
31
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
|
32
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
|
33
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
|
|
34
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
|
|
35
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
|
|
36
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
|
|
37
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
|
38
|
+
<method v="2" />
|
|
39
|
+
</configuration>
|
|
40
|
+
</shared>
|
|
41
|
+
</component>
|
|
42
|
+
<component name="NewModuleRootManager">
|
|
43
|
+
<content url="file://$MODULE_DIR$" />
|
|
44
|
+
<orderEntry type="inheritedJdk" />
|
|
45
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
46
|
+
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.17.2, ruby-2.6.0-p0) [gem]" level="application" />
|
|
47
|
+
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, ruby-2.6.0-p0) [gem]" level="application" />
|
|
48
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v10.5.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
49
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
50
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
51
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.8.2, ruby-2.6.0-p0) [gem]" level="application" />
|
|
52
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
53
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.8.0, ruby-2.6.0-p0) [gem]" level="application" />
|
|
54
|
+
</component>
|
|
55
55
|
</module>
|
data/.idea/misc.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="JavaScriptSettings">
|
|
4
|
-
<option name="languageLevel" value="ES6" />
|
|
5
|
-
</component>
|
|
6
|
-
<component name="ProjectRootManager" version="2" project-jdk-name="ruby-2.6.0-p0" project-jdk-type="RUBY_SDK" />
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="JavaScriptSettings">
|
|
4
|
+
<option name="languageLevel" value="ES6" />
|
|
5
|
+
</component>
|
|
6
|
+
<component name="ProjectRootManager" version="2" project-jdk-name="ruby-2.6.0-p0" project-jdk-type="RUBY_SDK" />
|
|
7
7
|
</project>
|
data/.idea/modules.xml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="ProjectModuleManager">
|
|
4
|
-
<modules>
|
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/kirinnee_core.iml" filepath="$PROJECT_DIR$/.idea/kirinnee_core.iml" />
|
|
6
|
-
</modules>
|
|
7
|
-
</component>
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/kirinnee_core.iml" filepath="$PROJECT_DIR$/.idea/kirinnee_core.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
8
|
</project>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
|
|
32
32
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
|
|
33
33
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
|
|
34
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="
|
|
34
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
|
35
35
|
<method v="2" />
|
|
36
36
|
</configuration>
|
|
37
37
|
</component>
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kirinnee Core
|
|
2
2
|
|
|
3
|
-
Personal core library that monkey patches basic types such as string
|
|
4
|
-
|
|
3
|
+
Personal core library that monkey patches basic types such as string and enumerable with utility method.
|
|
4
|
+
How each method is used is list below.
|
|
5
5
|
|
|
6
6
|
## Installation
|
|
7
7
|
|
|
@@ -21,13 +21,348 @@ Or install it yourself as:
|
|
|
21
21
|
|
|
22
22
|
## Usage
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
### Enumerable
|
|
25
|
+
Here are the monkey patched methods for enumerable
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
##### where `predicate`
|
|
29
|
+
Filters based on predicate passed via block. Variant of `select`, `filter` and `find_all` in ruby.
|
|
30
|
+
|
|
31
|
+
Does not mutate original enumerable
|
|
32
|
+
```ruby
|
|
33
|
+
[1,2,3].where {|x| x%2!=0 } # => [1,3]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
##### where! `predicate`
|
|
37
|
+
Filters base on predicate passed via block.
|
|
38
|
+
Variant of `select`, `filter`, `find_all` method in ruby
|
|
39
|
+
|
|
40
|
+
Mutates the original enumerable
|
|
41
|
+
```ruby
|
|
42
|
+
[1,2,3].where! { |x| x%2!=0 } # => [1,3]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
##### skip `x`
|
|
46
|
+
Skips the first x elements of the enumerable
|
|
47
|
+
|
|
48
|
+
Does not mutate the original enumerable
|
|
49
|
+
```ruby
|
|
50
|
+
[1,2,3,4,5].skip 3 #=> [4,5]
|
|
51
|
+
{:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}.skip 3 #=> {:d=>4, :e=>5}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
##### skip_while `predicate`
|
|
55
|
+
Skips the elements of the enumerable while the predicate evaluates to true
|
|
56
|
+
|
|
57
|
+
Does not mutate the original enumerable
|
|
58
|
+
```ruby
|
|
59
|
+
[1,2,3,2,1,0].skip_while {|x| x < 3} # => [3,2,1,0]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
##### back `x`
|
|
63
|
+
Takes the last x element of the enumerable
|
|
64
|
+
|
|
65
|
+
Does not mutate the original enumerable
|
|
66
|
+
```ruby
|
|
67
|
+
[1,2,3,4,5,6].back 3 #=> [4,5,6]
|
|
68
|
+
[1,2,3,4,5,6].back 100 #=> [1,2,3,4,5,6]
|
|
69
|
+
[1,2,3,4,5,6].back 0 #=> []
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
##### back_while `predicate`
|
|
73
|
+
Takes the last x element while predicate evaluates to true
|
|
74
|
+
|
|
75
|
+
Does not mutate the original enumerable
|
|
76
|
+
```ruby
|
|
77
|
+
[1,2,3,2,1,0].back_while {|x| x <2} # => [1,0]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
##### omit `x`
|
|
81
|
+
Omits the last x element of the enumerable
|
|
82
|
+
|
|
83
|
+
Does not mutate the original enumerable
|
|
84
|
+
```ruby
|
|
85
|
+
[1,2,3,4,5].omit 2 # => [1,2,3]
|
|
86
|
+
[1,2,3,4,5].omit 100 #=> []
|
|
87
|
+
[1,2,3,4,5].omit 0 # => [1,2,3,4,5]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
##### omit_while `predicate`
|
|
91
|
+
Omits the last element while the predicate evaluates to true
|
|
92
|
+
|
|
93
|
+
Does not mutate the original enumerable
|
|
94
|
+
```ruby
|
|
95
|
+
[1,2,3,2,1,0].omit_while { |x| x <3} #=> [1,2,3]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
##### remove `search`
|
|
99
|
+
Removes all occurrences of the element within the enumerable
|
|
100
|
+
|
|
101
|
+
Does not mutate the original enumerable
|
|
102
|
+
```ruby
|
|
103
|
+
[1,2,3,1,2,3].remove 3 #=> [1,2,1,2]
|
|
104
|
+
%w(apple pear apple pear).remove "apple" #=> %w(pear pear)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
##### has? `search`
|
|
108
|
+
Whether the enumerable contains at least 1 element that matches the input
|
|
109
|
+
```ruby
|
|
110
|
+
[1,2,3,4,5,6,1].has? 1 # true
|
|
111
|
+
[1,2,3,4,5,6,1].has? 2 # true
|
|
112
|
+
[1,2,3,4,5,6,1].has? 7 # false
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
##### without `array`
|
|
116
|
+
Remove all occurrences of each element in provided array from target array
|
|
117
|
+
|
|
118
|
+
Does not mutate the original enumerable
|
|
119
|
+
```ruby
|
|
120
|
+
[1,2,3,4,1,2,3,4].without [2,4] #=> [1,3,1,3]
|
|
121
|
+
```
|
|
122
|
+
##### without_index `indexes`
|
|
123
|
+
Remove all occurrences of each element in provided array from target array
|
|
124
|
+
|
|
125
|
+
Does not mutate the original enumerable
|
|
126
|
+
```ruby
|
|
127
|
+
[1,2,3,4,1,2,3,4].without [2,4] #=> [1,3,1,3]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
##### indexes `predicate`
|
|
131
|
+
Gets the indexes that matches the predicate
|
|
132
|
+
|
|
133
|
+
Does not mutate the original enumerable
|
|
134
|
+
```ruby
|
|
135
|
+
[6,5,4,3,2].indexes {|x| x < 4} # => [3,4]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### String
|
|
139
|
+
Here are the monkey patched methods for Strings
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
##### replace_all `search`,`tareget`
|
|
143
|
+
Replaces the search string with the target string.
|
|
144
|
+
|
|
145
|
+
Does not mutate original string
|
|
146
|
+
```ruby
|
|
147
|
+
"a=>b=>c".replace_all("=>","-") # => "a-b-c"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
##### replace_all! `search`,`tareget`
|
|
151
|
+
Replaces the search string with the target string.
|
|
152
|
+
|
|
153
|
+
Mutates original string
|
|
154
|
+
```ruby
|
|
155
|
+
"a=>b=>c".replace_all!("=>","-") # => "a-b-c"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
##### take `x`
|
|
159
|
+
Takes the first x characters of the string
|
|
160
|
+
|
|
161
|
+
Does not mutate original string
|
|
162
|
+
```ruby
|
|
163
|
+
"Singapore".take 4 # => "Sing"
|
|
164
|
+
"Singapore".take 100 # => "Singapore"
|
|
165
|
+
"Singapore".take 0 # => ""
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
##### take! `x`
|
|
169
|
+
Takes the first x characters of the string
|
|
170
|
+
|
|
171
|
+
Mutates original string
|
|
172
|
+
```ruby
|
|
173
|
+
"Singapore".take! 4 # => "Sing"
|
|
174
|
+
"Singapore".take! 100 # => "Singapore"
|
|
175
|
+
"Singapore".take! 0 # => ""
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
##### skip `x`
|
|
179
|
+
Skips the first x characters of the string
|
|
180
|
+
|
|
181
|
+
Does not mutate the original string
|
|
182
|
+
```ruby
|
|
183
|
+
"Singapore".skip 5 # => "pore"
|
|
184
|
+
"Singapore".skip 100 # => ""
|
|
185
|
+
"Singapore".skip 0 # => "Singapore"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
##### skip! `x`
|
|
189
|
+
Skips the first x characters of the string
|
|
190
|
+
|
|
191
|
+
Mutate the original string
|
|
192
|
+
```ruby
|
|
193
|
+
"Singapore".skip! 5 # => "pore"
|
|
194
|
+
"Singapore".skip! 100 # => ""
|
|
195
|
+
"Singapore".skip! 0 # => "Singapore"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
##### omit `x`
|
|
199
|
+
Omits the last x characters of the string
|
|
200
|
+
|
|
201
|
+
Does not mutate the original string
|
|
202
|
+
```ruby
|
|
203
|
+
"Singapore".omit 5 # => "Sing"
|
|
204
|
+
"Singapore".omit 100 # => ""
|
|
205
|
+
"Singapore".omit 0 # => "Singapore"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
##### omit! `x`
|
|
209
|
+
Omits the last x characters of the string
|
|
210
|
+
|
|
211
|
+
Mutates the original string
|
|
212
|
+
```ruby
|
|
213
|
+
"Singapore".omit! 5 # => "Sing"
|
|
214
|
+
"Singapore".omit! 100 # => ""
|
|
215
|
+
"Singapore".omit! 0 # => "Singapore"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
##### back `x`
|
|
219
|
+
Takes the last x characters of the string
|
|
220
|
+
|
|
221
|
+
Does not mutate the original string
|
|
222
|
+
|
|
223
|
+
```ruby
|
|
224
|
+
"Singapore".back 4 #=> "pore"
|
|
225
|
+
"Singapore".back 100 # =>"Singapore"
|
|
226
|
+
"Singapore".back 0 # => ""
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
##### back! `x`
|
|
230
|
+
Takes the last x characters of the string
|
|
231
|
+
|
|
232
|
+
Mutates the original string
|
|
233
|
+
|
|
234
|
+
```ruby
|
|
235
|
+
"Singapore".back! 4 #=> "pore"
|
|
236
|
+
"Singapore".back! 100 # =>"Singapore"
|
|
237
|
+
"Singapore".back! 0 # => ""
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
##### remove_char_at `x`
|
|
241
|
+
Removes the character at the index.
|
|
242
|
+
Returns without removing characters if index or negative index
|
|
243
|
+
exceeds length of string
|
|
244
|
+
|
|
245
|
+
Does not mutate the original string
|
|
246
|
+
|
|
247
|
+
```ruby
|
|
248
|
+
"Hey! scent!".remove_char_at 0 # => "ey! scent!"
|
|
249
|
+
"Hey! scent!".remove_char_at 3 # => "Hey scent!"
|
|
250
|
+
"Hey! scent!".remove_char_at -1 # => "Hey! scent"
|
|
251
|
+
"Hey! scent!".remove_char_at -6 #=> "Hey! cent!"
|
|
252
|
+
"Hey! scent!".remove_char_at 100 # => "Hey! scent!"
|
|
253
|
+
"Hey! scent!".remove_char_at -100 # => "Hey! scent!"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
##### remove_char_at! `x`
|
|
257
|
+
Removes the character at the index.
|
|
258
|
+
Returns without removing characters if index or negative index
|
|
259
|
+
exceeds length of string
|
|
260
|
+
|
|
261
|
+
Does not mutate the original string
|
|
262
|
+
|
|
263
|
+
```ruby
|
|
264
|
+
"Hey! scent!".remove_char_at! 0 # => "ey! scent!"
|
|
265
|
+
"Hey! scent!".remove_char_at! 3 # => "Hey scent!"
|
|
266
|
+
"Hey! scent!".remove_char_at! -1 # => "Hey! scent"
|
|
267
|
+
"Hey! scent!".remove_char_at! -6 #=> "Hey! cent!"
|
|
268
|
+
"Hey! scent!".remove_char_at! 100 # => "Hey! scent!"
|
|
269
|
+
"Hey! scent!".remove_char_at! -100 # => "Hey! scent!"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
##### remove `search`
|
|
273
|
+
Removes all instance of the word
|
|
274
|
+
|
|
275
|
+
Does not mutate the original string
|
|
276
|
+
|
|
277
|
+
```ruby
|
|
278
|
+
"a=>b=>c".remove "=>" # => "abc"
|
|
279
|
+
"a,b,c".remove "," # => "abc"
|
|
280
|
+
"a,b,c".remove "a" # => ",b,c"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
##### remove! `search`
|
|
284
|
+
Removes all instance of the word
|
|
285
|
+
|
|
286
|
+
Mutates the original string
|
|
287
|
+
|
|
288
|
+
```ruby
|
|
289
|
+
"a=>b=>c".remove! "=>" # => "abc"
|
|
290
|
+
"a,b,c".remove! "," # => "abc"
|
|
291
|
+
"a,b,c".remove! "a" # => ",b,c"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
##### without `unwanted`
|
|
295
|
+
|
|
296
|
+
Remove any instance of the words in the array in order
|
|
297
|
+
|
|
298
|
+
Does not mutate the original string
|
|
299
|
+
```ruby
|
|
300
|
+
"A=>B->C".without ["=>","->"] # => "ABC"
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
##### without! `unwanted`
|
|
304
|
+
|
|
305
|
+
Remove any instance of the words in the array in order
|
|
306
|
+
|
|
307
|
+
Mutates the original string
|
|
308
|
+
```ruby
|
|
309
|
+
"A=>B->C".without ["=>","->"] # => "ABC"
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
##### repeat `x`
|
|
313
|
+
Repeats the string x number of times.
|
|
314
|
+
Input is absolute-d.
|
|
315
|
+
|
|
316
|
+
Does not mutates the original string
|
|
317
|
+
```ruby
|
|
318
|
+
"Hello ".repeat 3 # => "Hello Hello Hello "
|
|
319
|
+
"Hello ".repeat -3 # => "Hello Hello Hello "
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
##### repeat! `x`
|
|
324
|
+
Repeats the string x number of times.
|
|
325
|
+
Input is absolute-d.
|
|
326
|
+
|
|
327
|
+
Mutates the original string
|
|
328
|
+
```ruby
|
|
329
|
+
"Hello ".repeat! 3 # => "Hello Hello Hello "
|
|
330
|
+
"Hello ".repeat! -3 # => "Hello Hello Hello "
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
##### * `x`
|
|
334
|
+
Repeats the string x number of times.
|
|
335
|
+
Input is absolute-d.
|
|
336
|
+
|
|
337
|
+
Does not mutates the original string
|
|
338
|
+
```ruby
|
|
339
|
+
"Hello " * 3 # => "Hello Hello Hello "
|
|
340
|
+
"Hello" * -3 # => "Hello Hello Hello "
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
##### count_occurrences `search`
|
|
344
|
+
Counts the number of times a string appears
|
|
345
|
+
|
|
346
|
+
```ruby
|
|
347
|
+
"Hello".count_occurrences "l" # => 2
|
|
348
|
+
"one day one night".count_occurrences "one" # => 2
|
|
349
|
+
"one day one night".count_occurrences "day" # => 1
|
|
350
|
+
"one day one night".count_occurrences "morning" # => 0
|
|
351
|
+
"one day one night one".count_occurrences "one" # => 3
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
25
356
|
|
|
26
357
|
## Development
|
|
27
358
|
|
|
28
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
|
359
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
|
360
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
361
|
+
|
|
362
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
|
363
|
+
|
|
364
|
+
To release a new version, please wait for merge request to be accepted.
|
|
29
365
|
|
|
30
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
31
366
|
|
|
32
367
|
## Contributing
|
|
33
368
|
|
|
@@ -39,9 +374,9 @@ code of conduct.
|
|
|
39
374
|
|
|
40
375
|
## License
|
|
41
376
|
|
|
42
|
-
The gem is available as open source under the terms of the [MIT License](
|
|
377
|
+
The gem is available as open source under the terms of the [MIT License](LICENSE.txt).
|
|
43
378
|
|
|
44
379
|
## Code of Conduct
|
|
45
380
|
Everyone interacting in the KirinneeCore project’s codebases, issue trackers,
|
|
46
381
|
chat rooms and mailing lists is expected to follow the
|
|
47
|
-
[code of conduct](
|
|
382
|
+
[code of conduct](CODE_OF_CONDUCT.md).
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
module Enumerable
|
|
2
|
+
|
|
3
|
+
# Filters base on predicate passed via block.
|
|
4
|
+
# Variant of "select, filter, find all" method in vanilla ruby
|
|
5
|
+
# Does not modify the original array or enumerable
|
|
6
|
+
#
|
|
7
|
+
# [1,2,3].where { |x| x%2!=0 } # => [1,3]
|
|
8
|
+
#
|
|
9
|
+
# @param [Block] f predicate
|
|
10
|
+
# @return [Enumerable]
|
|
11
|
+
def where(&f)
|
|
12
|
+
select &f
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Filters base on predicate passed via block.
|
|
16
|
+
# Variant of "select, filter, find all" method in vanilla ruby
|
|
17
|
+
# Modifies the original array or enumerable
|
|
18
|
+
#
|
|
19
|
+
# [1,2,3].where! { |x| x%2!=0 } # => [1,3]
|
|
20
|
+
#
|
|
21
|
+
# @param [Block] f predicate
|
|
22
|
+
# @return [Enumerable]
|
|
23
|
+
def where!(&f)
|
|
24
|
+
select! &f
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Skips the first x elements of the enumerable
|
|
28
|
+
# Does not mutate the original enumerable
|
|
29
|
+
#
|
|
30
|
+
# [1,2,3,4,5].skip 3 #=> [4,5]
|
|
31
|
+
# {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}.skip 3 #=> {:d=>4, :e=>5}
|
|
32
|
+
#
|
|
33
|
+
#
|
|
34
|
+
# @param [Integer] x the number of elements to skip
|
|
35
|
+
# @return [Enumerable]
|
|
36
|
+
def skip(x)
|
|
37
|
+
drop(x)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Skips the elements of the enumerable while the predicate evaluates to true
|
|
41
|
+
# Does not mutate the original enumerable
|
|
42
|
+
#
|
|
43
|
+
# [1,2,3,2,1,0].skip_while {|x| x < 3} # => [3,2,1,0]
|
|
44
|
+
#
|
|
45
|
+
# @param [Block] p predicate to decide whether to skip
|
|
46
|
+
# @return [Enumerable]
|
|
47
|
+
def skip_while(&p)
|
|
48
|
+
drop_while(&p)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Takes the last x element of the enumerable
|
|
52
|
+
# Does not mutate the original enumerable
|
|
53
|
+
#
|
|
54
|
+
# [1,2,3,4,5,6].back 3 #=> [4,5,6]
|
|
55
|
+
# [1,2,3,4,5,6].back 100 #=> [1,2,3,4,5,6]
|
|
56
|
+
# [1,2,3,4,5,6].back 0 #=> []
|
|
57
|
+
#
|
|
58
|
+
# @param [Integer] x the number of elements to take
|
|
59
|
+
# @return [Enumerable]
|
|
60
|
+
def back(x)
|
|
61
|
+
reverse.take(x).reverse
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Takes the last x element while predicate evaluates to true
|
|
65
|
+
# Does not mutate the original enumerable
|
|
66
|
+
#
|
|
67
|
+
# [1,2,3,2,1,0].back_while {|x| x <2} # => [1,0]
|
|
68
|
+
#
|
|
69
|
+
# @param [Block] p the predicate the to evaluate while considering to take the last element
|
|
70
|
+
# @return [Enumerable]
|
|
71
|
+
def back_while(&p)
|
|
72
|
+
reverse_each.take_while(&p).reverse
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Omits the last x element of the enumerable
|
|
76
|
+
# Does not mutate the original enumerable
|
|
77
|
+
#
|
|
78
|
+
# [1,2,3,4,5].omit 2 # => [1,2,3]
|
|
79
|
+
# [1,2,3,4,5].omit 100 #=> []
|
|
80
|
+
# [1,2,3,4,5].omit 0 # => [1,2,3,4,5]
|
|
81
|
+
#
|
|
82
|
+
# @param [Integer] x the number of elements to omit
|
|
83
|
+
# @return [Enumerable]
|
|
84
|
+
def omit(x)
|
|
85
|
+
reverse_each.drop(x).reverse
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Omits the last element while the predicate evaluates to true
|
|
89
|
+
# Does not mutate the original enumerable
|
|
90
|
+
#
|
|
91
|
+
# [1,2,3,2,1,0].omit_while { |x| x <3} #=> [1,2,3]
|
|
92
|
+
#
|
|
93
|
+
# @param [Block] p the predicate to evaluate to consider to remove the last element
|
|
94
|
+
# @return [Enumerable]
|
|
95
|
+
def omit_while(&p)
|
|
96
|
+
reverse_each.drop_while(&p).reverse
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Removes all occurrences of the element within the enumerable
|
|
100
|
+
# Does not mutate the original enumerable
|
|
101
|
+
#
|
|
102
|
+
# [1,2,3,1,2,3].remove 3 #=> [1,2,1,2]
|
|
103
|
+
# %w(apple pear apple pear).remove "apple" #=> %w(pear pear)
|
|
104
|
+
#
|
|
105
|
+
# @param [Object] search the target to remove from the array
|
|
106
|
+
# @return [Enumerable]
|
|
107
|
+
def remove(search)
|
|
108
|
+
where {|x| x != search}
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Whether the enumerable contains at least 1 element that matches the input
|
|
112
|
+
#
|
|
113
|
+
# [1,2,3,4,5,6,1].has? 1 # true
|
|
114
|
+
# [1,2,3,4,5,6,1].has? 2 # true
|
|
115
|
+
# [1,2,3,4,5,6,1].has? 7 # false
|
|
116
|
+
#
|
|
117
|
+
# @param [Object] search target
|
|
118
|
+
# @return [Boolean]
|
|
119
|
+
def has?(search)
|
|
120
|
+
count(search) > 0
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Remove all occurrences of each element in provided array from target array
|
|
124
|
+
# Does not mutate the original enumerable
|
|
125
|
+
#
|
|
126
|
+
# [1,2,3,4,1,2,3,4].without [2,4] #=> [1,3,1,3]
|
|
127
|
+
#
|
|
128
|
+
# @param [Array] w the elements to remove
|
|
129
|
+
# @return [Enumerable]
|
|
130
|
+
def without(w)
|
|
131
|
+
where {|x| !w.has?(x)}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Remove all elements has index of the input array
|
|
135
|
+
# Does not mutate the original enumerable
|
|
136
|
+
#
|
|
137
|
+
# [6,5,4,3,2].without_index [0,2] #=> [5,3,2]
|
|
138
|
+
# {:a => 1, :b => 2, :c => 3}.without_index([0, 2]).to_h # => {:b=>2}
|
|
139
|
+
# @param [Array] index the elements to remove
|
|
140
|
+
# @return [Enumerable]
|
|
141
|
+
def without_index(index)
|
|
142
|
+
each_with_index.where {|_, i| !index.has?(i)}.map {|x, _| x}
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Gets the indexes that matches the predicate
|
|
146
|
+
# Does not mutate the original enumerable
|
|
147
|
+
#
|
|
148
|
+
# [6,5,4,3,2].indexes {|x| x < 4} # => [3,4]
|
|
149
|
+
#
|
|
150
|
+
# @param [Block] p the predicate to find indexes
|
|
151
|
+
# @return [Array<Integer>]
|
|
152
|
+
def indexes(&p)
|
|
153
|
+
ret = []
|
|
154
|
+
each_with_index do |x, i|
|
|
155
|
+
if p.call(x, i)
|
|
156
|
+
ret.append i
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
ret
|
|
160
|
+
end
|
|
161
|
+
end
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
class String
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# Replaces the search string with the target string.
|
|
5
|
+
# Returns a copy, does not modify original string
|
|
6
|
+
#
|
|
7
|
+
# "a=>b=>c".replace_all("=>","-") # => "a-b-c"
|
|
8
|
+
#
|
|
9
|
+
# @param [string] search the string to search for (to be replaced)
|
|
10
|
+
# @param [string] target the string to replace with
|
|
11
|
+
# @return [string]
|
|
12
|
+
def replace_all (search, target)
|
|
13
|
+
r = self.split(search).join target
|
|
14
|
+
if self.end_with? search
|
|
15
|
+
r += target
|
|
16
|
+
end
|
|
17
|
+
r
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Replaces the search string with the target string.
|
|
21
|
+
# Modifies original string
|
|
22
|
+
#
|
|
23
|
+
# "a=>b=>c".replace_all!("=>","-") # => "a-b-c"
|
|
24
|
+
#
|
|
25
|
+
# @param [string] search the string to search for (to be replaced)
|
|
26
|
+
# @param [string] target the string to replace with
|
|
27
|
+
# @return [string]
|
|
28
|
+
def replace_all!(search, target)
|
|
29
|
+
replace(replace_all(search, target))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Takes the first x characters of the string
|
|
33
|
+
# Does not modify original string
|
|
34
|
+
#
|
|
35
|
+
# "Singapore".take 4 # => "Sing"
|
|
36
|
+
# "Singapore".take 100 # => "Singapore"
|
|
37
|
+
# "Singapore".take 0 # => ""
|
|
38
|
+
#
|
|
39
|
+
# @param [Integer] x number of characters to take
|
|
40
|
+
# @return [String]
|
|
41
|
+
def take(x)
|
|
42
|
+
self[0...x]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Takes the first x characters of the string
|
|
46
|
+
# Modifies original string
|
|
47
|
+
#
|
|
48
|
+
# "Singapore".take! 4 # => "Sing"
|
|
49
|
+
# "Singapore".take! 100 # => "Singapore"
|
|
50
|
+
# "Singapore".take! 0 # => ""
|
|
51
|
+
#
|
|
52
|
+
# @param [Integer] x number of characters to take
|
|
53
|
+
# @return [String]
|
|
54
|
+
def take!(x)
|
|
55
|
+
replace(self[0...x])
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Skips the first x characters of the string
|
|
59
|
+
# Does not modify the original string
|
|
60
|
+
#
|
|
61
|
+
# "Singapore".skip 5 # => "pore"
|
|
62
|
+
# "Singapore".skip 100 # => ""
|
|
63
|
+
# "Singapore".skip 0 # => "Singapore"
|
|
64
|
+
#
|
|
65
|
+
# @param [Integer] x number of character to skip
|
|
66
|
+
# @return [String]
|
|
67
|
+
def skip(x)
|
|
68
|
+
if x > self.length
|
|
69
|
+
return ""
|
|
70
|
+
end
|
|
71
|
+
self[x..-1]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Skips the first x characters of the string
|
|
75
|
+
# Modifies the original string
|
|
76
|
+
#
|
|
77
|
+
# "Singapore".skip! 5 # => "pore"
|
|
78
|
+
# "Singapore".skip! 100 # => ""
|
|
79
|
+
# "Singapore".skip! 0 # => "Singapore"
|
|
80
|
+
#
|
|
81
|
+
# @param [Integer] x number of character to skip
|
|
82
|
+
# @return [String]
|
|
83
|
+
def skip!(x)
|
|
84
|
+
replace(skip x)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Omits the last x characters of the string
|
|
88
|
+
# Does not modify the original string
|
|
89
|
+
#
|
|
90
|
+
# "Singapore".omit 5 # => "Sing"
|
|
91
|
+
# "Singapore".omit 100 # => ""
|
|
92
|
+
# "Singapore".omit 0 # => "Singapore"
|
|
93
|
+
#
|
|
94
|
+
# @param [Integer] x the number of characters to omit
|
|
95
|
+
# @return [String]
|
|
96
|
+
def omit(x)
|
|
97
|
+
self[0..-(x + 1)]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Omits the last x characters of the string
|
|
101
|
+
# Modifies the original string
|
|
102
|
+
#
|
|
103
|
+
# "Singapore".omit 5 # => "Sing"
|
|
104
|
+
# "Singapore".omit 100 # => ""
|
|
105
|
+
# "Singapore".omit 0 # => "Singapore"
|
|
106
|
+
#
|
|
107
|
+
# @param [Integer] x the number of characters to omit
|
|
108
|
+
# @return [String]
|
|
109
|
+
def omit!(x)
|
|
110
|
+
replace(omit x)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Takes the last x characters of the string
|
|
114
|
+
# Does not modify the original string
|
|
115
|
+
#
|
|
116
|
+
# "Singapore".back 4 #=> "pore"
|
|
117
|
+
# "Singapore".back 100 # =>"Singapore"
|
|
118
|
+
# "Singapore".back 0 # => ""
|
|
119
|
+
#
|
|
120
|
+
# @param [Integer] x the number of character to take
|
|
121
|
+
# @return [String]
|
|
122
|
+
def back(x)
|
|
123
|
+
if x > self.length
|
|
124
|
+
return self
|
|
125
|
+
end
|
|
126
|
+
self[self.length - x..-1]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Takes the last x characters of the string
|
|
130
|
+
# Modify the original string
|
|
131
|
+
#
|
|
132
|
+
# "Singapore".back! 4 #=> "pore"
|
|
133
|
+
# "Singapore".back! 100 # =>"Singapore"
|
|
134
|
+
# "Singapore".back! 0 # => ""
|
|
135
|
+
#
|
|
136
|
+
# @param [Integer] x the number of character to take
|
|
137
|
+
# @return [String]
|
|
138
|
+
def back!(x)
|
|
139
|
+
replace(back x)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Removes the character at the index
|
|
143
|
+
# Does not modify the original string
|
|
144
|
+
#
|
|
145
|
+
# Returns without removing characters if index or negative index
|
|
146
|
+
# exceeds length of string
|
|
147
|
+
#
|
|
148
|
+
# "Hey! scent!".remove_char_at 0 # => "ey! scent!"
|
|
149
|
+
# "Hey! scent!".remove_char_at 3 # => "Hey scent!"
|
|
150
|
+
# "Hey! scent!".remove_char_at -1 # => "Hey! scent"
|
|
151
|
+
# "Hey! scent!".remove_char_at -6 #=> "Hey! cent!"
|
|
152
|
+
# "Hey! scent!".remove_char_at 100 # => "Hey! scent!"
|
|
153
|
+
# "Hey! scent!".remove_char_at -100 # => "Hey! scent!"
|
|
154
|
+
#
|
|
155
|
+
# @param [Integer] x the position to remove. Negative index counts from back
|
|
156
|
+
# @param [String]
|
|
157
|
+
def remove_char_at(x)
|
|
158
|
+
i = x + (x < 0 ? length : 0)
|
|
159
|
+
i < 0 ? self : take(i) + skip(i + 1)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Removes the character at the index
|
|
163
|
+
# Modifies the original string
|
|
164
|
+
#
|
|
165
|
+
# Returns without removing characters if index or negative index
|
|
166
|
+
# exceeds length of string
|
|
167
|
+
#
|
|
168
|
+
# "Hey! scent!".remove_char_at! 0 # => "ey! scent!"
|
|
169
|
+
# "Hey! scent!".remove_char_at! 3 # => "Hey scent!"
|
|
170
|
+
# "Hey! scent!".remove_char_at! -1 # => "Hey! scent"
|
|
171
|
+
# "Hey! scent!".remove_char_at! -6 #=> "Hey! cent!"
|
|
172
|
+
# "Hey! scent!".remove_char_at! 100 # => "Hey! scent!"
|
|
173
|
+
# "Hey! scent!".remove_char_at! -100 # => "Hey! scent!"
|
|
174
|
+
#
|
|
175
|
+
# @param [Integer] x the position to remove. Negative index counts from back
|
|
176
|
+
# @param [String]
|
|
177
|
+
def remove_char_at!(x)
|
|
178
|
+
replace remove_char_at x
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Removes all instance of the word
|
|
182
|
+
# Does not modify the original string
|
|
183
|
+
#
|
|
184
|
+
# "a=>b=>c".remove "=>" # => "abc"
|
|
185
|
+
# "a,b,c".remove "," # => "abc"
|
|
186
|
+
# "a,b,c".remove "a" # => ",b,c"
|
|
187
|
+
#
|
|
188
|
+
# @param [String] search string to remove
|
|
189
|
+
# @return [String]
|
|
190
|
+
def remove(search)
|
|
191
|
+
replace_all(search, "")
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# Removes all instance of the word
|
|
195
|
+
# Modifies the original string
|
|
196
|
+
#
|
|
197
|
+
# "a=>b=>c".remove! "=>" # => "abc"
|
|
198
|
+
# "a,b,c".remove! "," # => "abc"
|
|
199
|
+
# "a,b,c".remove! "a" # => ",b,c"
|
|
200
|
+
#
|
|
201
|
+
# @param [String] search string to remove
|
|
202
|
+
# @return [String]
|
|
203
|
+
def remove!(search)
|
|
204
|
+
replace remove search
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Remove any instance of the words in the array in order
|
|
208
|
+
# Does not modify the original string
|
|
209
|
+
#
|
|
210
|
+
# "A=>B->C".without ["=>","->"] # => "ABC"
|
|
211
|
+
#
|
|
212
|
+
# @param [Array<String>] unwanted the strings to remove
|
|
213
|
+
# @return [String]
|
|
214
|
+
def without(unwanted)
|
|
215
|
+
unwanted.reduce(self, &:remove)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Remove any instance of the words in the array in order
|
|
219
|
+
# Modifies the original string
|
|
220
|
+
#
|
|
221
|
+
# "A=>B->C".without! ["=>","->"] # => "ABC"
|
|
222
|
+
#
|
|
223
|
+
# @param [Array<String>] unwanted the strings to remove
|
|
224
|
+
# @return [String]
|
|
225
|
+
def without!(unwanted)
|
|
226
|
+
replace without unwanted
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Repeats the string x number of times
|
|
230
|
+
# Does not modify the original string
|
|
231
|
+
# Input is absolute-d
|
|
232
|
+
#
|
|
233
|
+
# "Hello ".repeat 3 # => "Hello Hello Hello "
|
|
234
|
+
# "Hello ".repeat -3 # => "Hello Hello Hello "
|
|
235
|
+
#
|
|
236
|
+
# @param [Integer] x number of times to repeat
|
|
237
|
+
# @return [String]
|
|
238
|
+
def repeat(x)
|
|
239
|
+
Array.new(x.abs, self).reduce("", &:+)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Repeats the string x number of times
|
|
243
|
+
# Modifies the original string
|
|
244
|
+
# Input is absolute-d
|
|
245
|
+
#
|
|
246
|
+
# "Hello ".repeat! 3 # => "Hello Hello Hello "
|
|
247
|
+
# "Hello ".repeat! -3 # => "Hello Hello Hello "
|
|
248
|
+
#
|
|
249
|
+
# @param [Integer] x number of times to repeat
|
|
250
|
+
# @return [String]
|
|
251
|
+
def repeat!(x)
|
|
252
|
+
replace repeat(x)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Repeats the string x number of times
|
|
256
|
+
# Does not modify the original string
|
|
257
|
+
# Input is absolute-d
|
|
258
|
+
#
|
|
259
|
+
# "Hello ".repeat 3 # => "Hello Hello Hello "
|
|
260
|
+
# "Hello ".repeat -3 # => "Hello Hello Hello "
|
|
261
|
+
#
|
|
262
|
+
# @param [Integer] x number of times to repeat
|
|
263
|
+
# @return [String]
|
|
264
|
+
def *(x)
|
|
265
|
+
repeat x
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Counts the number of times a string appears
|
|
269
|
+
#
|
|
270
|
+
# "Hello".count_occurrences "l" # => 2
|
|
271
|
+
# "one day one night".count_occurrences "one" # => 2
|
|
272
|
+
# "one day one night".count_occurrences "day" # => 1
|
|
273
|
+
# "one day one night".count_occurrences "morning" # => 0
|
|
274
|
+
# "one day one night one".count_occurrences "one" # => 3
|
|
275
|
+
#
|
|
276
|
+
# @param [String] search the string to count
|
|
277
|
+
# @return [Integer]
|
|
278
|
+
def count_occurrences(search)
|
|
279
|
+
(length - remove(search).length).abs / search.length
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
end
|
data/lib/kirinnee_core.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kirinnee_core
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- kirinnee
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-03-
|
|
11
|
+
date: 2019-03-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -77,6 +77,8 @@ files:
|
|
|
77
77
|
- bin/setup
|
|
78
78
|
- kirinnee_core.gemspec
|
|
79
79
|
- lib/kirinnee_core.rb
|
|
80
|
+
- lib/kirinnee_core/enumerable.rb
|
|
81
|
+
- lib/kirinnee_core/string.rb
|
|
80
82
|
- lib/kirinnee_core/version.rb
|
|
81
83
|
homepage: https://gitlab.com/ruby-gem/kirinnee-core
|
|
82
84
|
licenses:
|