# once-fn
This crate focuses on one simple thing: **make a function runs only once**. All subsequent calls will return the result of the first call.
## Limitations
- Return type must satisfy:
- Implements `Clone`, or a reference points to a type that implements `Clone`.
- could not be generics type or `impl` clause.
## Example
```rust
use once_fn::once;
#[once]
pub fn foo(b: bool) -> bool {
b
}
assert!(foo(true)); // set the return value to `true`
assert!(foo(false)); // will not run this function twice; directly return `true`.
// allows ref:
#[once]
pub fn foo2(b: &bool) -> &bool {
b
}
```
for impl block:
```rust
use once_fn::once_impl;
struct Foo;
#[once_impl]
impl Foo {
#[once]
pub fn foo(b: bool) -> bool {
b
}
}
```
see [tests](./tests/) for more examples.
## Why not
- `cached::proc_macro::once`
- does not support async fn
- does not support generics (in input)
- does not support reference (in return type)
- does not support use in impl block
- `fn-once`
- Almost no docs; I don't know what it actually do.
- It can't even compile its example
## MSRV
1.61.0 (nightly), 1.70.0 (stable)
## todo
- [x] support impl block