#once #cache #proc-macro #first #impl

macro once-fn

cache the result of a function, make it runs only once

2 unstable releases

0.2.0 Oct 12, 2024
0.1.0 Oct 8, 2024

#1226 in Rust patterns

Download history 79/week @ 2024-10-02 221/week @ 2024-10-09 16/week @ 2024-10-16

52 downloads per month

MIT license

9KB
107 lines

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

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:

use once_fn::once_impl;
struct Foo;

#[once_impl]
impl Foo {
    #[once]
    pub fn foo(b: bool) -> bool {
        b
    }
}

see 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

  • support impl block

Dependencies

~250–700KB
~16K SLoC