BetterStruct
BetterStruct is a data structure which allows you to use your data without pain.
It behaves like an OpenStruct on steroids with monad.
hash = { "FooBar1" => { "FooBar2" => "Hello World!" } }
# Instead of this:
if hash["FooBar1"] && hash["FooBar1"]["FooBar2"] && hash["FooBar1"]["FooBar2"].respond_to?(:sub)
  hash["FooBar1"]["FooBar2"].sub("Hello ", "") # => "World!"
end
# Simply use:
BetterStruct.new(hash).foo_bar1.foo_bar2.sub("Hello ", "").value # => "World!"Installation
Add this line to your application's Gemfile:
gem "better_struct"And then execute:
$ bundle
Or install it yourself as:
$ gem install better_struct
Usage
Maybe monad
BetterStruct.new(nil) == BetterStruct.new(nil).this_method.does_not_exist # => trueEverything is wrapped
better_struct = BetterStruct.new("foobar")
better_struct[0..2] == BetterStruct.new("foo") # => truebetter_struct = BetterStruct.new([1, 2, 3])
better_struct.all? { |i| i.is_a?(BetterStruct) } == BetterStruct.new(true) # => trueLike an OpenStruct on steroids
some_hash = { foo_bar1: { foo_bar2: "Hello World!" } }
better_struct = BetterStruct.new(some_hash)
better_struct.foo_bar1.foo_bar2 == BetterStruct.new("Hello World!") # => trueLeaving the monad
better_struct = BetterStruct.new("foobar")
better_struct.gsub("foo", "super-").value == "super-bar" # => trueTesting
$ ruby -Ilib:test test/better_struct_test.rb
Benchmarking
BetterStruct is even faster than an OpenStruct:
$ ruby scripts/benchmark.rb
Calculating -------------------------------------
          OpenStruct     7.334k i/100ms
        BetterStruct     7.856k i/100ms
-------------------------------------------------
          OpenStruct     75.971k (± 7.1%) i/s -    381.368k
        BetterStruct     84.520k (± 4.5%) i/s -    424.224k
Comparison:
        BetterStruct:    84519.8 i/s
          OpenStruct:    75971.1 i/s - 1.11x slower
TODO
- Handle respond_to?.
Contributing
- Fork it ( https://github.com/exAspArk/better_struct/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request