/// See https://wiki.haskell.org/Bracket_pattern /// # Arguments /// /// * `R` - type of resource /// * `T` - type of return value from computation /// * `E` - type of error /// * `acquire` - possibly failing function that acquires resource /// * `release` - function that releases resource /// * `consume` - possibly failing function that consumes resource and yields return value of type `T` #[allow(dead_code)] pub fn bracket(acquire: F, release: G, consume: H) -> std::result::Result where F: FnOnce() -> std::result::Result, G: FnOnce(R) -> (), H: FnOnce(&R) -> std::result::Result, { let resource = acquire()?; let result = consume(&resource); release(resource); result }