Vim documentation: vital/System/Cache/Base

main help file
vital/System/Cache/Base.txt   An abstract class of unified cache system

Maintainer: Alisue <lambdalisue@hashnote.net>


==============================================================================
CONTENTS                        Vital.System.Cache.Base-contents

Introductions           Vital.System.Cache.Base-intro
Tutorial                Vital.System.Cache.Base-tutorial
Interface               Vital.System.Cache.Base-interface
  Functions             Vital.System.Cache.Base-functions
  Methods               Vital.System.Cache.Base-methods


==============================================================================
INTRODUCTIONS                           Vital.System.Cache.Base-intro

Vital.System.Cache.Base is an abstract class of unified cache system.
The following variants are currently available.

- Vital.System.Cache.Dummy      : A dummy cache system
- Vital.System.Cache.Memory     : A dictionary instance based cache system
- Vital.System.Cache.File       : A file based cache system
- Vital.System.Cache.SingleFile : A single file based cache system

This document is for creating your own variants. See Vital.System.Cache for
the cache system usage.


==============================================================================
Tutorial                                Vital.System.Cache.Base-tutorial

First of all, create s:new(...) function to return an instance of your variant
like:

        function! s:_vital_loaded(V) abort " {{{
          let s:Base = a:V.import('System.Cache.Base')
        endfunction " }}}
        function! s:_vital_depends() abort " {{{
          return ['System.Cache.Base']
        endfunction " }}}

        let s:cache = {
              \ '_cached': {},
              \ '__name__': 'your_variant_name',
              \}
        function! s:new(...)
          return extend(
                \ call(s:Base.new, a:000, s:Base),
                \ deepcopy(s:cache)
                \)
        endfunction

Then add "has", "get", "set", "keys", "remove", and "clear" methods into your
cache instance like:

        function! s:cache.has(name) abort
          let cache_key = self.cache_key(a:name)
          return has_key(self._cached, cache_key)
        endfunction

        function! s:cache.get(name, ...) abort
          let default = get(a:000, 0, '')
          let cache_key = self.cache_key(a:name)
          if has_key(self._cached, cache_key)
            return self._cached[cache_key]
          else
            return default
          endif
        endfunction

        function! s:cache.set(name, value) abort
          let cache_key = self.cache_key(a:name)
          let self._cached[cache_key] = a:value
        endfunction

        function! s:cache.keys() abort
          return keys(self._cached)
        endfunction

        function! s:cache.remove(name) abort
          let cache_key = self.cache_key(a:name)
          if has_key(self._cached, cache_key)
            unlet self._cached[cache_key]
          endif
        endfunction

        function! s:cache.clear() abort
          let self._cached = {}
        endfunction


==============================================================================
INTERFACE                               Vital.System.Cache.Base-interface

To provide unified interface. The following functions and method are required
to be implemented.

-------------------------------------------------------------------------------
FUNCTIONS                               Vital.System.Cache.Base-functions

new([{options}])                        Vital.System.Cache.Base.new()

        Create a new instance of System.Cache.Base.
        If your variant require any extra information, use a dictionary to
        specify values like:

        let s:cache = { '__name__': 'your_variant_name' }
        function! s:new(...) abort
            let options = extend({
                \ 'foo': 'bar',
                \}, get(a:000, 0, {}))
            return extend(
                \ call(s:Base.new, a:000, s:Base),
                \ extend(options, deepcopy(s:cache))
                \)
        endfunction

-------------------------------------------------------------------------------
METHODS                                 Vital.System.Cache.Base-methods

cache_key({obj})        Vital.System.Cache.Base-instance.cache_key()

        Return a String which will be used as a cache key.
        Variants can override this method to create a cache key from {obj}.
        In default, it returns {obj} if the {obj} is String. Otherwise it
        returns a string representation (See string() for details) of the
        {obj}.

has({name})             Vital.System.Cache.Base-instance.has()

        Whether the cache instance has a {name} cache or not.

        VARIANTS MUST OVERRIDE THIS METHOD

        {name} (required)
        A name of the cache. An actual cache key SHOULD be created via
        Vital.System.Cache.Base-instance.cache_key() method thus {name} is not
        required to be String.

        See the following example:

        function! s:cache.has(name) abort
            let cache_key = self.cache_key(a:name)
            return has_key(self._cached, cache_key)
        endfunction

                        Vital.System.Cache.Base-instance.get()
get({name}[, {default}])

        Return a {name} cache. If no {name} cache is found, it returns
        {default} or an empty String.

        VARIANTS MUST OVERRIDE THIS METHOD

        {name} (required)
        A name of the cache. An actual cache key SHOULD be created via
        Vital.System.Cache.Base-instance.cache_key() method thus {name} is not
        required to be String.

        {default} (optional)
        A default value. If no {default} is specified, an empty String
        should be used.

        See the following example:

        function! s:cache.get(name, ...) abort
            let default = get(a:000, 0, '')
            let cache_key = self.cache_key(a:name)
            if has_key(self._cached, cache_key)
                return self._cached[cache_key]
            endif
            return default
        endfunction

set({name}, {value})    Vital.System.Cache.Base-instance.set()

        Save {value} as a {name} cache.

        VARIANTS MUST OVERRIDE THIS METHOD

        {name} (required)
        A name of the cache. An actual cache key SHOULD be created via
        Vital.System.Cache.Base-instance.cache_key() method thus {name} is not
        required to be String.

        {value} (required)
        A value of the cache.

        See the following example:

        function! s:cache.set(name, value) abort
          let cache_key = self.cache_key(a:name)
          let self._cached[cache_key] = a:value
        endfunction

keys()                  Vital.System.Cache.Base-instance.keys()

        Return a list of cache keys

        VARIANTS MUST OVERRIDE THIS METHOD

remove({name})          Vital.System.Cache.Base-instance.remove()

        Remove a {name} cache. If no {name} cache is found, it should do
        nothing.

        VARIANTS MUST OVERRIDE THIS METHOD

        {name} (required)
        A name of the cache. An actual cache key will be created via
        Vital.System.Cache.Base-instance.cache_key() method thus {name} is not
        required to be String.

        See the following example:

        function! s:cache.remove(name) abort
          let cache_key = self.cache_key(a:name)
          if has_key(self._cached, cache_key)
            unlet self._cached[cache_key]
          endif
        endfunction

clear()                 Vital.System.Cache.Base-instance.clear()

        Clear all caches

        VARIANTS MUST OVERRIDE THIS METHOD

on_changed()            Vital.System.Cache.Base-instance.on_changed()

        A user defined hook method. This method is called when the content of
        the cache is changed, namely after the following methods:
        - Vital.System.Cache.Base-instance.set()
        - Vital.System.Cache.Base-instance.remove()
        - Vital.System.Cache.Base-instance.clear()

==============================================================================
vim:tw=78:fo=tcq2mM:ts=8:ft=help:norl

top - main help file - tag index