1:- module(st_file, [
    2    st_cached/2,           % +File, -Template
    3    st_resolve/3,          % +File, -AbsFile, +Options
    4    st_cache_put/2,        % +File, +Template
    5    st_cache_invalidate/0,
    6    st_resolve_include/3   % +Include, +File, -AbsFile
    7]).

File handling

Handles file paths and caching. */

   14:- use_module(library(option)).   15
   16:- dynamic(template/2).
 st_cached(+File, -Template) is semidet
Retrieves the cached template. Fails when no such template is cached.
   23st_cached(File, Template):-
   24    with_mutex(st_cache,
   25        cached_unsafe(File, Template)).
   26
   27cached_unsafe(File, Template):-
   28    template(File, Template).
 st_cache_invalidate is det
Purges all cache entries.
   34st_cache_invalidate:-
   35    retractall(template(_, _)).
 st_resolve(+File, -AbsFile, +Options) is det
Resolves file name relative to current working directory. Adds extension.
   42st_resolve(File, AbsFile, Options):-
   43    option(extension(Ext), Options),
   44    absolute_file_name(File, Abs),
   45    atomic_list_concat([Abs, '.', Ext], AbsFile).
 st_resolve_include(+Include, +File, -Abs) is det
Resolves included file against the current file. Assumes that File is absolute path.
   52st_resolve_include(Include, File, Abs):-
   53    absolute_file_name(Include, Abs, [relative_to(File)]).
 st_cache_put(File, Template) is det
Puts the template into cache. Does nothing when caching is not enabled.
   60st_cache_put(File, Template):-
   61    with_mutex(st_cache,
   62        st_cache_put_unsafe(File, Template)).
   63
   64st_cache_put_unsafe(File, Template):-
   65    (   template(File, _)
   66    ->  true
   67    ;   assertz(template(File, Template)))