Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/serradura/ruby-lambdas
Expose Ruby object methods as lambdas (functions).
https://github.com/serradura/ruby-lambdas
curried-functions functional-programming lambdas ruby ruby-gem
Last synced: 25 days ago
JSON representation
Expose Ruby object methods as lambdas (functions).
- Host: GitHub
- URL: https://github.com/serradura/ruby-lambdas
- Owner: serradura
- License: mit
- Created: 2018-12-29T01:33:48.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2020-02-29T15:08:32.000Z (over 4 years ago)
- Last Synced: 2024-10-03T05:41:12.562Z (about 1 month ago)
- Topics: curried-functions, functional-programming, lambdas, ruby, ruby-gem
- Language: Ruby
- Homepage: https://rubygems.org/gems/ruby-lambdas
- Size: 45.9 KB
- Stars: 9
- Watchers: 3
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
[![Maintainability](https://api.codeclimate.com/v1/badges/8ce742227db2f760463e/maintainability)](https://codeclimate.com/github/serradura/ruby-lambdas/maintainability)
# RubyLambdas
Expose Ruby object methods as lambdas (functions).
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'ruby-lambdas', require: 'ruby/lambdas'
```And then execute:
$ bundle
Or install it yourself as:
$ gem install ruby-lambdas
## Usage
**Basics:**
```ruby
require "ruby/lambdas"Strings::Strip.call(" hello ") # => "hello"
# Strings::Trim is an alias to the Strings::Strip function
Strings::Trim.call(" hello ") # => "hello"# Other ways to call a lambda (function):
Strings::Trim[" hello "]
Strings::Trim.(" hello ") # Syntactic sugar to hide “call”.
Strings::Trim.===(" hello ") # This allows a proc object to be the target of a when clause in a case statement.
Strings::Trim.yield(" hello ")
```**Partial application (curried functions):**
```ruby
require "ruby/lambdas"# We call a function with fewer arguments than it expects and It returns a
# function that takes the remaining arguments.
# And this is called Partial Application of Functions. e.g:Strings::GSub.call(/[aeiou]/, "hello", "*") # => "h*ll*"
Strings::GSub.call(/[aeiou]/).call("hello", "*") # => "h*ll*"
Strings::GSub.call(/[aeiou]/).call("hello").call("*") # => "h*ll*"# Last example with an alternative syntax:
Strings::GSub.(/[aeiou]/).("hello").("*") # => "h*ll*"# ---
replace_vowels = Strings::GSub.call(/[aeiou]/)
replace_vowels.call("_", "banana") # => "b_n_n_"
# ---
hide_vowels = replace_vowels.call("*")
hide_vowels.call("hello") # => "h*ll*"
```**Pipelines:**
```ruby
require "ruby/lambdas"###########################
# RUBY_VERSION >= '2.6.0' #
###########################value = ' I WILL be a url slug '
value
.then(&Strings::Strip)
.then(&Strings::Downcase)
.then(&Strings::GSub[' ', '-'])# => "i-will-be-a-url-slug"
###########################
# RUBY_VERSION >= '2.5.0' #
###########################value = ' I WILL be a url slug '
value
.yield_self(&Strings::Strip)
.yield_self(&Strings::Downcase)
.yield_self(&Strings::GSub[' ', '-'])# => "i-will-be-a-url-slug"
```**Composing functions (`RUBY_VERSION >= '2.6.0'`):**
```ruby
require "ruby/lambdas"
# -- Alternative syntax --
Slugify = # Slugify =
Strings::FromObject # Strings::String
.>> Strings::Strip # >> Strings::Trim \
.>> Strings::Downcase # >> Strings::LowerCase \
.>> Strings::GSub[' ', '-'] # >> Strings::ReplaceAll[' ', '-']# Reading the previous composition (Step by step):
# 1. Convert a given object (first input) as a String
# 2. Remove all whitespaces from both sides of a string.
# 3. Convert a string to all lower case.
# 4. Replace all occurrences of " " by "-".#########
# Usage #
#########
Slugify.(nil) # => ""
Slugify.(1) # => "1"
Slugify.(1.0) # => "1.0"
Slugify.(' I WILL be a url slug ') # => "i-will-be-a-url-slug"
```### Strict mode
By default, all functions believe in their given inputs data types. To change this behavior, you can enable the strict mode (data type checking) via `require "ruby/lambdas/strict-mode"`. e.g:
```ruby
p ["2", "4"].map(&Numerics + "1") # => ["12", "14"]require "ruby/lambdas/strict-mode"
p ["2", "4"].map(&Numerics + "1") # => Numerics::TypeError ("1" must be Numeric)
p ["2", "4"].map(&Numerics + 1) # => Numerics::TypeError ("2" must be Numeric)
p [2, "4"].map(&Numerics + 1) # => Numerics::TypeError ("4" must be Numeric)
p [2, 4].map(&Numerics + 1) # => [3, 5]
```### Do you like it?
So, look in [examples folder](https://github.com/serradura/ruby-lambdas/tree/master/examples) to see more ideas and benchmarks.
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
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).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/serradura/ruby-lambdas. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
## Code of Conduct
Everyone interacting in the RubyLambdas project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/serradura/ruby-lambdas/blob/master/CODE_OF_CONDUCT.md).