Skip to content

akbarsaputrait/ngememoize

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4f28e9a Β· Jan 2, 2025

History

41 Commits
Jan 2, 2025
Jan 2, 2025
Dec 31, 2024
Jan 2, 2025
Dec 31, 2024
Jan 2, 2025
Jan 2, 2025
Jan 2, 2025
Dec 31, 2024
Jan 2, 2025
Jan 2, 2025
Jan 2, 2025
Dec 31, 2024
Jan 2, 2025
Jan 2, 2025

Repository files navigation

Ngememoize: Angular Memoization Library


Easily boost the performance of your Angular applications by memoizing functions and getters with this lightweight and simple-to-use library.

✨ Features

  • Memoize Functions: Cache function results for improved performance.
  • Memoize Getters: Optimize computed properties with caching.
  • Lightweight: Designed for efficiency without adding unnecessary overhead.
  • Decorator Support: Memoization is as simple as adding a decorator.
  • Angular Compatible: Fully supports Angular 18 and later.
  • Tree Shakable: Only include what you need.

πŸ“¦ Installation

To get started, install Ngememoize via npm:

npm install ngememoize

Or, if you use Yarn or PNPM:

yarn add ngememoize
# or
pnpm add ngememoize

πŸš€ Quick Start

Memoize a Function

import { Ngememoize } from 'ngememoize';

// Method example
@Memoize<[number], number>({
  debugLabel: 'processData'
})
processData(value: number): number {
  console.log('Processing...');
  return value * 2;
}

// Getter example
@Memoize<never, number>({
  debugLabel: 'computedValue'
})
get computedValue(): number {
  console.log('Computing...');
  return this.data.reduce((sum, val) => sum + val, 0);
}

// Dependent getter example
@MemoizeWithDeps<never, number>(
  function(this: ExampleComponent) {
    return [this.data, this.multiplier];
  },
  { debugLabel: 'dependentValue' }
)
get dependentValue(): number {
  console.log('Computing dependent...');
  return this.computedValue * this.multiplier;
}

// Async method example
@Memoize<[string], Promise<string>>({
  debugLabel: 'fetchData',
  maxAge: 5000
})
async fetchData(id: string): Promise<string> {
  console.log('Fetching...');
  return new Promise(resolve => 
    setTimeout(() => resolve(`Data for ${id}`), 1000)
  );
}

For more examples on how to use Ngememoize, please refer to the /projects/example directory.


πŸ§ͺ Testing

To ensure everything works perfectly, tests are included. Run the following commands:

npm test

πŸ“š Documentation

Memoization Decorator

  • @memoize: Use this decorator on functions or getters to enable memoization.

Cache Behavior

  • Cached results are invalidated when parameters or getter states change.

🎯 Benefits

  • Performance Boost: Reduce redundant computations.
  • Cleaner Code: Simplify logic by reducing manual caching.
  • Angular Ready: Seamlessly integrates with your Angular projects.

πŸ”§ Contributing

We welcome contributions! Here's how you can help:

  1. Fork the repository.
  2. Create a feature branch: git checkout -b feature/awesome-feature
  3. Commit your changes: git commit -m 'Add awesome feature'
  4. Push to the branch: git push origin feature/awesome-feature
  5. Open a Pull Request.

πŸ“œ License

This project is licensed under the MIT License. See the LICENSE file for details.


🀩 Credits

Ngememoize was built with ❀️ by developers who love Angular and believe in the power of simplicity and efficiency.


🌟 Support

If you find this library helpful, consider giving it a ⭐ on GitHub. Your support means a lot!

"Buy Me A Coffee"


Now go forth and memoize your way to blazing-fast Angular apps! πŸš€