[WIP] Selector
===============

[![Gem Version](https://img.shields.io/gem/v/selector.svg?style=flat)][gem]
[![Build Status](https://img.shields.io/travis/nepalez/selector/master.svg?style=flat)][travis]
[![Dependency Status](https://img.shields.io/gemnasium/nepalez/selector.svg?style=flat)][gemnasium]
[![Code Climate](https://img.shields.io/codeclimate/github/nepalez/selector.svg?style=flat)][codeclimate]
[![Coverage](https://img.shields.io/coveralls/nepalez/selector.svg?style=flat)][coveralls]
[![Inline docs](http://inch-ci.org/github/nepalez/selector.svg)][inch]

[codeclimate]: https://codeclimate.com/github/nepalez/selector
[coveralls]: https://coveralls.io/r/nepalez/selector
[gem]: https://rubygems.org/gems/selector
[gemnasium]: https://gemnasium.com/nepalez/selector
[travis]: https://travis-ci.org/nepalez/selector
[inch]: https://inch-ci.org/github/nepalez/selector

Composable multi-type conditions.

Synopsis
--------

### White Lists

```ruby
selector = Selector.new only: [:foo, :qux]
selector[:foo] # => true
selector[:bar] # => false

selector = Selector.new only: /foo/
selector[:foobar] # => true
selector[:bar]    # => false

selector = Selector.new only: 1..3
selector[2.4] # => true
selector[0]   # => false

selector = Selector.new only: -> value { value.is_a? Hash }
selector[foo: :FOO] # => true
selector[:foo]      # => false
```

### Black Lists

```ruby
selector = Selector.new except: [:bar, :qux]

selector[:foo] # => true
selector[:bar] # => false
```

### Negation

```ruby
blacklist = Selector.new except: /bar/
selector = !blacklist

selector[:bar] # => true
selector[:foo] # => false
```

### Algebra

```ruby
blacklist = Selector.new except: /bar/
whitelist = Selector.new only: /foo/

selector = whitelist & blacklist

selector[:foobaz] # => true
selector[:foobar] # => false
```

```ruby
blacklist = Selector.new except: /bar/
whitelist = Selector.new only: /foo/

selector = whitelist - blacklist # = whitelist + !blacklist

selector[:foobar] # => true
selector[:foo] # => false
selector[:bar] # => false
```

```ruby
blacklist = Selector.new except: 1..5
whitelist = Selector.new only: 4..8

selector = whitelist | blacklist # = !(!whitelist + !blacklist)
selector[0.5] # => true
selector[5.5] # => true
selector[2.5] # => false
```

### Immutability:

```ruby
Selector.new.frozen? # => true
```

Installation
------------

Add this line to your application's Gemfile:

```ruby
# Gemfile
gem "selector"
```

Then execute:

```
bundle
```

Or add it manually:

```
gem install selector
```

Compatibility
-------------

Tested under rubies [compatible to MRI 1.9.3+](.travis.yml).

Uses [RSpec] 3.0+ for testing and [hexx-suit] for dev/test tools collection.

[RSpec]: http://rspec.org
[hexx-suit]: https://github.com/nepalez/hexx-suit

Contributing
------------

* Read the [STYLEGUIDE](config/metrics/STYLEGUIDE)
* [Fork the project](https://github.com/nepalez/selector)
* Create your feature branch (`git checkout -b my-new-feature`)
* Add tests for it
* Commit your changes (`git commit -am '[UPDATE] Add some feature'`)
* Push to the branch (`git push origin my-new-feature`)
* Create a new Pull Request

License
-------

See the [MIT LICENSE](LICENSE).