ensure 0.2.0

Ensure target state of an object
Documentation
This library provides `Ensure` trait that is useful for objects with unknown initial external state that can be brought to some target state.

This can be seen as `TryInto` trait for objects with side effects with unknown initial external state and desired target state.
For example a file may or may not exist. By implementing `Ensure` we can call `ensure()` to create new file only if it did not exist already.

Closures returning `CheckEnsureResult` that also return closure in `CheckEnsureResult::EnsureAction` variant automatically implement `Ensure` trait. 
Helper function `ensure` can be used to call `ensure()` on such closure.

# Example

This program will create file only if it does not exist already.

```rust
use std::path::Path;
use std::fs::File;
use ensure::ensure;
use ensure::CheckEnsureResult::*;

fn main() {
    let path = Path::new("/tmp/foo.txt");

    ensure(|| {
        Ok(if path.exists() {
            Met(())
        } else {
            EnsureAction(|| {
                File::create(&path).map(|file| drop(file))
            })
        })
    }).expect("failed to create file");
}
```