diff options
| author | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 | 
|---|---|---|
| committer | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 | 
| commit | 0549b1e5a8a3132005e275d6026db8003cb067d2 (patch) | |
| tree | f0d7751ec32ecf5c4d23997fa0ffd3450a5a755a /Data/DefaultContent/Libraries/luafun/doc | |
| parent | 32345800737b668011a87328cd3dcce59ec2934c (diff) | |
*rename folder
Diffstat (limited to 'Data/DefaultContent/Libraries/luafun/doc')
23 files changed, 3493 insertions, 0 deletions
diff --git a/Data/DefaultContent/Libraries/luafun/doc/.gitignore b/Data/DefaultContent/Libraries/luafun/doc/.gitignore new file mode 100644 index 0000000..e35d885 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/.gitignore @@ -0,0 +1 @@ +_build diff --git a/Data/DefaultContent/Libraries/luafun/doc/Makefile b/Data/DefaultContent/Libraries/luafun/doc/Makefile new file mode 100644 index 0000000..1e1b049 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS    = +SPHINXBUILD   = sphinx-build +PAPER         = +BUILDDIR      = _build + +# Internal variables. +PAPEROPT_a4     = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: +	@echo "Please use \`make <target>' where <target> is one of" +	@echo "  html       to make standalone HTML files" +	@echo "  dirhtml    to make HTML files named index.html in directories" +	@echo "  singlehtml to make a single large HTML file" +	@echo "  pickle     to make pickle files" +	@echo "  json       to make JSON files" +	@echo "  htmlhelp   to make HTML files and a HTML help project" +	@echo "  qthelp     to make HTML files and a qthelp project" +	@echo "  devhelp    to make HTML files and a Devhelp project" +	@echo "  epub       to make an epub" +	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter" +	@echo "  latexpdf   to make LaTeX files and run them through pdflatex" +	@echo "  text       to make text files" +	@echo "  man        to make manual pages" +	@echo "  texinfo    to make Texinfo files" +	@echo "  info       to make Texinfo files and run them through makeinfo" +	@echo "  gettext    to make PO message catalogs" +	@echo "  changes    to make an overview of all changed/added/deprecated items" +	@echo "  linkcheck  to check all external links for integrity" +	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)" + +clean: +	-rm -rf $(BUILDDIR)/* + +html: +	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html +	@echo +	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: +	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml +	@echo +	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: +	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml +	@echo +	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: +	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle +	@echo +	@echo "Build finished; now you can process the pickle files." + +json: +	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json +	@echo +	@echo "Build finished; now you can process the JSON files." + +htmlhelp: +	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp +	@echo +	@echo "Build finished; now you can run HTML Help Workshop with the" \ +	      ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: +	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp +	@echo +	@echo "Build finished; now you can run "qcollectiongenerator" with the" \ +	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:" +	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/LuaFunctional.qhcp" +	@echo "To view the help file:" +	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/LuaFunctional.qhc" + +devhelp: +	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp +	@echo +	@echo "Build finished." +	@echo "To view the help file:" +	@echo "# mkdir -p $$HOME/.local/share/devhelp/LuaFunctional" +	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/LuaFunctional" +	@echo "# devhelp" + +epub: +	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub +	@echo +	@echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: +	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex +	@echo +	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." +	@echo "Run \`make' in that directory to run these through (pdf)latex" \ +	      "(use \`make latexpdf' here to do that automatically)." + +latexpdf: +	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex +	@echo "Running LaTeX files through pdflatex..." +	$(MAKE) -C $(BUILDDIR)/latex all-pdf +	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: +	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text +	@echo +	@echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: +	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man +	@echo +	@echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: +	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo +	@echo +	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." +	@echo "Run \`make' in that directory to run these through makeinfo" \ +	      "(use \`make info' here to do that automatically)." + +info: +	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo +	@echo "Running Texinfo files through makeinfo..." +	make -C $(BUILDDIR)/texinfo info +	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: +	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale +	@echo +	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: +	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes +	@echo +	@echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: +	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck +	@echo +	@echo "Link check complete; look for any errors in the above output " \ +	      "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: +	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest +	@echo "Testing of doctests in the sources finished, look at the " \ +	      "results in $(BUILDDIR)/doctest/output.txt." diff --git a/Data/DefaultContent/Libraries/luafun/doc/_static/.keep b/Data/DefaultContent/Libraries/luafun/doc/_static/.keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/_static/.keep diff --git a/Data/DefaultContent/Libraries/luafun/doc/_templates/layout.html b/Data/DefaultContent/Libraries/luafun/doc/_templates/layout.html new file mode 100644 index 0000000..ee1fa29 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/_templates/layout.html @@ -0,0 +1,14 @@ +{% extends "!layout.html" %} + +{% block footer %} +{{ super() }} +    <script type="text/javascript"> +(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ +(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), +m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + +ga('create', 'UA-45899190-2', 'auto'); +ga('send', 'pageview'); +    </script> +{% endblock %} diff --git a/Data/DefaultContent/Libraries/luafun/doc/about.rst b/Data/DefaultContent/Libraries/luafun/doc/about.rst new file mode 100644 index 0000000..97da8dc --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/about.rst @@ -0,0 +1,42 @@ +About +===== + +Credits +------- + +An initial prototype was designed and enginered in one evening by Roman Tsisyk. +After that the library was completely rewritten, tested and documented +(which took a while). + +The project exists only thanks to the excellent tracing just-in-time compiler +in `LuaJIT <http://luajit.org>`_. + +The library works best with `Tarantool <http://tarantool.org>`_ -- +an efficient in-memory database and Lua application server. + +Copying +------- + +Lua Fun source codes, logo and documentation are distributed under the +`MIT License (MIT) <http://www.opensource.org/licenses/mit-license.php>`_ -- +same as LuaJIT. + +Copyright (c) 2013-2017 Roman Tsisyk <roman@tsisyk.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Data/DefaultContent/Libraries/luafun/doc/basic.rst b/Data/DefaultContent/Libraries/luafun/doc/basic.rst new file mode 100644 index 0000000..346dd78 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/basic.rst @@ -0,0 +1,141 @@ +Basic Functions +=============== + +.. module:: fun + +The section contains functions to create iterators from Lua objects. + +.. function:: iter(array) +              iter(map) +              iter(string) +              iter(gen, param, state) + +   :returns: ``gen, param, state`` -- :ref:`iterator triplet <iterator_triplet>` + +   Make ``gen, param, state`` iterator from the iterable object. +   The function is a generalized version of :func:`pairs` and :func:`ipairs`. + +   The function distinguish between arrays and maps using ``#arg == 0`` +   check to detect maps. For arrays ``ipairs`` is used. For maps a modified +   version of ``pairs`` is used that also returns keys. Userdata objects +   are handled in the same way as tables. + +   If ``LUAJIT_ENABLE_LUA52COMPAT`` [#luajit_lua52compat]_ mode is enabled and +   argument has metamethods ``__pairs`` (for maps) or ``__ipairs`` for (arrays), +   call it with the table or userdata as argument and return the first three +   results from the call [#lua52_ipairs]_. + +   All library iterator are suitable to use with Lua's ``for .. in`` loop. + +   .. code-block:: lua + +    > for _it, a in iter({1, 2, 3}) do print(a) end +    1 +    2 +    3 + +    > for _it, k, v in iter({ a = 1, b = 2, c = 3}) do print(k, v) end +    b 2 +    a 1 +    c 3 + +    > for _it, a in iter("abcde") do print(a) end +    a +    b +    c +    d +    e + +   The first cycle variable *_it* is needed to store an internal state of +   the iterator. The value must be always ignored in loops: + +   .. code-block:: lua + +    for _it, a, b in iter({ a = 1, b = 2, c = 3}) do print(a, b) end +    -- _it is some internal iterator state - always ignore it +    -- a, b are values return from the iterator + +   Simple iterators like ``iter({1, 2, 3})`` have simple states, whereas +   other iterators like :func:`zip` or :func:`chain` have complicated +   internal states which values senseless for the end user. + +   Check out :doc:`under_the_hood` section for more details. + +   There is also the possibility to supply custom iterators to the +   function: + +   .. code-block:: lua + +    > local function mypairs_gen(max, state) +        if (state >= max) then +                return nil +        end +        return state + 1, state + 1 +    end + +    > local function mypairs(max) +        return mypairs_gen, max, 0 +    end + +    > for _it, a in iter(mypairs(10)) do print(a) end +    1 +    2 +    3 +    4 +    5 +    6 +    7 +    8 +    9 +    10 + +   Iterators can return multiple values. + +   Check out :doc:`under_the_hood` section for more details. + +   .. [#luajit_lua52compat] http://luajit.org/extensions.html +   .. [#lua52_ipairs] http://www.lua.org/manual/5.2/manual.html#pdf-ipairs + +.. function:: each(fun, gen, param, state) +              iterator:each(fun) + +   :returns: none + +   Execute the *fun* for each iteration value. The function is equivalent to +   the code below: + +   .. code-block:: lua + +    for _it, ... in iter(gen, param, state) do +        fun(...) +    end + +   Examples: + +   .. code-block:: lua + +    > each(print, { a = 1, b = 2, c = 3}) +    b 2 +    a 1 +    c 3 + +    > each(print, {1, 2, 3}) +    1 +    2 +    3 + +   The function is used for its side effects. Implementation directly applies +   *fun* to all iteration values without returning a new iterator, in contrast +   to functions like :func:`map`. + +   .. seealso:: :func:`map`, :func:`reduce` + +.. function:: for_each(fun, gen, param, state) +              iterator:for_each(fun) + +    An alias for :func:`each`. + +.. function:: foreach(fun, gen, param, state) +              iterator:foreach(fun) + +    An alias for :func:`each`. diff --git a/Data/DefaultContent/Libraries/luafun/doc/compositions.rst b/Data/DefaultContent/Libraries/luafun/doc/compositions.rst new file mode 100644 index 0000000..4c789b3 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/compositions.rst @@ -0,0 +1,140 @@ +Compositions +============ + +.. module:: fun + +.. function:: zip(...) +              iterator1:zip(iterator2, iterator3, ...) + +   :param ...: iterators to "zip" +   :type  ...: iterator + +   :returns: an iterator + +   Return a new iterator where i-th return value contains the i-th element +   from each of the iterators. The returned iterator is truncated in length +   to the length of the shortest iterator. For multi-return iterators only the +   first variable is used. + +   Examples: + +   .. code-block:: lua + +    > dump(zip({"a", "b", "c", "d"}, {"one", "two", "three"})) +    a one +    b two +    c three + +    > each(print, zip()) + +    > each(print, zip(range(5), {'a', 'b', 'c'}, rands())) +    1       a       0.57514179487402 +    2       b       0.79693061238668 +    3       c       0.45174307459403 + +    > each(print, zip(partition(function(x) return x > 7 end, range(1, 15, 1)))) +    8       1 +    9       2 +    10      3 +    11      4 +    12      5 +    13      6 +    14      7 + +.. function:: cycle(gen, param, state) +              iterator:cycle() + +   :returns: a cycled version of ``{gen, param, state}`` iterator + +   Make a new iterator that returns elements from ``{gen, param, state}`` +   iterator until the end and then "restart" iteration using a saved clone of +   ``{gen, param, state}``. The returned iterator is constant space and no +   return values are buffered. Instead of that the function make a clone of the +   source ``{gen, param, state}`` iterator. Therefore, the source iterator +   must be pure functional to make an indentical clone. Infinity iterators +   are supported, but are not recommended. + +   .. note:: ``{gen, param, state}`` must be pure functional to work properly +            with the function. + +   Examples: + +   .. code-block:: lua + +    > each(print, take(15, cycle(range(5)))) +    1 +    2 +    3 +    4 +    5 +    1 +    2 +    3 +    4 +    5 +    1 +    2 +    3 +    4 +    5 + +    > each(print, take(15, cycle(zip(range(5), {"a", "b", "c", "d", "e"})))) +    1       a +    2       b +    3       c +    4       d +    5       e +    1       a +    2       b +    3       c +    4       d +    5       e +    1       a +    2       b +    3       c +    4       d +    5       e + +.. function:: chain(...) +              iterator1:chain(iterator2, iterator3, ...) + +   :param ...: iterators to chain +   :type  ...: iterator +   :returns: a consecutive iterator from sources (left from right) + +   Make an iterator that returns elements from the first iterator until it is +   exhausted, then proceeds to the next iterator, until all of the iterators +   are exhausted. Used for treating consecutive iterators as a single iterator. +   Infinity iterators are supported, but are not recommended. + +   Examples: + +   .. code-block:: lua + +    > each(print, chain(range(2), {"a", "b", "c"}, {"one", "two", "three"})) +    1 +    2 +    a +    b +    c +    one +    two +    three + +    > each(print, take(15, cycle(chain(enumerate({"a", "b", "c"}), +        {"one", "two", "three"})))) +    1       a +    2       b +    3       c +    one +    two +    three +    1       a +    2       b +    3       c +    one +    two +    three +    1       a +    2       b +    3       c diff --git a/Data/DefaultContent/Libraries/luafun/doc/conf.py b/Data/DefaultContent/Libraries/luafun/doc/conf.py new file mode 100644 index 0000000..ce36bbf --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/conf.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +# +# Lua Functional documentation build configuration file, created by +# sphinx-quickstart on Sat Nov  9 14:21:28 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +#extensions = [ "redjack.sphinx.lua" ] + +# The documentation primary domain is lua +#primary_domain = "lua" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Lua Functional' +copyright = u'2013-2017, Roman Tsisyk' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1.3' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages.  See the documentation for +# a list of builtin themes. +html_theme = 'haiku' + +# Theme options are theme-specific and customize the look and feel of a theme +# further.  For a list of options available for each theme, see the +# documentation. +#html_theme_options = { +    #"full_logo": False, +#} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents.  If None, it defaults to +# "<project> v<release> documentation". +#html_title = None + +# A shorter title for the navigation bar.  Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = "logo.png" + +# The name of an image file (within the static path) to use as favicon of the +# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it.  The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +#htmlhelp_basename = 'LuaFunctionaldoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +#latex_documents = [ +  #('index', 'LuaFunctional.tex', u'Lua Functional Documentation', +   #u'Roman Tsisyk', 'manual'), +#] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ +    ('index', 'luafun', u'Lua Functional Documentation', +     [u'Roman Tsisyk'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +#  dir menu entry, description, category) +#texinfo_documents = [ +  #('index', 'LuaFunctional', u'Lua Functional Documentation', +   #u'Roman Tsisyk', 'LuaFunctional', 'One line description of project.', +   #'Miscellaneous'), +#] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' diff --git a/Data/DefaultContent/Libraries/luafun/doc/filtering.rst b/Data/DefaultContent/Libraries/luafun/doc/filtering.rst new file mode 100644 index 0000000..2852f6c --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/filtering.rst @@ -0,0 +1,121 @@ +Filtering +========= + +.. module:: fun + +This section contains functions to filter values during iteration. + +.. function:: filter(predicate, gen, param, state) +              iterator:filter(predicate) + +   :param param: an predicate to filter the iterator +   :type  param: (function(...) -> bool) + +   Return a new iterator of those elements that satisfy the **predicate**. + +   Examples: + +   .. code-block:: lua + +    > each(print, filter(function(x) return x % 3 == 0 end, range(10))) +    3 +    6 +    9 + +    > each(print, take(5, filter(function(i, x) return i % 3 == 0 end, +        enumerate(duplicate('x'))))) +    3       x +    6       x +    9       x +    12      x +    15      x + +   .. note:: Multireturn iterators are supported but can cause performance  +             regressions. + +   .. seealso:: :func:`take_while` and :func:`drop_while`. + +.. function:: remove_if(predicate, gen, param, state) +              iterator:remove_if(predicate) + +   An alias for :func:`filter`. + +.. function:: grep(regexp_or_predicate, gen, param, state) +              iterator:grep(regexp_or_predicate) + +   If **regexp_or_predicate** is string then the parameter is used as a regular +   expression to build filtering predicate. Otherwise the function is just an +   alias for :func:`filter`. + +   Equivalent to: + +   .. code-block:: lua + +    local fun = regexp_or_predicate +    if type(regexp_or_predicate) == "string" then +        fun = function(x) return string.find(x, regexp_or_predicate) ~= nil end +    end +    return filter(fun, gen, param, state) + +   Examples: + +   .. code-block:: lua + +    lines_to_grep = { +        [[Emily]], +        [[Chloe]], +        [[Megan]], +        [[Jessica]], +        [[Emma]], +        [[Sarah]], +        [[Elizabeth]], +        [[Sophie]], +        [[Olivia]], +        [[Lauren]] +    } + +    each(print, grep("^Em", lines_to_grep)) +    --[[test +    Emily +    Emma +    --test]] + +    each(print, grep("^P", lines_to_grep)) +    --[[test +    --test]] + +    > each(print, grep(function(x) return x % 3 == 0 end, range(10))) +    3 +    6 +    9 + +.. function:: partition(predicate, gen, param, state) +              iterator:partition(predicate) + +   :param x: a value to find +   :returns: {gen1, param1, state1}, {gen2, param2, state2} + +   The function returns two iterators where elements do and do not satisfy the +   prediucate. Equivalent to: + +   .. code-block:: lua + +       return filter(predicate, gen', param', state'), +       filter(function(...) return not predicate(...) end, gen, param, state); + +   The function make a clone of the source iterator. Iterators especially +   returned in tables to work with :func:`zip` and other functions. + +   Examples: + +   .. code-block:: lua + +    > each(print, zip(partition(function(i, x) return i % 3 == 0 end, range(10)))) +    3       1 +    6       2 +    9       4 + +   .. note:: ``gen, param, state`` must be pure functional to work properly +             with the function. + +   .. seealso:: :func:`span` diff --git a/Data/DefaultContent/Libraries/luafun/doc/generators.rst b/Data/DefaultContent/Libraries/luafun/doc/generators.rst new file mode 100644 index 0000000..7132d47 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/generators.rst @@ -0,0 +1,233 @@ +Generators +========== + +.. module:: fun + +This section contains a number of useful generators modeled after Standard ML, +Haskell, Python, Ruby, JavaScript and other languages. + +Finite Generators +----------------- + +.. function:: range([start,] stop[, step]) + +   :param start: an endpoint of the interval (see below) +   :type  start: number +   :param stop: an endpoint of the interval (see below) +   :type  stop: number +   :param step: a step +   :type  step: number + +   :returns: an iterator + +   The iterator to create arithmetic progressions. Iteration values are generated +   within closed interval ``[start, stop]`` (i.e. *stop* is included). +   If the *start* argument is omitted, it defaults to ``1`` (*stop* > 0) or +   to ``-1`` (*stop* < 0). If the *step* argument is omitted, it defaults to +   ``1`` (*start* <= *stop*) or to ``-1`` (*start* > *stop*).  If *step* is +   positive, the last element is the largest ``start + i * step`` less than or +   equal to *stop*; if *step* is negative, the last element is the smallest +   ``start + i * step`` greater than or equal to *stop*. +   *step* must not be zero (or else an error is raised). +   ``range(0)`` returns empty iterator. + +   Examples: + +   .. code-block:: lua + +    > for _it, v in range(5) do print(v) end +    1 +    2 +    3 +    4 +    5 +    > for _it, v in range(-5) do print(v) end +    -1 +    -2 +    -3 +    -4 +    -5 +    > for _it, v in range(1, 6) do print(v) end +    1 +    2 +    3 +    4 +    5 +    6 +    > for _it, v in range(0, 20, 5) do print(v) end +    0 +    5 +    10 +    15 +    20 +    > for _it, v in range(0, 10, 3) do print(v) end +    0 +    3 +    6 +    9 +    > for _it, v in range(0, 1.5, 0.2) do print(v) end +    0 +    0.2 +    0.4 +    0.6 +    0.8 +    1 +    1.2 +    1.4 +    > for _it, v in range(0) do print(v) end +    > for _it, v in range(1) do print(v) end +    1 +    > for _it, v in range(1, 0) do print(v) end +    1 +    0 +    > for _it, v in range(0, 10, 0) do print(v) end +    error: step must not be zero + +Infinity Generators +------------------- + +.. function:: duplicate(...) + +   :param ...: objects to duplicate +   :type  ...: non nil +   :returns: an iterator + +   The iterator returns values over and over again indefinitely. All values +   that passed to the iterator are returned as-is during the iteration. + +   Examples: + +   .. code-block:: lua + +    > each(print, take(3, duplicate('a', 'b', 'c'))) +    a       b       c +    a       b       c +    > each(print, take(3, duplicate('x'))) +    x +    x +    x +    > for _it, a, b, c, d, e in take(3, duplicate(1, 2, 'a', 3, 'b')) do +        print(a, b, c, d, e) +    >> end +    1       2       a       3       b +    1       2       a       3       b +    1       2       a       3       b + +.. function:: xrepeat(...) + +   An alias for :func:`duplicate`. + +.. function:: replicate(...) + +   An alias for :func:`duplicate`. + +.. function:: tabulate(fun) + +   :param fun: an unary generating function +   :type fun: function(n: uint) -> ...  +   :returns: an iterator + +   The iterator that returns ``fun(0)``, ``fun(1)``, ``fun(2)``, ``...`` values +   indefinitely. + +   Examples: + +   .. code-block:: lua + +    > each(print, take(5, tabulate(function(x)  return 'a', 'b', 2*x end))) +    a       b       0 +    a       b       2 +    a       b       4 +    a       b       6 +    a       b       8 +    > each(print, take(5, tabulate(function(x) return x^2 end))) +    0 +    1 +    4 +    9 +    16 + +.. function:: zeros() + +   :returns: an iterator + +   The iterator returns ``0`` indefinitely. + +   Examples: + +   .. code-block:: lua + +    > each(print, take(5, zeros())) +    0 +    0 +    0 +    0 +    0 + +.. function:: ones() + +   :returns: an iterator + +   The iterator that returns ``1`` indefinitely. + +   Example:: + +    > each(print, take(5, ones())) +    1 +    1 +    1 +    1 +    1 + +Random sampling +--------------- + +.. function:: rands([n[, m]]) + +   :param n: an endpoint of the interval (see below) +   :type  n: uint +   :param m: an endpoint of the interval (see below) +   :type  m: uint +   :returns: an iterator + +   The iterator returns random values using :func:`math.random`. +   If the **n** and **m** are set then the iterator returns pseudo-random +   integers in the ``[n, m)`` interval (i.e. **m** is not included). +   If the **m** is not set then the iterator generates pseudo-random integers +   in the ``[0, n)`` interval. When called without arguments returns +   pseudo-random real numbers with uniform distribution in the +   interval ``[0, 1)``. + +   .. warning:: This iterator is not pure-functional and may not work as +                expected with some library functions. + +   Examples: + +   .. code-block:: lua + +    > each(print, take(10, rands(10, 20))) +    19 +    17 +    11 +    19 +    12 +    13 +    14 +    16 +    10 +    11 + +    > each(print, take(5, rands(10))) +    7 +    6 +    5 +    9 +    0 + +    > each(print, take(5, rands())) +    0.79420629243124 +    0.69885246563716 +    0.5901037417281 +    0.7532286166836 +    0.080971251199854 + diff --git a/Data/DefaultContent/Libraries/luafun/doc/getting_started.rst b/Data/DefaultContent/Libraries/luafun/doc/getting_started.rst new file mode 100644 index 0000000..9a9e3de --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/getting_started.rst @@ -0,0 +1,254 @@ +Getting Started +=============== + +Please jump to `Using the Library`_ section if you are familiar with Lua and +LuaJIT. + +.. contents:: + +Prerequisites +------------- + +The library is designed for LuaJIT_. **LuaJIT 2.1 alpha** is high^W **Highly** +recommended for performance reasons. Lua 5.1--5.3 are also supported. + +The library is platform-independent and expected to work on all platforms that +supported by Lua(JIT). It can be also used in any Lua(JIT) based applications, +e.g. Tarantool_ or OpenResty_. + +You might need diff_ tool to run test system and sphinx_ to regenerate the +documentation from source files. + +.. _LuaJIT: http://luajit.org/ +.. _Tarantool: http://tarantool.org/ +.. _OpenResty: http://openresty.org/ +.. _diff: http://en.wikipedia.org/wiki/Diff +.. _sphinx: http://sphinx-doc.org/ + +Installing LuaJIT +----------------- + +You can build LuaJIT from sources or install it from a binary archive. + +From Sources +```````````` + +1. Clone LuaJIT git repository. Please note that **v2.1** branch is needed. +You can always select this branch using ``git checkout v2.1``. + +.. code-block:: bash + +    $ git clone http://luajit.org/git/luajit-2.0.git -b v2.1 luajit-2.1 +    Cloning into 'luajit-2.1'... + +2. Compile LuaJIT + +.. code-block:: bash + +    $ cd luajit-2.1/ +    luajit-2.1 $ make -j8 + +3. Install LuaJIT + +.. code-block:: bash + +    luajit-2.1 $ make install +    luajit-2.1 $ ln -s /usr/local/bin/luajit-2.1.0-alpha /usr/local/bin/luajit + +Install operation might require root permissions. However, you can install +LuaJIT into your home directory. + +From a Binary Archive +````````````````````` + +If operations above look too complicated for you, you always can download a +binary archive from http://luajit.org/download.html page. +Your favorite package manager may also have LuaJIT packages. + +Running LuaJIT +`````````````` + +Ensure that freshly installed LuaJIT works: + +.. code-block:: bash + +    $ luajit +    LuaJIT 2.1.0-alpha -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/ +    JIT: ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse +    > = 2 + 2 +    4 + +It is good idea to use LuaJIT CLI under ``rlwrap`` (on nix platforms): + +.. code-block:: bash + +    alias luajit="rlwrap luajit" +    $ luajit +    LuaJIT 2.1.0-alpha -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/ +    JIT: ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse +    > = 2 + 2 +    4 +    > = 2 + 2 <!-- You can use arrows, completion and so on, like in Bash + +Installing the Library +---------------------- + +Using LuaRocks +`````````````` + +Use the rockspec_ file. + +.. _rockspec: https://raw.github.com/luafun/luafun/master/fun-scm-1.rockspec + +Using git +````````` +1. Clone Lua Fun repository: + +.. code-block:: bash + +    git clone git://github.com/luafun/luafun.git +    $ cd luafun + +2. Run tests (optional): + +.. code-block:: bash + +    luafun $ cd tests +    luafun/tests $ ./runtest *.lua +    Testing basic.lua +    Testing compositions.lua +    Testing filters.lua +    Testing folds.lua +    Testing generators.lua +    Testing slices.lua +    Testing transformations.lua +    All tests have passed! + +Using wget +`````````` + +Just download https://raw.github.com/luafun/luafun/master/fun.lua file: + +.. code-block:: bash + +    $ wget https://raw.github.com/luafun/luafun/master/fun.lua + +Using the Library +----------------- + +Try to run LuaJIT in the same directory where ``fun.lua`` file is located: + +.. code-block:: bash +   :emphasize-lines: 4 + +    luafun $ luajit +    LuaJIT 2.1.0-alpha -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/ +    JIT: ON SSE2 SSE3 fold cse dce fwd dse narrow loop abc sink fuse +    > fun = require 'fun' +    > +    > for _k, a in fun.range(3) do print(a) end +    1 +    2 +    3 + +If you see an error message like ``stdin:1: module 'fun' not found:`` then +you need to configure you Package Path (``package.path``). Please consult +`Lua Wiki <http://lua-users.org/wiki/PackagePath>`_ for additional information. + + +**Lua Fun** designed to be small ubiquitous library. It is a good idea to import +all library functions to the global table: + +.. code-block:: bash +   :emphasize-lines: 1 + +    > for k, v in pairs(require "fun") do _G[k] = v end -- import fun.* +    > for _k, a in range(3) do print(a) end +    0 +    1 +    2 + +**Lua Fun** also provides a special **shortcut** to autoimport all functions: + +.. code-block:: bash +   :emphasize-lines: 1 + +    > require 'fun'() -- to import all lua.* functions to globals +    > each(print, range(5)) +    1 +    2 +    3 +    4 +    5 + +Now you can use **Lua Fun**: + +.. code-block:: bash + +    > print(sum(filter(function(x) return x % 16 == 0 end, range(10000)))) +    3130000 + +    > each(print, take(5, tabulate(math.sin))) +    0 +    2 +    4 +    6 +    8 + +    > each(print, enumerate(zip({"one", "two", "three", "four", "five"}, +        {"a", "b", "c", "d", "e"}))) +    1       one     a +    2       two     b +    3       three   c +    4       four    d +    5       five    e + +    > lines_to_grep = { +        [[Emily]], +        [[Chloe]], +        [[Megan]], +        [[Jessica]], +        [[Emma]], +        [[Sarah]], +        [[Elizabeth]], +        [[Sophie]], +        [[Olivia]], +        [[Lauren]] +    } + +    > each(print, grep("Em", lines_to_grep)) +    Emily +    Emma + +    > each(print, take(10, cycle(chain( +        {enumerate({"a", "b", "c"})}, +        {"one", "two", "three"})) +      )) +    0 a +    1 b +    2 c +    one +    two +    three +    0 a +    1 b +    2 c +    one + +Please note that functions support multireturn. + +Further Actions +--------------- + +- Take a look on :doc:`reference`. +- Use :ref:`genindex` to find functions by its names. +- Checkout **examples** from +  `tests/ <https://github.com/luafun/luafun/tree/master/tests>`_ directory +- Read :doc:`under_the_hood` section +- "Star" us the on GitHub_ to help the project to survive +- Make Great Software +- Have fun + +**Lua Fun**. Simple, Efficient and Functional. In Lua. With JIT. + +.. _GitHub: http://github.com/luafun/luafun diff --git a/Data/DefaultContent/Libraries/luafun/doc/index.rst b/Data/DefaultContent/Libraries/luafun/doc/index.rst new file mode 100644 index 0000000..8d1862d --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/index.rst @@ -0,0 +1,29 @@ +.. _library-index: + +############################### +  Lua Functional Library +############################### + +:Release: |version| +:Date: |today| + +.. highlight:: lua + +Contents +======== + +.. toctree:: +   :maxdepth: 2 + +   intro.rst +   getting_started.rst +   reference.rst +   under_the_hood.rst +   about.rst + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` + diff --git a/Data/DefaultContent/Libraries/luafun/doc/indexing.rst b/Data/DefaultContent/Libraries/luafun/doc/indexing.rst new file mode 100644 index 0000000..324cfbf --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/indexing.rst @@ -0,0 +1,74 @@ +Indexing +======== + +.. module:: fun + +This section contains functions to find elements by its values. + +.. function:: index(x, gen, param, state) +              iterator:index(x) + +   :param x: a value to find +   :returns: the position of the first element that equals to the **x** + +   The function returns the position of the first element in the given iterator +   which is equal (using ``==``) to the query element, or ``nil`` if there is +   no such element. + +   Examples: + +   .. code-block:: lua + +    > print(index(2, range(0))) +    nil + +    > print(index("b", {"a", "b", "c", "d", "e"})) +    2 + +.. function:: index_of(x, gen, param, state) +              iterator:index_of(x) + +   An alias for :func:`index`. + +.. function:: elem_index(x, gen, param, state) +              iterator:elem_index(x) + +   An alias for :func:`index`. + +.. function:: indexes(x, gen, param, state) +              iterator:indexes(x) + +   :param x: a value to find +   :returns: an iterator which positions of elements that equal to the **x** + +   The function returns an iterator to positions of elements which equals to  +   the query element. + +   Examples: + +   .. code-block:: lua + +    > each(print, indexes("a", {"a", "b", "c", "d", "e", "a", "b", "a", "a"})) +    1 +    6 +    9 +    10 + +   .. seealso:: :func:`filter` + +.. function:: indices(x, gen, param, state) +              iterator:indices(x) + +   An alias for :func:`indexes`. + +.. function:: elem_indexes(x, gen, param, state) +              iterator:elem_indexes(x) + +   An alias for :func:`indexes`. + +.. function:: elem_indices(x, gen, param, state) +              iterator:elem_indices(x) + +   An alias for :func:`indexes`. + + diff --git a/Data/DefaultContent/Libraries/luafun/doc/intro.rst b/Data/DefaultContent/Libraries/luafun/doc/intro.rst new file mode 100644 index 0000000..d47c431 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/intro.rst @@ -0,0 +1,69 @@ +Introduction +============ + +.. module:: fun + +**Lua Fun** is a high-performance functional programming library +designed for `LuaJIT tracing just-in-time compiler +<http://luajit.org/luajit.html>`_. + +The library provides a set of more than 50 programming primitives typically +found in languages like Standard ML, Haskell, Erlang, JavaScript, Python and +even Lisp. High-order functions such as :func:`map`, :func:`filter`, +:func:`reduce`, :func:`zip` will help you to **write simple and efficient +functional code**. + +Let's see an example: + +.. code-block:: lua +   :emphasize-lines: 2, 4 + +    -- Functional style +    require "fun" () +    n = 100 +    x = sum(map(function(x) return x^2 end, take(n, tabulate(math.sin)))) +    -- calculate sum(sin(x)^2 for x in 0..n-1) +    print(x) +    50.011981355266 + +.. code-block:: lua +   :emphasize-lines: 2, 4 + +    -- Object-oriented style +    local fun = require "fun" +    n = 100 +    x = fun.tabulate(math.sin):take(n):map(function(x) return x^2 end):sum() +    -- calculate sum(sin(x)^2 for x in 0..n-1) +    print(x) +    50.011981355266 + +**Lua Fun** takes full advantage of the innovative **tracing JIT compiler** +to achieve transcendental performance on nested functional expressions. +Functional compositions and high-order functions can be translated into +**efficient machine code**. Can you believe it? Just try to run the example above +with ``luajit -jdump`` and see what happens: + +.. code-block:: none +   :emphasize-lines: 2,14 + +    -- skip some initilization code -- +    ->LOOP: +    0bcaffd0  movsd [rsp+0x8], xmm7 +    0bcaffd6  addsd xmm4, xmm5 +    0bcaffda  ucomisd xmm6, xmm1 +    0bcaffde  jnb 0x0bca0028        ->6 +    0bcaffe4  addsd xmm6, xmm0 +    0bcaffe8  addsd xmm7, xmm0 +    0bcaffec  fld qword [rsp+0x8] +    0bcafff0  fsin +    0bcafff2  fstp qword [rsp] +    0bcafff5  movsd xmm5, [rsp] +    0bcafffa  mulsd xmm5, xmm5 +    0bcafffe  jmp 0x0bcaffd0        ->LOOP +    ---- TRACE 1 stop -> loop + + +The functional chain above was translated by LuaJIT to (!) **one machine loop** +containing just 10 CPU assembly instructions without CALL. Unbelievable! + +Readable? Efficient? Can your Python/Ruby/V8 do better? diff --git a/Data/DefaultContent/Libraries/luafun/doc/logo.png b/Data/DefaultContent/Libraries/luafun/doc/logo.png Binary files differnew file mode 100644 index 0000000..9bbeefc --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/logo.png diff --git a/Data/DefaultContent/Libraries/luafun/doc/logo.svg b/Data/DefaultContent/Libraries/luafun/doc/logo.svg new file mode 100644 index 0000000..1a28b03 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/logo.svg @@ -0,0 +1,758 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg +   xmlns:dc="http://purl.org/dc/elements/1.1/" +   xmlns:cc="http://creativecommons.org/ns#" +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +   xmlns:svg="http://www.w3.org/2000/svg" +   xmlns="http://www.w3.org/2000/svg" +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" +   width="1440" +   height="1440" +   viewBox="43 -188 937 937" +   id="svg2" +   sodipodi:version="0.32" +   inkscape:version="0.48.4 r9939" +   sodipodi:docname="logo.svg" +   inkscape:output_extension="org.inkscape.output.svg.inkscape" +   version="1.0" +   inkscape:export-filename="/mnt/data/docs/Projects/Personal/lua-functional/doc/logo.png" +   inkscape:export-xdpi="9" +   inkscape:export-ydpi="9"> +  <path +     style="fill:none;stroke:#8c8c8c;stroke-width:16.26736110999999951;stroke-linecap:butt;stroke-miterlimit:5;stroke-opacity:1;stroke-dasharray:65.06944443999999805, 130.13888889000000404;stroke-dashoffset:8.13368056000000017;stroke-linejoin:bevel" +     d="m 973.58155,283.57775 c 0,254.76511 -206.52793,461.29304 -461.29304,461.29304 -254.76515,0 -461.293094,-206.52793 -461.293094,-461.29304 0,-254.765152 206.527944,-461.2931 461.293094,-461.2931 254.76511,0 461.29304,206.527948 461.29304,461.2931 z" +     id="path4282" +     inkscape:connector-curvature="0" /> +  <path +     d="m 250.7423,53.17721 c 29.45588,-29.455878 28.94618,-82.860118 50.21763,-61.5886737 3.83457,3.8345707 18.19138,-8.2050713 20.24148,-3.2632463 93.26191,-67.02258 202.39283,-82.814868 307.85028,-49.879054 36.09059,-29.748071 38.94286,5.985418 65.3616,32.404157 18.29476,18.294756 66.53433,7.175347 57.32218,34.8338661 7.72301,6.5287109 15.21696,13.4128149 22.49443,20.6902869 139.48488,139.484874 138.85087,366.529134 -1.41522,506.795214 -13.20076,13.20077 -27.18352,25.13674 -41.78121,35.86827 0.11753,0.10989 0.24006,0.24005 0.35377,0.35376 7.32801,7.32801 -14.7794,5.93526 -22.8447,14.00055 -8.0653,8.0653 0.95061,22.54956 -6.3774,15.22155 -2.21104,-2.21104 -3.75936,-4.90791 -4.53809,-7.79318 -26.55681,15.31211 -48.92496,23.80758 -77.79886,31.78402 -12.36469,22.32067 -14.45697,24.76671 -25.49856,26.98942 -26.42114,5.29626 -16.92539,-32.7282 -39.30039,7.71415 -5.83218,10.5322 -4.69895,-9.62859 -3.70688,-20.07126 -13.58551,1.25424 -27.23228,1.76113 -40.86415,1.46978 2.43298,8.93808 -12.15669,-6.79506 -18.72531,-0.22644 -10.16421,10.16421 -10.99303,2.98276 -22.14929,-8.17351 -7.9092,-7.90919 -14.49182,12.74826 -11.76706,3.40302 -58.78521,-9.997 -115.48949,-34.70944 -164.14523,-74.19198 -12.56749,4.20346 -30.04677,-15.74065 -46.74503,-47.68522 -18.73981,-35.8665 -62.87191,-48.31168 -53.05075,-58.13285 2.27424,-2.27424 5.68495,-3.18332 9.94126,-2.91647 -59.56609,-111.47978 -59.53281,-236.82202 7.66772,-345.71641 -7.0415,-1.94668 0.60884,-14.312211 -4.54351,-19.46456 -21.27144,-21.271445 14.34543,-2.974381 43.80131,-32.430258 z" +     id="path2506" +     inkscape:connector-curvature="0" +     style="fill:#d7deda;fill-opacity:0.97647005" /> +  <path +     d="m 287.34799,21.45871 c 6.52025,-6.035087 16.97461,-2.136648 26.09844,-2.252082 21.83494,-19.90438598 48.25766,-35.746981 80.22166,-44.60753 80.62955,-22.34913 163.05343,-11.227174 228.16322,7.000201 9.31493,-10.02247 16.50699,-22.066176 26.36444,-31.266625 13.69185,-7.576755 21.2235,8.492836 23.43568,19.370001 5.21678,14.745728 20.40462,24.978509 36.11753,24.1237648 13.37752,-3.9016398 21.24609,9.4810162 11.70331,19.4281032 -0.66287,1.446206 -1.46443,2.652074 -2.34152,3.680776 19.75182,9.206453 31.14881,15.826263 31.14881,15.826263 0,0 -515.21186,34.570202 -538.20281,241.595288 0,0 3.43188,-81.53836 38.27299,-160.65582 -7.67327,-6.1893 -22.35662,-13.32826 -18.49899,-25.0117 11.3442,-3.965646 19.91446,-12.738063 28.68349,-20.549398 14.31083,-10.138919 17.14992,-28.164671 25.73394,-42.317982 0.89329,-1.838346 1.91466,-3.266548 3.09981,-4.36326 z" +     id="path2510" +     inkscape:connector-curvature="0" +     style="fill:#eef0ec;fill-opacity:0.97646999;fill-rule:evenodd" /> +  <path +     d="M 349.02532,562.43439 C 563.32391,498.23366 740.70727,495.93921 854.0712,325.4168 c 0,0 -30.7903,145.25887 -134.58891,230.61111 -0.11784,4.53991 0.12283,9.10036 -1.6651,13.26357 -5.01838,6.76194 -14.52863,7.78181 -22.309,8.18363 -1.6497,0.0325 -3.06759,-0.36899 -4.28079,-1.0257 -27.4747,17.34183 -59.17561,30.44476 -95.71065,36.50538 -0.4933,7.87185 -0.46921,16.03492 -6.07808,19.64753 -11.10367,-1.40448 -22.81156,-1.49721 -33.25929,-3.22914 -2.18379,-2.89528 -5.65439,-7.76345 -7.98455,-12.68549 -13.88598,-0.0372 -28.32681,-1.0105 -43.39817,-3.04626 -8.59541,1.89913 -17.51678,2.55753 -26.33409,2.25274 -5.85207,-0.49045 -13.89777,-0.35395 -16.09607,-7.12615 -0.16198,-0.97512 -0.14595,-2.17879 -0.14255,-3.3951 -34.76701,-8.6704 -72.39533,-22.61611 -113.19863,-42.93853 z" +     id="path2512" +     inkscape:connector-curvature="0" +     style="fill:#c4ccbd;fill-opacity:0.97646999;fill-rule:evenodd" /> +  <metadata +     id="metadata31"> +    <rdf:RDF> +      <cc:Work +         rdf:about=""> +        <dc:format>image/svg+xml</dc:format> +        <dc:type +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> +        <dc:title>generated by pstoedit</dc:title> +      </cc:Work> +    </rdf:RDF> +  </metadata> +  <defs +     id="defs29"> +    <inkscape:perspective +       sodipodi:type="inkscape:persp3d" +       inkscape:vp_x="0 : 512 : 1" +       inkscape:vp_y="0 : 1000 : 0" +       inkscape:vp_z="1024 : 512 : 1" +       inkscape:persp3d-origin="512 : 341.33333 : 1" +       id="perspective33" /> +    <marker +       id="Arrow1Lstart" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3200" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(0.8,0,0,0.8,10,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +    <marker +       id="Arrow1Mend" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3209" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(-0.4,0,0,-0.4,-4,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +    <marker +       id="Arrow1Mstart" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3206" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(0.4,0,0,0.4,4,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +    <linearGradient +       x1="342.86" +       x2="554.29" +       y1="549.51" +       gradientUnits="userSpaceOnUse" +       y2="549.51" +       id="linearGradient4218"> +      <stop +         offset="0" +         stop-color="#a40000" +         id="stop4214" /> +      <stop +         offset="1" +         stop-color="#ec0000" +         id="stop4216" /> +    </linearGradient> +    <marker +       id="Arrow1Lstart-0" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3200-5" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(0.8,0,0,0.8,10,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +    <marker +       id="Arrow1Mend-0" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3209-0" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(-0.4,0,0,-0.4,-4,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +    <marker +       id="Arrow1Mstart-7" +       style="overflow:visible" +       orient="auto" +       refY="0" +       refX="0"> +      <path +         id="path3206-2" +         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" +         transform="matrix(0.4,0,0,0.4,4,0)" +         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " /> +    </marker> +  </defs> +  <sodipodi:namedview +     inkscape:window-height="965" +     inkscape:window-width="1280" +     inkscape:pageshadow="2" +     inkscape:pageopacity="0.0" +     guidetolerance="10.0" +     gridtolerance="10.0" +     objecttolerance="10.0" +     borderopacity="1.0" +     bordercolor="#666666" +     pagecolor="#ffffff" +     id="base" +     showgrid="false" +     inkscape:zoom="0.15951335" +     inkscape:cx="1033.4421" +     inkscape:cy="994.65682" +     inkscape:window-x="-4" +     inkscape:window-y="-6" +     inkscape:current-layer="svg2" +     inkscape:window-maximized="1" +     inkscape:object-paths="true" +     inkscape:snap-nodes="false" +     inkscape:snap-bbox="true" /> +  <title +     id="title4">generated by pstoedit</title> +  <!-- generated by pstoedit version:3.50 --> +  <g +     id="g3468" +     transform="matrix(-1.2705261,1.2705261,1.26345,1.26345,389.29787,-726.3541)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path2407" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2409" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2411" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2413" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2415" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <g +     id="g3376" +     transform="translate(-366.08185,6.8571058)"> +    <path +       d="m 737.83252,197.3382 a 22.377738,22.503065 45 1 0 31.82414,-31.82414 22.377738,22.503065 45 1 0 -31.82414,31.82414 z" +       id="path2419" +       inkscape:connector-curvature="0" +       style="fill:#c4ccbe" /> +    <path +       d="m 741.55503,165.12884 c 8.41758,-6.2697 19.98231,-5.27575 27.15871,1.90065 -7.868,-4.51381 -17.33569,-3.30908 -25.09309,2.47733 -5.72604,4.28571 -9.64357,9.74465 -10.11809,16.33426 -1.44848,-7.59782 1.41229,-15.73981 8.05247,-20.71224 z" +       id="path2421" +       inkscape:connector-curvature="0" +       style="fill:#808080" /> +    <path +       d="m 739.86668,161.7634 c 8.40494,-6.28235 19.4163,-6.75654 26.5927,0.41986 -7.85529,-4.52652 -18.01732,-4.21941 -25.77471,1.56701 -5.71334,4.273 -8.96195,10.65497 -9.43647,17.24458 -1.46111,-7.61046 1.97837,-14.28437 8.61848,-19.23145 z" +       id="path2423" +       inkscape:connector-curvature="0" +       style="fill:#ececec" /> +    <path +       d="m 763.9913,206.64841 c -9.59025,4.25849 -21.20711,-0.75164 -26.58042,-9.35209 6.63445,6.15166 16.60009,8.11299 25.44186,4.19867 6.52039,-2.90692 11.09683,-8.39304 13.04034,-14.73336 -0.28768,7.74204 -4.32855,16.53348 -11.90178,19.88678 z" +       id="path2425" +       inkscape:connector-curvature="0" +       style="fill:#808080" /> +    <path +       d="m 764.67158,198.96863 c -8.98535,5.42242 -20.39493,3.31308 -26.83464,-4.5242 7.38449,5.25001 16.36606,5.71905 24.6661,0.70398 6.10451,-3.70395 11.0746,-9.50792 12.1951,-16.03599 0.70064,7.71394 -2.94481,15.55405 -10.02656,19.85621 z" +       id="path2427" +       inkscape:connector-curvature="0" +       style="fill:#ececec" /> +  </g> +  <path +     style="fill:#daded5" +     inkscape:connector-curvature="0" +     id="path2431" +     d="m 477.99202,72.998425 a 42.282553,42.519363 45 1 0 60.13146,-60.13146 42.282553,42.519363 45 0 0 -60.13146,60.13146 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2433" +     d="m 485.01368,12.160781 c 15.90837,-11.86533063 37.7585,-9.9878703 51.30269,3.556314 -14.85053,-8.5233028 -32.74662,-6.2434466 -47.4108,4.706185 -10.80453,8.075483 -18.2072,18.409357 -19.1162,30.866291 -2.73455,-14.372566 2.68043,-29.768802 15.22431,-39.12879 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2435" +     d="M 481.82607,5.7714423 C 497.73444,-6.093888 518.52808,-7.0008294 532.0722,6.5686943 517.20904,-1.9672427 498.05077,-1.4069521 483.38659,9.5426795 472.55672,17.618233 466.42893,29.658968 465.51993,42.115902 462.78538,27.743336 469.28219,15.13143 481.82607,5.7714423 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2437" +     d="m 527.4031,90.607725 c -18.11488,8.032548 -40.04514,-1.446558 -50.22427,-17.698802 12.57394,11.633756 31.35287,15.344242 48.07236,7.92374 12.34297,-5.469804 20.96209,-15.857754 24.61908,-27.828241 -0.52236,14.647727 -8.17056,31.241159 -22.46717,37.603303 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2439" +     d="m 528.68536,76.059235 c -16.96818,10.271897 -38.5337,6.290458 -50.706,-8.524535 13.97237,9.932101 30.94747,10.796922 46.60842,1.326872 11.53635,-6.987926 20.92999,-17.973519 23.04224,-30.294445 1.3403,14.579176 -5.5554,29.384068 -18.94466,37.492108 z" /> +  <path +     style="fill:#daded5" +     inkscape:connector-curvature="0" +     id="path2455" +     d="m 267.79765,192.31588 a 22.377735,22.503062 45 0 0 31.82414,-31.82414 22.377735,22.503062 45 1 0 -31.82414,31.82414 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2457" +     d="m 271.52016,160.10652 c 8.41757,-6.26971 19.98231,-5.27575 27.1587,1.90065 -7.868,-4.51381 -17.33569,-3.30909 -25.09308,2.47733 -5.72604,4.2857 -9.64358,9.74465 -10.11809,16.33426 -1.44848,-7.59782 1.41229,-15.73981 8.05247,-20.71224 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2459" +     d="m 269.8318,156.74107 c 8.40494,-6.28234 19.41631,-6.75653 26.5927,0.41986 -7.85529,-4.52651 -18.01731,-4.2194 -25.77471,1.56701 -5.71333,4.27301 -8.96195,10.65498 -9.43646,17.24459 -1.46111,-7.61046 1.97836,-14.28437 8.61847,-19.23146 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2461" +     d="m 293.95643,201.62609 c -9.59025,4.25849 -21.20712,-0.75164 -26.58043,-9.35209 6.63446,6.15166 16.6001,8.11298 25.44187,4.19867 6.52038,-2.90692 11.09682,-8.39304 13.04033,-14.73336 -0.28768,7.74204 -4.32855,16.53348 -11.90177,19.88678 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2463" +     d="m 294.6367,193.9463 c -8.98535,5.42242 -20.39493,3.31309 -26.83463,-4.52419 7.38449,5.25001 16.36605,5.71905 24.6661,0.70397 6.1045,-3.70395 11.0746,-9.50792 12.1951,-16.03598 0.70063,7.71394 -2.94482,15.55404 -10.02657,19.8562 z" /> +  <g +     id="g3418" +     transform="matrix(-0.72129759,1.0777674,1.2794218,0.85229632,104.1786,-411.8976)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path2491" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.11832,0,0,0.11832,443.45,470.93)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2493" +       d="m 481.99,504.17 c -10.93,1.6 -18.79,10.99 -18.79,21.71 2.49,-9.25 10.43,-15.43 20.51,-16.9 7.43,-1.08 14.41,0.08 19.67,4.65 -4.58,-6.77 -12.77,-10.72 -21.39,-9.46 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2495" +       d="m 480.73,500.38 c -10.93,1.6 -19.47,9.47 -19.46,20.2 2.49,-9.26 10.25,-16.62 20.33,-18.09 7.44,-1.09 14.59,1.25 19.85,5.82 -4.58,-6.77 -12.1,-9.19 -20.72,-7.93 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2497" +       d="m 496.18,551.99 c 10.29,-3.99 15.19,-16.42 12.8,-26.88 -0.37,9.58 -6.3,18.48 -15.8,22.16 -7.01,2.72 -14.49,2.02 -20.64,-1.27 5.97,5.59 15.51,9.13 23.64,5.99 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2499" +       d="m 489.95,546.74 c 10.72,-2.65 17.64,-12.76 16.6,-23.44 -1.59,9.46 -7.93,16.52 -17.82,18.97 -7.29,1.8 -15.31,1.17 -20.99,-2.87 5.21,6.3 13.75,9.43 22.21,7.34 z" /> +  </g> +  <path +     style="fill:#c4ccbe" +     inkscape:connector-curvature="0" +     id="path2568" +     d="m 554.80317,481.06024 a 44.255169,44.503024 45 1 0 62.93678,-62.93678 44.255169,44.503024 45 1 0 -62.93678,62.93678 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path2570" +     d="m 562.16164,412.16764 c 16.63208,-12.41215 39.50822,-10.44887 53.69676,3.73967 -15.53356,-8.92682 -34.26615,-6.54327 -49.61592,4.91506 -11.33773,8.45707 -19.08379,19.26068 -20.03247,32.31321 -2.8594,-15.03105 2.81103,-31.16284 15.95163,-40.96794 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2572" +     d="m 558.81014,410.69291 c 16.65741,-12.41222 38.42674,-13.35989 52.60258,0.84135 -15.5462,-8.93946 -35.61678,-8.35128 -50.96654,3.10706 -11.33773,8.45706 -17.74581,21.05605 -18.68178,34.09587 -2.87204,-15.04368 3.91784,-28.25188 17.04574,-38.04428 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path2574" +     d="m 606.5173,495.58472 c -18.95216,8.41498 -41.92007,-1.51734 -52.5659,-18.5158 13.14257,12.17697 32.82059,16.04965 50.32654,8.29754 12.90116,-5.72476 21.93976,-16.608 25.77568,-29.13646 -0.56224,15.31934 -8.55476,32.71193 -23.53632,39.35472 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2576" +     d="m 607.86479,484.26872 c -17.75506,10.75555 -40.33361,6.57422 -53.06147,-8.92339 14.59189,10.39915 32.37771,11.31239 48.76209,1.39687 12.0821,-7.33153 21.92058,-18.81248 24.13581,-31.71651 1.38907,15.26321 -5.82532,30.76583 -19.83643,39.24303 z" /> +  <path +     style="fill:#e2e4df;fill-opacity:0.97646999" +     inkscape:connector-curvature="0" +     id="path2597" +     d="M 345.06872,36.033812 A 16.011413,35.471259 55.13194 1 0 403.29514,-4.4942038 16.011413,35.471259 55.13194 0 0 345.06872,36.033812 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2599" +     d="m 369.73627,1.3206138 c 14.04909,-8.4646367 27.34393,-9.9841269 31.48295,-4.0155481 -6.64323,-3.0095266 -18.77761,0.3565111 -31.74795,8.1719766 -9.56908,5.7534627 -17.70891,12.3771497 -22.41644,19.4346937 3.02424,-7.699003 11.57672,-16.908477 22.68144,-23.5911222 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2601" +     d="m 369.8085,-1.8597031 c 14.06179,-8.4773419 27.60129,-11.4038609 31.74031,-5.4352823 -6.63052,-3.0222316 -19.02874,-0.4536537 -31.99909,7.36181179 C 359.98064,5.8202893 352.10465,13.241435 347.38449,20.286345 350.40866,12.612682 358.72912,4.8228714 369.8085,-1.8597031 z" /> +  <path +     style="fill:#808080" +     inkscape:connector-curvature="0" +     id="path2603" +     d="m 370.70498,40.074771 c -14.19589,6.589919 -25.02096,3.870805 -26.11397,-3.981407 4.14171,5.005668 14.88605,4.874306 27.97828,-1.21841 9.6669,-4.486757 18.6181,-11.290087 24.90947,-18.390063 -5.19224,8.224517 -15.5718,18.376658 -26.77378,23.58988 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2605" +     d="m 376.34077,31.811005 c -14.21171,7.717574 -26.61626,8.018279 -29.46055,1.184539 5.60183,3.89932 16.12193,2.400248 29.22969,-4.718763 9.68166,-5.234316 19.29282,-12.444922 24.72271,-19.5678322 -3.98792,7.9804292 -13.28747,17.0272822 -24.49185,23.1020562 z" /> +  <g +     id="g3369"> +    <path +       d="m 840.28494,289.31978 a 39.752241,17.207074 68.840856 0 0 32.03091,-12.58489 39.752241,17.207074 68.840856 1 0 -32.03091,12.58489 z" +       id="path2621" +       inkscape:connector-curvature="0" +       style="fill:#c4ccbe" /> +    <path +       d="m 845.41613,248.86481 c 8.36318,-0.40345 19.38864,12.22287 25.91736,29.01744 -7.3099,-13.81499 -16.43632,-21.39137 -24.16594,-21.01503 -5.67681,0.26924 -9.70339,3.94206 -10.4875,12.50902 -1.01859,-11.81806 2.13419,-20.17625 8.73608,-20.51143 z" +       id="path2623" +       inkscape:connector-curvature="0" +       style="fill:#a2ae98" /> +    <path +       d="m 843.9639,242.60999 c 8.36318,-0.40345 18.92704,9.6522 25.45576,26.44677 -7.32253,-13.82763 -17.03917,-23.29016 -24.76879,-22.91382 -5.68945,0.25661 -9.11318,5.82821 -9.89729,14.39517 -1.00588,-11.83077 2.6085,-17.61828 9.21032,-17.92812 z" +       id="path2625" +       inkscape:connector-curvature="0" +       style="fill:#ececec" /> +    <path +       d="m 864.87263,327.52783 c -9.37851,-3.50868 -20.24914,-21.67213 -25.00351,-38.67437 6.07791,14.89536 15.50768,27.27274 24.17745,30.50466 6.3916,2.37674 11.02464,-0.68961 13.19748,-7.48668 -0.64966,10.32769 -4.95465,18.42303 -12.37142,15.65639 z" +       id="path2627" +       inkscape:connector-curvature="0" +       style="fill:#a2ae98" /> +    <path +       d="m 865.90112,317.65519 c -8.86524,-1.2929 -19.68416,-15.28813 -25.47746,-32.28747 6.81418,14.38651 15.40344,23.7635 23.58479,24.95696 6.02831,0.89539 11.06693,-2.22278 12.46984,-10.06929 0.298,11.24993 -3.57367,18.43184 -10.57717,17.3998 z" +       id="path2629" +       inkscape:connector-curvature="0" +       style="fill:#ececec" /> +  </g> +  <g +     id="g3633" +     transform="matrix(-1.4688182,0.85217884,0.72653868,1.2603375,659.03127,-542.96386)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path2443" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.17954,0,0,0.17954,370.24,308.37)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2445" +       d="m 428.71,358.82 c -16.58,2.42 -28.52,16.67 -28.52,32.95 3.78,-14.04 15.83,-23.42 31.13,-25.65 11.28,-1.65 21.87,0.11 29.85,7.05 -6.94,-10.27 -19.38,-16.27 -32.46,-14.35 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2447" +       d="m 426.8,353.06 c -16.58,2.43 -29.54,14.38 -29.53,30.65 3.77,-14.04 15.56,-25.21 30.86,-27.45 11.28,-1.65 22.12,1.9 30.11,8.84 -6.95,-10.27 -18.36,-13.95 -31.44,-12.04 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path2449" +       d="m 450.24,431.38 c 15.62,-6.06 23.06,-24.92 19.44,-40.79 -0.56,14.53 -9.57,28.05 -23.99,33.63 -10.63,4.12 -21.99,3.07 -31.32,-1.92 9.06,8.47 23.54,13.85 35.87,9.08 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path2451" +       d="m 440.8,423.42 c 16.26,-4.02 26.76,-19.37 25.18,-35.57 -2.4,14.34 -12.03,25.07 -27.04,28.78 -11.06,2.73 -23.23,1.78 -31.85,-4.35 7.91,9.55 20.87,14.31 33.71,11.14 z" /> +    <g +       id="g2530" +       transform="matrix(0.10015,0,0,0.10015,386.4,347.37)"> +      <path +         style="fill:#a2ae98" +         inkscape:connector-curvature="0" +         id="path2534" +         d="m 329.56,392.23 c -32.32,4.72 -55.59,32.51 -55.59,64.23 7.37,-27.37 30.86,-45.64 60.68,-50 21.99,-3.21 42.63,0.22 58.19,13.76 -13.54,-20.04 -37.77,-31.72 -63.28,-27.99 z" /> +      <path +         style="fill:#ececec" +         inkscape:connector-curvature="0" +         id="path2536" +         d="m 325.84,381.01 c -32.32,4.73 -57.58,28.03 -57.57,59.75 7.36,-27.37 30.34,-49.15 60.16,-53.51 21.99,-3.22 43.13,3.7 58.7,17.24 -13.55,-20.03 -35.78,-27.21 -61.29,-23.48 z" /> +      <path +         style="fill:#a2ae98" +         inkscape:connector-curvature="0" +         id="path2538" +         d="m 371.54,533.68 c 30.45,-11.8 44.95,-48.58 37.88,-79.51 -1.09,28.33 -18.65,54.68 -46.75,65.56 -20.72,8.03 -42.88,5.98 -61.06,-3.75 17.66,16.52 45.89,27.01 69.93,17.7 z" /> +      <path +         style="fill:#ececec" +         inkscape:connector-curvature="0" +         id="path2540" +         d="m 353.12,518.16 c 31.71,-7.83 52.17,-37.75 49.09,-69.33 -4.68,27.96 -23.44,48.86 -52.69,56.09 -21.58,5.33 -45.3,3.49 -62.1,-8.47 15.42,18.62 40.67,27.9 65.7,21.71 z" /> +    </g> +    <g +       id="g3535" +       transform="matrix(0.072158,0,0,0.072158,413.73,346.21)"> +      <path +         style="fill:#a2ae98" +         inkscape:connector-curvature="0" +         id="path3539" +         d="m 329.56,392.23 c -32.32,4.72 -55.59,32.51 -55.59,64.23 7.37,-27.37 30.86,-45.64 60.68,-50 21.99,-3.21 42.63,0.22 58.19,13.76 -13.54,-20.04 -37.77,-31.72 -63.28,-27.99 z" /> +      <path +         style="fill:#ececec" +         inkscape:connector-curvature="0" +         id="path3541" +         d="m 325.84,381.01 c -32.32,4.73 -57.58,28.03 -57.57,59.75 7.36,-27.37 30.34,-49.15 60.16,-53.51 21.99,-3.22 43.13,3.7 58.7,17.24 -13.55,-20.03 -35.78,-27.21 -61.29,-23.48 z" /> +      <path +         style="fill:#a2ae98" +         inkscape:connector-curvature="0" +         id="path3543" +         d="m 371.54,533.68 c 30.45,-11.8 44.95,-48.58 37.88,-79.51 -1.09,28.33 -18.65,54.68 -46.75,65.56 -20.72,8.03 -42.88,5.98 -61.06,-3.75 17.66,16.52 45.89,27.01 69.93,17.7 z" /> +      <path +         style="fill:#ececec" +         inkscape:connector-curvature="0" +         id="path3545" +         d="m 353.12,518.16 c 31.71,-7.83 52.17,-37.75 49.09,-69.33 -4.68,27.96 -23.44,48.86 -52.69,56.09 -21.58,5.33 -45.3,3.49 -62.1,-8.47 15.42,18.62 40.67,27.9 65.7,21.71 z" /> +    </g> +  </g> +  <g +     id="g3356" +     transform="matrix(-0.49245592,0.49245592,0.48971322,0.48971322,514.97811,37.308113)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path3358" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3360" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3362" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3364" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3366" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <g +     id="g3368" +     transform="matrix(-0.3750593,0.3750593,0.37297044,0.37297044,648.90217,72.004088)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path3370" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3372" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3374" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3376" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3378" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <g +     id="g3380" +     transform="matrix(-0.29120458,0.29120458,0.28958274,0.28958274,601.16283,185.29122)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path3382" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3384" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3386" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3388" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3390" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <g +     id="g3394" +     transform="matrix(-0.7891535,0.42773099,0.33687688,0.62609944,622.48286,84.019995)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path3396" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3398" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3400" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3402" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3404" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <g +     id="g3406" +     transform="matrix(-0.614617,0.614617,0.77796934,0.77796934,18.355513,-189.8468)"> +    <path +       style="fill:#c4ccbe" +       inkscape:connector-curvature="0" +       id="path3408" +       d="m 551.43,460.93 a 200,200 0 1 1 -400,0 200,200 0 1 1 400,0 z" +       transform="matrix(0.13119,0,0,0.13119,265.51,542.98)" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3410" +       d="m 308.24,579.84 c -12.11,1.77 -20.84,12.18 -20.83,24.08 2.76,-10.26 11.56,-17.11 22.74,-18.75 8.24,-1.2 15.98,0.09 21.81,5.16 -5.07,-7.51 -14.16,-11.89 -23.72,-10.49 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3412" +       d="m 306.85,575.63 c -12.12,1.78 -21.59,10.51 -21.58,22.4 2.76,-10.26 11.37,-18.42 22.55,-20.06 8.24,-1.21 16.16,1.39 22,6.46 -5.08,-7.5 -13.41,-10.19 -22.97,-8.8 z" /> +    <path +       style="fill:#a2ae98" +       inkscape:connector-curvature="0" +       id="path3414" +       d="m 323.98,632.86 c 11.41,-4.43 16.84,-18.21 14.2,-29.8 -0.41,10.61 -6.99,20.49 -17.53,24.57 -7.76,3.01 -16.07,2.24 -22.89,-1.41 6.62,6.2 17.2,10.13 26.22,6.64 z" /> +    <path +       style="fill:#ececec" +       inkscape:connector-curvature="0" +       id="path3416" +       d="m 317.07,627.04 c 11.89,-2.93 19.56,-14.15 18.4,-25.98 -1.75,10.47 -8.78,18.31 -19.75,21.02 -8.09,2 -16.98,1.31 -23.27,-3.18 5.78,6.98 15.24,10.46 24.62,8.14 z" /> +  </g> +  <path +     style="fill:#ffffff;fill-opacity:1" +     inkscape:connector-curvature="0" +     id="path2385" +     d="m 582.68118,214.50453 a 109.15131,109.76263 45 0 0 155.2278,-155.2278 109.15131,109.76263 45 1 0 -155.2278,155.2278 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path2387" +     d="m 600.83503,57.45593 c 41.03425,-30.62342 97.4773,-25.78914 132.46223,9.19579 -38.35331,-22.01434 -84.55112,-16.12058 -122.41132,12.1374 -27.91905,20.84373 -47.03623,47.51633 -49.36863,79.69142 -7.06749,-37.10273 6.9296,-76.84891 39.31771,-101.02461 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path2392" +     d="M 592.59505,40.95755 C 633.64194,10.34676 687.34298,8.0176 722.3152,43.01523 683.9619,21.0009 634.46968,22.45676 596.59684,50.7021 c -27.93169,20.83111 -43.74174,51.92889 -46.07413,84.10398 -7.06748,-37.10273 9.6716,-69.68547 42.07235,-93.84853 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path2394" +     d="m 580.58492,213.07206 c 8.08779,7.47793 17.18006,13.6734 26.92236,18.48605 -3.04283,0.74335 -5.99806,1.87921 -8.8151,3.43279 -6.9501,-6.54354 -13.08707,-13.90022 -18.10726,-21.91884 z m 11.37155,42.95682 c 10.47612,9.7138 26.178,12.81206 40.11936,6.62829 10.15048,-5.2483 18.46379,-10.47879 10.19272,-20.37614 2.97626,0.4098 5.97821,0.69282 8.98044,0.87448 0.53553,-1.21779 1.02052,-2.48613 1.40416,-3.75418 -0.0415,1.25443 -0.19716,2.54718 -0.36544,3.8273 17.41843,0.90159 35.34213,-2.18921 52.4168,-9.76274 31.8279,-14.11433 54.15086,-40.9099 63.58742,-71.79984 -1.37249,37.78512 -21.11769,80.65145 -58.04517,97.03524 -19.04095,8.45324 -39.69533,9.3978 -59.28244,4.72667 -5.28716,-3.15268 -5.27279,0.77491 -17.08681,7.38351 -15.12111,6.70654 -33.44481,-1.22426 -41.92104,-14.78259 z" /> +  <path +     style="fill:#ececec" +     d="m 647.03634,236.32559 c 22.88072,-7.61067 34.7814,-10.09358 61.83807,-21.55927 32.80025,-22.03566 47.53189,-52.61097 56.96846,-83.50091 -1.37249,37.78512 -21.11769,80.65145 -58.04517,97.03524 -40.30058,17.76825 -64.67554,8.61159 -60.76136,8.02494 z" +     id="path2528" +     inkscape:connector-curvature="0" +     sodipodi:nodetypes="ccccc" /> +  <path +     style="fill:#c4ccbe" +     inkscape:connector-curvature="0" +     id="path3289" +     d="M 610.66836,131.5605 A 26.358341,28.663196 45 1 0 651.20424,91.02462 26.358341,28.663196 45 0 0 610.66836,131.5605 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path3291" +     d="m 616.77879,91.89856 c 10.61452,-8.08763 24.73949,-7.43023 33.19198,1.02225 -9.42461,-5.15562 -21.08619,-3.22259 -30.87545,4.24191 -7.23719,5.51889 -12.28634,12.41268 -13.19587,20.52388 -1.40584,-9.25768 2.49938,-19.37907 10.87933,-25.78804 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path3293" +     d="m 614.86428,87.84957 c 10.6146,-8.11296 24.13636,-9.22765 32.57614,-0.76246 -9.42458,-5.15563 -21.86868,-4.31001 -31.67062,3.16719 -7.22448,5.50619 -11.50378,13.47476 -12.40061,21.57326 -1.41855,-9.24498 3.11522,-17.59436 11.49509,-23.97799 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path3295" +     d="m 642.2833,141.72094 c -11.96344,5.67146 -25.96062,0.0852 -32.14013,-10.18545 7.84779,7.21253 19.96738,9.14251 30.99205,3.90444 8.13211,-3.86165 14.00499,-10.82109 16.67489,-18.67114 -0.71071,9.50432 -6.08796,20.46602 -15.52681,24.95215 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path3297" +     d="m 643.47532,132.26595 c -11.25789,7.08851 -25.15091,5.03679 -32.66349,-4.25452 8.78849,6.09496 19.79814,6.22892 30.193,-0.32504 7.65334,-4.82322 14.03414,-12.18951 15.71636,-20.23952 0.49311,9.43761 -4.34869,19.20686 -13.24588,24.81908 z" /> +  <path +     id="path2255-5" +     style="fill:#e99b4a;fill-opacity:1;fill-rule:evenodd;stroke:none" +     d="m 457.6962,165.34157 0,36.7642 26.42994,0 10.85514,38.38614 -80.70573,143.27223 39.64493,0 57.57952,-97.317 37.75707,109.2113 59.46737,-21.62602 -9.43926,-33.52027 -27.37389,9.73169 -64.18701,-184.90228 -50.02808,0 z" +     inkscape:connector-curvature="0" /> +  <path +     style="fill:#fbfbf7;fill-opacity:1" +     inkscape:connector-curvature="0" +     id="path2524" +     d="m 592.65652,257.36261 a 35.279776,35.477364 45 1 0 50.17256,-50.17257 35.279776,35.477364 45 0 0 -50.17256,50.17257 z" /> +  <path +     style="fill:#a2ae98" +     inkscape:connector-curvature="0" +     id="path3425" +     d="m 616.23428,205.2186 c 13.09467,-2.43115 25.36479,4.57898 29.04525,15.95884 -6.04399,-8.88998 -17.2975,-12.4441 -29.39072,-10.20579 -8.91149,1.65929 -16.53681,5.51952 -21.01564,12.34837 2.93891,-8.90239 11.00456,-16.1847 21.36112,-18.10142 z" /> +  <path +     style="fill:#ececec" +     inkscape:connector-curvature="0" +     id="path3427" +     d="m 610.64453,201.53464 c 12.32921,-5.07701 25.66369,-2.64363 31.61487,7.72897 -7.74581,-7.44087 -19.97811,-9.83931 -31.35599,-5.15773 -8.40972,3.45699 -14.5983,10.04989 -17.58429,17.6601 1.05227,-9.31523 7.58384,-16.22583 17.3254,-20.23134 z" /> +  <path +     style="fill:#ececec" +     d="m 605.76803,254.22989 c 10.47613,9.7138 31.60604,-2.72358 41.76766,-16.49867 0,0 5.70421,-0.45504 -8.04842,19.26791 -4.03054,5.09183 -13.8578,17.09222 -33.71924,-2.76921 z" +     id="path2528-8" +     inkscape:connector-curvature="0" +     sodipodi:nodetypes="ccccc" /> +  <g +     id="g5190"> +    <path +       sodipodi:nodetypes="ccccc" +       inkscape:connector-curvature="0" +       id="path5137" +       d="m 937.14068,-7.7167955 -6.08391,4.8107089 240.54523,75.3549016 -0.4075,-2.918744 z" +       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#787878;fill-opacity:1;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" /> +    <path +       inkscape:connector-curvature="0" +       id="path4150" +       d="m 818.94116,5.2026955 c -0.29229,-0.1153077 -2.35517,0.3054801 -2.35517,0.3054801 l -2.95279,8.2073614 c 3.07091,7.617342 6.78428,15.488208 10.37968,23.312208 l 2.11411,1.212694 c 36.4223,68.353331 55.46431,109.598621 112.01396,203.717571 l 1.16047,-0.71178 C 898.0779,174.3516 828.9688,34.749076 828.9688,34.749076 c 0.25827,-0.0587 0.72945,-0.505187 0.57121,-0.985939 0,0 -9.09478,-20.220272 -9.09478,-20.220272 l -1.50192,-8.3424334 z" +       style="fill:#777777;fill-opacity:1;stroke:none" /> +    <path +       inkscape:connector-curvature="0" +       id="path4174" +       d="m 917.62673,23.735291 c 0,0 121.77467,112.372819 162.66457,147.374429 l 1.1896,-1.52322 C 1059.6975,152.95891 927.87133,27.227356 927.87133,27.227356 l 0.6206,-0.823456 -6.43964,-5.619804 c -1.08179,0.740429 -3.17482,1.165447 -4.10245,0.823639 l -0.32512,2.124011 z" +       style="fill:#777777;fill-opacity:1;stroke:none" /> +    <path +       sodipodi:nodetypes="ccccc" +       inkscape:connector-curvature="0" +       id="path4176" +       d="m 1151.4299,-134.49903 -0.2145,-2.39061 c -32.5473,1.6736 -281.83741,34.93472 -281.83741,34.93472 l -4.34575,0.75128 c -5.6179,16.905635 220.66866,-28.17687 286.39766,-33.29539 z" +       style="fill:#777777;fill-opacity:1;stroke:none" /> +    <path +       inkscape:connector-curvature="0" +       id="path4178" +       d="m 930.55319,-32.548475 c 0,0 157.83041,3.755633 226.56811,10.003361 l 9.2776,-0.130698 0.6034,-1.489176 -1.422,-0.162356 c -7.6921,-0.272863 -237.88276,-15.118424 -237.88276,-15.118424 1.08971,1.203513 2.11854,2.89347 2.85841,6.898525 z" +       style="fill:#777777;fill-opacity:1;stroke:none" /> +    <path +       transform="matrix(0.41485831,-0.01993231,0.02026452,0.42177261,736.80359,313.50603)" +       d="m 576.27704,-798.61469 a 208.34631,208.34631 0 1 1 -416.69263,0 208.34631,208.34631 0 1 1 416.69263,0 z" +       sodipodi:ry="208.34631" +       sodipodi:rx="208.34631" +       sodipodi:cy="-798.61469" +       sodipodi:cx="367.93073" +       id="path4616" +       style="fill:#777777;fill-opacity:1;fill-rule:nonzero;stroke:none" +       sodipodi:type="arc" /> +    <path +       transform="matrix(0.50190154,0,0,0.50190154,243.91433,-188.39601)" +       d="m 1256.725,224.69398 a 35.47731,35.47731 0 1 1 -70.9546,0 35.47731,35.47731 0 1 1 70.9546,0 z" +       sodipodi:ry="35.47731" +       sodipodi:rx="35.47731" +       sodipodi:cy="224.69398" +       sodipodi:cx="1221.2477" +       id="path5111" +       style="fill:#ececec;fill-opacity:0.97647005;fill-rule:nonzero;stroke:none" +       sodipodi:type="arc" /> +    <path +       inkscape:transform-center-y="254.9588" +       inkscape:transform-center-x="22.693568" +       sodipodi:nodetypes="ccccc" +       inkscape:connector-curvature="0" +       id="rect5145" +       d="m 1176.6252,68.80541 c 0.9274,2.633527 -1.1442,6.475631 -3.3527,7.655075 -9.7843,-1.500395 -20.7497,-3.890343 -30.5339,-5.390738 3.2747,-6.559499 4.2071,-9.966553 6.4,-17.247252 8.4686,5.868813 19.0182,9.114104 27.4866,14.982915 z" +       style="fill:#787878;fill-opacity:1;fill-rule:nonzero;stroke:none" /> +  </g> +</svg> diff --git a/Data/DefaultContent/Libraries/luafun/doc/make.bat b/Data/DefaultContent/Libraries/luafun/doc/make.bat new file mode 100644 index 0000000..0f68e89 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/make.bat @@ -0,0 +1,190 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( +	set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( +	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( +	:help +	echo.Please use `make ^<target^>` where ^<target^> is one of +	echo.  html       to make standalone HTML files +	echo.  dirhtml    to make HTML files named index.html in directories +	echo.  singlehtml to make a single large HTML file +	echo.  pickle     to make pickle files +	echo.  json       to make JSON files +	echo.  htmlhelp   to make HTML files and a HTML help project +	echo.  qthelp     to make HTML files and a qthelp project +	echo.  devhelp    to make HTML files and a Devhelp project +	echo.  epub       to make an epub +	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter +	echo.  text       to make text files +	echo.  man        to make manual pages +	echo.  texinfo    to make Texinfo files +	echo.  gettext    to make PO message catalogs +	echo.  changes    to make an overview over all changed/added/deprecated items +	echo.  linkcheck  to check all external links for integrity +	echo.  doctest    to run all doctests embedded in the documentation if enabled +	goto end +) + +if "%1" == "clean" ( +	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i +	del /q /s %BUILDDIR%\* +	goto end +) + +if "%1" == "html" ( +	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The HTML pages are in %BUILDDIR%/html. +	goto end +) + +if "%1" == "dirhtml" ( +	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. +	goto end +) + +if "%1" == "singlehtml" ( +	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. +	goto end +) + +if "%1" == "pickle" ( +	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished; now you can process the pickle files. +	goto end +) + +if "%1" == "json" ( +	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished; now you can process the JSON files. +	goto end +) + +if "%1" == "htmlhelp" ( +	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. +	goto end +) + +if "%1" == "qthelp" ( +	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: +	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\LuaFunctional.qhcp +	echo.To view the help file: +	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\LuaFunctional.ghc +	goto end +) + +if "%1" == "devhelp" ( +	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. +	goto end +) + +if "%1" == "epub" ( +	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The epub file is in %BUILDDIR%/epub. +	goto end +) + +if "%1" == "latex" ( +	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. +	goto end +) + +if "%1" == "text" ( +	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The text files are in %BUILDDIR%/text. +	goto end +) + +if "%1" == "man" ( +	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The manual pages are in %BUILDDIR%/man. +	goto end +) + +if "%1" == "texinfo" ( +	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. +	goto end +) + +if "%1" == "gettext" ( +	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale +	if errorlevel 1 exit /b 1 +	echo. +	echo.Build finished. The message catalogs are in %BUILDDIR%/locale. +	goto end +) + +if "%1" == "changes" ( +	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes +	if errorlevel 1 exit /b 1 +	echo. +	echo.The overview file is in %BUILDDIR%/changes. +	goto end +) + +if "%1" == "linkcheck" ( +	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck +	if errorlevel 1 exit /b 1 +	echo. +	echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. +	goto end +) + +if "%1" == "doctest" ( +	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest +	if errorlevel 1 exit /b 1 +	echo. +	echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. +	goto end +) + +:end diff --git a/Data/DefaultContent/Libraries/luafun/doc/operators.rst b/Data/DefaultContent/Libraries/luafun/doc/operators.rst new file mode 100644 index 0000000..2f3edd4 --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/operators.rst @@ -0,0 +1,203 @@ +Operators +========= + +.. module:: fun.operator + +This auxiliary module exports a set of Lua operators as intrinsic functions +to use with the library high-order primitives. + +.. contents:: + +.. note:: **op** can be used as a shortcut to **operator**. + +Comparison operators +-------------------- + +.. seealso:: `Lua Relational Operators +              <http://www.lua.org/manual/5.2/manual.html#3.4.3>`_ + +.. function:: le(a, b) + +   :returns: **a** <= **b** + +.. function:: lt(a, b) + +   :returns: **a** < **b** + +.. function:: eq(a, b) + +   :returns: **a** == **b** + +.. function:: ne(a, b) + +   :returns: **a** ~= **b** + +.. function:: ge(a, b) + +   :returns: **a** >= **b** + +.. function:: gt(a, b) + +   :returns: **a** > **b** + +Arithmetic operators +-------------------- + +.. seealso:: `Lua Arithmetic Operators  +              <http://www.lua.org/manual/5.2/manual.html#3.4.1>`_ + +.. function:: add(a, b) + +   :returns: **a** + **b** + +.. function:: div(a, b) + +    An alias for :func:`truediv`. + +.. function:: truediv(a, b) + +   :returns: **a** / **b** + +   Performs "true" float division. +   Examples: + +   .. code-block:: lua + +    > print(operator.div(10, 3)) +    3.3333333333333 +    > print(operator.div(-10, 3)) +    -3.3333333333333 + +.. function:: floordiv(a, b) + +   :returns: math.floor(**a** / **b**) + +   Performs division where a result is rounded down. Examples: + +   .. code-block:: lua + +    > print(operator.floordiv(10, 3)) +    3 +    > print(operator.floordiv(12, 3)) +    4 +    > print(operator.floordiv(-10, 3)) +    -4 +    > print(operator.floordiv(-12, 3)) +    -4 + +.. function:: intdiv(a, b) + +   Performs C-like integer division. + +   Equvalent to: + +   .. code-block:: lua + +    function(a, b) +        local q = a / b +        if a >= 0 then return math.floor(q) else return math.ceil(q) end +    end + +   Examples: + +   .. code-block:: lua + +    > print(operator.floordiv(10, 3)) +    3 +    > print(operator.floordiv(12, 3)) +    4 +    > print(operator.floordiv(-10, 3)) +    -3 +    > print(operator.floordiv(-12, 3)) +    -4 + +.. function:: mod(a, b) + +   :returns: **a** % **b** + +   .. note:: Result has same sign as **divisor**. Modulo in Lua is defined as +             ``a % b == a - math.floor(a/b)*b``. + +   Examples: + +   .. code-block:: lua +    :emphasize-lines: 5-6 + +    > print(operator.mod(10, 2)) +    0 +    > print(operator.mod(10, 3)) +    2 +    print(operator.mod(-10, 3)) +    2 -- == -1 in C, Java, JavaScript and but not in Lua, Python, Haskell! + +.. function:: neq(a) + +   :returns: -**a** + +.. function:: unm(a) + +   Unary minus. An alias for :func:`neq`. + +.. function:: pow(a, b) + +   :returns: math.pow(**a**, **b**) + +.. function:: sub(a, b) + +   :returns: **a** - **b** + +String operators +---------------- + +.. seealso:: `Lua Concatenation Operator +              <http://www.lua.org/manual/5.2/manual.html#3.4.5>`_ + +.. function:: concat(a, b) + +   :returns: **a** .. **b** + +.. function:: len(a) + +   :returns: # **a** + +.. function:: length(a) + +   An alias for :func:`len`. + +Logical operators +----------------- + +.. seealso:: `Lua Logical Operators +              <http://www.lua.org/manual/5.2/manual.html#3.4.4>`_ + +.. function:: land(a, b) + +   :returns: **a** and **b** + +.. function:: lor(a, b) + +   :returns: **a** or **b** + +.. function:: lnot(a) + +   :returns: not **a** + +.. function:: truth(a) + +   :returns: not not **a** + +   Return ``true`` if **a** is true, and ``false`` otherwise. Examples: + +   .. code-block:: lua + +    > print(operator.truth(1)) +    true +    > print(operator.truth(0)) +    true -- It is Lua, baby! +    > print(operator.truth(nil)) +    false +    > print(operator.truth("")) +    true +    > print(operator.truth({})) +    true + diff --git a/Data/DefaultContent/Libraries/luafun/doc/reducing.rst b/Data/DefaultContent/Libraries/luafun/doc/reducing.rst new file mode 100644 index 0000000..f7b89da --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/reducing.rst @@ -0,0 +1,323 @@ +Reducing +======== + +.. module:: fun + +The section contains functions to analyze iteration values and recombine +through use of a given combining operation the results of recursively processing +its constituent parts, building up a return value + +.. contents:: + +.. note:: An attempt to use infinity iterators with the most function from +          the module causes an infinite loop. + +Folds +----- + +.. function:: foldl(accfun, initval, gen, param, state) +              iterator:reduce(accfun, initval) + +   :param accfun: an accumulating function +   :type  param: (function(prevval, ...) -> val) +   :param initval: an initial value that passed to **accfun** on the first +          iteration + +   The function reduces the iterator from left to right using the binary +   operator **accfun** and the initial value **initval**. +   Equivalent to:: + +        local val = initval +        for _k, ... in gen, param, state do +            val = accfun(val, ...) +        end +        return val + +   Examples: + +   .. code-block:: lua + +    > print(foldl(function(acc, x) return acc + x end, 0, range(5))) +    15 + +    > print(foldl(operator.add, 0, range(5))) +    15 + +    > print(foldl(function(acc, x, y) return acc + x * y; end, 0, +        zip(range(1, 5), {4, 3, 2, 1}))) +    20 + +.. function:: reduce(accfun, initval, gen, param, state) +              iterator:reduce(accfun, initval) + +   An alias to :func:`foldl`. + +.. function:: length(gen, param, state) +              iterator:length() + +   :returns: a number of elements in ``gen, param, state`` iterator. + +   Return a number of elements in ``gen, param, state`` iterator. +   This function is equivalent to ``#obj`` for basic array and string iterators. + +   Examples: + +   .. code-block:: lua + +    > print(length({"a", "b", "c", "d", "e"})) +    5 + +    > print(length({})) +    0 + +    > print(length(range(0))) +    0 + +   .. warning:: An attempt to call this function on an infinite iterator will +                result an infinite loop. + +   .. note:: This function has ``O(n)`` complexity for all iterators except +             basic array and string iterators. + +.. function:: totable(gen, param, state) + +   :returns: a new table (array) from iterated values. + +   The function reduces the iterator from left to right using ``table.insert``. + +   Examples: + +   .. code-block:: lua + +    > local tab = totable("abcdef") +    > print(type(tab), #tab) +    table 6 +    > each(print, tab) +    a +    b +    c +    d +    e +    f + +.. function:: tomap(gen, param, state) + +   :returns: a new table (map) from iterated values. + +   The function reduces the iterator from left to right using +   ``tab[val1] = val2`` expression. + +   Examples: + +   .. code-block:: lua + +    > local tab = tomap(zip(range(1, 7), 'abcdef')) +    > print(type(tab), #tab) +    table   6 +    > each(print, iter(tab)) +    a +    b +    c +    d +    e +    f + +Predicates +---------- + +.. function:: is_prefix_of(iterator1, iterator2) +              iterator1:is_prefix_of(iterator2) + +   The function takes two iterators and returns ``true`` if the first iterator +   is a prefix of the second.  + +   Examples: + +   .. code-block:: lua + +    > print(is_prefix_of({"a"}, {"a", "b", "c"})) +    true + +    > print(is_prefix_of(range(6), range(5))) +    false + +.. function:: is_null(gen, param, state) +              iterator:is_null() + +   :returns: true when `gen, param, state`` iterator is empty or finished. +   :returns: false otherwise. + +   Example:: + +    > print(is_null({"a", "b", "c", "d", "e"})) +    false + +    > print(is_null({})) +    true + +    > print(is_null(range(0))) +    true + +.. function:: all(predicate, gen, param, state) +              iterator:all(predicate) + +   :param predicate: a predicate + +   Returns true if all return values of iterator satisfy the **predicate**. + +   Examples: + +   .. code-block:: lua + +    > print(all(function(x) return x end, {true, true, true, true})) +    true + +    > print(all(function(x) return x end, {true, true, true, false})) +    false + +.. function:: every(predicate, gen, param, state) + +   An alias for :func:`all`. + +.. function:: any(predicate, gen, param, state) +              iterator:any(predicate) + +   :param predicate: a predicate + +   Returns ``true`` if at least one return values of iterator satisfy the +   **predicate**. The iteration stops on the first such value. Therefore, +   infinity iterators that have at least one satisfying value might work. + +   Examples: + +   .. code-block:: lua + +    > print(any(function(x) return x end, {false, false, false, false})) +    false + +    > print(any(function(x) return x end, {false, false, false, true})) +    true + +.. function:: some(predicate, gen, param, state) + +   An alias for :func:`any`. + +Special folds +------------- + +.. function:: sum(gen, param, state) +              iterator:sum() + +   Sum up all iteration values. An optimized alias for:: + +       foldl(operator.add, 0, gen, param, state) + +   For an empty iterator ``0`` is returned. + +   Examples: + +   .. code-block:: lua + +    > print(sum(range(5))) +    15 + +.. function:: product(gen, param, state) +              iterator:product() + +   Multiply all iteration values. An optimized alias for:: + +       foldl(operator.mul, 1, gen, param, state) + +   For an empty iterator ``1`` is returned. + +   Examples: + +   .. code-block:: lua + +    > print(product(range(1, 5))) +    120 + +.. function:: min(gen, param, state) +              iterator:min() + +   Return a minimum value from the iterator using :func:`operator.min` or ``<`` +   for numbers and other types respectivly. The iterator must be +   non-null, otherwise an error is raised. + +   Examples: + +   .. code-block:: lua + +    > print(min(range(1, 10, 1))) +    1 + +    > print(min({"f", "d", "c", "d", "e"})) +    c + +    > print(min({})) +    error: min: iterator is empty + +.. function:: minimum(gen, param, state) + +   An alias for :func:`min`. + +.. function:: min_by(cmp, gen, param, state) +              iterator:min_by(cmp) + +   Return a minimum value from the iterator using the **cmp** as a ``<`` +   operator. The iterator must be non-null, otherwise an error is raised. + +   Examples: + +   .. code-block:: lua + +    > function min_cmp(a, b) if -a < -b then return a else return b end end +    > print(min_by(min_cmp, range(1, 10, 1))) +    9 + +.. function:: minimum_by(cmp, gen, param, state) + +   An alias for :func:`min_by`. + +.. function:: max(gen, param, state) +              iterator:max() + +   Return a maximum value from the iterator using :func:`operator.max` or ``>`` +   for numbers and other types respectivly. + +   The iterator must be non-null, otherwise an error is raised. + +   Examples: + +   .. code-block:: lua + +    > print(max(range(1, 10, 1))) +    9 + +    > print(max({"f", "d", "c", "d", "e"})) +    f + +    > print(max({})) +    error: max: iterator is empty + +.. function:: maximum(gen, param, state) + +   An alias for :func:`max`. + +.. function:: max_by(cmp, gen, param, state) +              iterator:max_by(cmp) + +   Return a maximum value from the iterator using the **cmp** as a `>` +   operator. The iterator must be non-null, otherwise an error is raised. + +   Examples: + +   .. code-block:: lua + +    > function max_cmp(a, b) if -a > -b then return a else return b end end +    > print(max_by(max_cmp, range(1, 10, 1))) +    1 + +.. function:: maximum_by(cmp, gen, param, state) + +   An alias for :func:`max_by`. diff --git a/Data/DefaultContent/Libraries/luafun/doc/reference.rst b/Data/DefaultContent/Libraries/luafun/doc/reference.rst new file mode 100644 index 0000000..f1f9cfc --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/reference.rst @@ -0,0 +1,14 @@ +API Reference +============= + +.. toctree:: + +   basic.rst +   generators.rst +   slicing.rst +   indexing.rst +   filtering.rst +   reducing.rst +   transformations.rst +   compositions.rst +   operators.rst
\ No newline at end of file diff --git a/Data/DefaultContent/Libraries/luafun/doc/slicing.rst b/Data/DefaultContent/Libraries/luafun/doc/slicing.rst new file mode 100644 index 0000000..1af642f --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/slicing.rst @@ -0,0 +1,246 @@ +Slicing +======= + +.. module:: fun + +This section contains functions to make subsequences from iterators. + +Basic +----- + +.. function:: nth(n, gen, param, state) +              iterator:nth(n) + +   :param uint n: a sequential number (indexed starting from ``1``, +                  like Lua tables) +   :returns: **n**-th element of ``gen, param, state`` iterator + +   This function returns the **n**-th element of ``gen, param, state`` +   iterator. If the iterator does not have **n** items then ``nil`` is returned. + +   Examples: + +   .. code-block:: lua + +    > print(nth(2, range(5))) +    2 + +    > print(nth(10, range(5))) +    nil + +    > print(nth(2, {"a", "b", "c", "d", "e"})) +    b + +    > print(nth(2, enumerate({"a", "b", "c", "d", "e"}))) +    2 b + +   This function is optimized for basic array and string iterators and has +   ``O(1)`` complexity for these cases. + +.. function:: head(gen, param, state) +              iterator:head() + +   :returns: a first element of ``gen, param, state`` iterator + +   Extract the first element of ``gen, param, state`` iterator. +   If the iterator is empty then an error is raised. + +   Examples: + +   .. code-block:: lua + +    > print(head({"a", "b", "c", "d", "e"})) +    a +    > print(head({})) +    error: head: iterator is empty +    > print(head(range(0))) +    error: head: iterator is empty +    > print(head(enumerate({"a", "b"}))) +    1 a + +.. function:: car(gen, param, state) + +   An alias for :func:`head`. + +.. function:: tail(gen, param, state) +              iterator:tail() + +   :returns: ``gen, param, state`` iterator without a first element + +   Return a copy of ``gen, param, state`` iterator without its first element. +   If the iterator is empty then an empty iterator is returned. + +   Examples: + +   .. code-block:: lua + +    > each(print, tail({"a", "b", "c", "d", "e"})) +    b +    c +    d +    e +    > each(print, tail({})) +    > each(print, tail(range(0))) +    > each(print, tail(enumerate({"a", "b", "c"}))) +    2 b +    3 c + +.. function:: cdr(gen, param, state) + +   An alias for :func:`tail`. + +Subsequences +------------ + +.. function:: take_n(n, gen, param, state) +              iterator:take_n(n) + +   :param n: a number of elements to take +   :type  n: uint +   :returns: an iterator on the subsequence of first **n** elements + +   Examples: + +   .. code-block:: lua + +    > each(print, take_n(5, range(10))) +    1 +    2 +    3 +    4 +    5 + +    > each(print, take_n(5, enumerate(duplicate('x')))) +    1 x +    2 x +    3 x +    4 x +    5 x + +.. function:: take_while(predicate, gen, param, state) +              iterator:take_while(predicate) + +   :type predicate: function(...) -> bool +   :returns: an iterator on the longest prefix of ``gen, param, state`` +             elements that satisfy **predicate**. + +   Examples: + +   .. code-block:: lua + +    > each(print, take_while(function(x) return x < 5 end, range(10))) +    1 +    2 +    3 +    4 + +    > each(print, take_while(function(i, a) return i ~=a end, +        enumerate({5, 3, 4, 4, 2}))) +    1       5 +    2       3 +    3       4 + +   .. seealso:: :func:`filter` + +.. function:: take(n_or_predicate, gen, param, state) +              iterator:take(n_or_predicate) + +   An alias for :func:`take_n` and :func:`take_while` that autodetects +   required function based on **n_or_predicate** type. + +.. function:: drop_n(n, gen, param, state) +              iterator:drop_n(n) + +   :param n: the number of elements to drop +   :type  n: uint +   :returns: ``gen, param, state`` iterator after skipping first **n** +             elements + +   Examples: + +   .. code-block:: lua + +    > each(print, drop_n(2, range(5))) +    3 +    4 +    5 + +    > each(print, drop_n(2, enumerate({'a', 'b', 'c', 'd', 'e'}))) +    3       c +    4       d +    5       e + +.. function:: drop_while(predicate, gen, param, state) +              iterator:drop_while(predicate) + +   :type predicate: function(...) -> bool +   :returns: ``gen, param, state`` after skipping the longest prefix +             of  elements that satisfy **predicate**. + +   Examples: + +   .. code-block:: lua + +    > each(print, drop_while(function(x) return x < 5 end, range(10))) +    5 +    6 +    7 +    8 +    9 +    10 + +   .. seealso:: :func:`filter` + +.. function:: drop(n_or_predicate, gen, param, state) +              iterator:drop(n_or_predicate) + +   An alias for :func:`drop_n` and :func:`drop_while` that autodetects +   required function based on **n_or_predicate** type. + + +.. function:: span(n_or_predicate, gen, param, state) +              iterator:span(n_or_predicate) + +   :type n_or_predicate: function(...) -> bool or uint +   :returns: iterator, iterator + +   Return an iterator pair where the first operates on the longest prefix +   (possibly empty) of ``gen, param, state`` iterator of elements that +   satisfy **predicate** and second operates the remainder of +   ``gen, param, state`` iterator.  +   Equivalent to: + +   .. code-block:: lua + +       return take(n_or_predicate, gen, param, state), +              drop(n_or_predicate, gen, param, state); + +   Examples: + +   .. code-block:: lua + +    > each(print, zip(span(function(x) return x < 5 end, range(10)))) +    1       5 +    2       6 +    3       7 +    4       8 + +    > each(print, zip(span(5, range(10)))) +    1       6 +    2       7 +    3       8 +    4       9 +    5       10 + +   .. note:: ``gen, param, state`` must be pure functional to work properly +             with the function. + +   .. seealso:: :func:`partition` + +.. function:: split(n_or_predicate, gen, param, state) + +    An alias for :func:`span`. + +.. function:: split_at(n, gen, param, state) + +    An alias for :func:`span`. diff --git a/Data/DefaultContent/Libraries/luafun/doc/transformations.rst b/Data/DefaultContent/Libraries/luafun/doc/transformations.rst new file mode 100644 index 0000000..e446d2f --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/transformations.rst @@ -0,0 +1,87 @@ +Transformations +=============== + +.. module:: fun + +.. function:: map(fun, gen, param, state) +              iterator:map(fun) + +   :param fun: a function to apply +   :type  fun: (function(...) -> ...) +   :returns: a new iterator + +   Return a new iterator by applying the **fun** to each element of +   ``gen, param, state`` iterator. The mapping is performed on the fly +   and no values are buffered. + +   Examples: + +   .. code-block:: lua + +    > each(print, map(function(x) return 2 * x end, range(4))) +    2 +    4 +    6 +    8 + +    fun = function(...) return 'map', ... end +    > each(print, map(fun, range(4))) +    map 1 +    map 2 +    map 3 +    map 4 + +.. function:: enumerate(gen, param, state) +              iterator:enumerate() + +   :returns: a new iterator + +   Return a new iterator by enumerating all elements of the +   ``gen, param, state`` iterator starting from ``1``. The mapping is performed +   on the fly and no values are buffered. + +   Examples: + +   .. code-block:: lua + +    > each(print, enumerate({"a", "b", "c", "d", "e"})) +    1 a +    2 b +    3 c +    4 d +    5 e + +    > each(print, enumerate(zip({"one", "two", "three", "four", "five"}, +        {"a", "b", "c", "d", "e"}))) +    1 one a +    2 two b +    3 three c +    4 four d +    5 five e + +.. function:: intersperse(x, gen, param, state) +              iterator:intersperse(x) + +   :type x: any +   :returns: a new iterator + +   Return a new iterator where the **x** value is interspersed between the +   elements of the source iterator. The **x** value can also be added as a +   last element of returning iterator if the source iterator contains the odd +   number of elements. + +   Examples: + +   .. code-block:: lua + +    > each(print, intersperse("x", {"a", "b", "c", "d", "e"})) +    a +    x +    b +    x +    c +    x +    d +    x +    e +    x diff --git a/Data/DefaultContent/Libraries/luafun/doc/under_the_hood.rst b/Data/DefaultContent/Libraries/luafun/doc/under_the_hood.rst new file mode 100644 index 0000000..802659e --- /dev/null +++ b/Data/DefaultContent/Libraries/luafun/doc/under_the_hood.rst @@ -0,0 +1,154 @@ +Under the Hood +============== + +.. module:: fun + +The section shed some light on the internal library structure and working +principles. + +Iterators +--------- + +A basic primitive of the library after functions is an iterator. Most functions +takes an iterator and returns a new iteraror(s). Iterators all the way down! +[#iterators]_. + +The simplest iterator is (surprise!) :func:`pairs` and :func:`ipairs` +Lua functions. Have you ever tried to call, say, :func:`ipairs` function +without using it inside a ``for`` loop? Try to do that on any Lua +implementation: + +.. _iterator_triplet: +.. code-block:: bash + +    > =ipairs({'a', 'b', 'c'}) +    function: builtin#6     table: 0x40f80e38       0 + +The function returned three strange values which look useless without a ``for`` +loop. We call these values **iterator triplet**. +Let's see how each value is used for: + +``gen`` -- first value +   A generating function that can produce a next value on each iteration. +   Usually returns a new ``state`` and iteration values (multireturn). + +``param`` -- second value +   A permanent (constant) parameter of a generating function is used to create +   specific instance of the generating function. For example, a table itself +   for ``ipairs`` case. + +``state`` -- third value +   A some transient state of an iterator that is changed after each iteration. +   For example, an array index for ``ipairs`` case. + +Try to call ``gen`` function manually: + +   .. code-block:: lua + +    > gen, param, state = ipairs({'a', 'b', 'c'}) +    > =gen(param, state) +    1       a + +The ``gen`` function returned a new state ``1`` and the next iteration +value ``a``. The second call to ``gen`` with the new state will return the next +state  and the next iteration value. When the iterator finishes to the end +the ``nil`` value is returned instead of the next state. + +**Please do not panic!** You do not have to use these values directly. +It is just a nice trick to get ``for .. in`` loop working in Lua. + +Iterations +---------- + +What happens when you type the following code into a Lua console:: + +    for _it, x in ipairs({'a', 'b', 'c'}) do print(x) end + +According to Lua reference manual [#lua_for]_ the code above is equivalent to:: + +    do +        -- Initialize the iterator +        local gen, param, state = ipairs({'a', 'b', 'c'}) +        while true do +            -- Next iteration +            local state, var_1, ยทยทยท, var_n = gen(param, state) +            if state == nil then break end +            -- Assign values to our variables +            _it = state +            x = var_1 +            -- Execute the code block +            print(x) +        end +    end + +What does it mean for us? + +* An iterator can be used together with ``for .. in`` to generate a loop +* An iterator is fully defined using ``gen``, ``param`` and ``state`` iterator +  triplet +* The ``nil`` state marks the end of an iteration +* An iterator can return an arbitrary number of values (multireturn) +* It is possible to make some wrapping functions to take an iterator and + +  return a new modified iterator + +**The library provides a set of iterators** that can be used like ``pairs`` +and ``ipairs``. + +Iterator Types +-------------- + +Pure functional iterators +````````````````````````` + +Iterators can be either pure functional or have some side effects and returns +different values for some initial conditions [#pure_function]_. An **iterator is +pure functional** if it meets the following criteria: + +- ``gen`` function always returns the same values for the same ``param`` and +  ``state`` values (idempotence property) +- ``param`` and ``state`` values are not modified during ``gen`` call and +  a new ``state`` object is returned instead (referential transparency +  property). + +Pure functional iterators are very important for us. Pure functional iterator +can be safety cloned or reapplied without creating side effects. Many library +function use these properties. + +Finite iterators +```````````````` + +Iterators can be **finite** (sooner or later end up) or **infinite** +(never end). +Since there is no way to determine automatically if an iterator is finite or +not [#turing]_ the library function can not automatically resolve infinite +loops. It is your obligation to do not pass infinite iterator to reducing +functions. + +Tracing JIT +----------- + +Tracing just-in-time compilation is a technique used by virtual machines to +optimize the execution of a program at runtime. This is done by recording a +linear sequence of frequently executed operations, compiling them to native +machine code and executing them. + +First profiling information for loops is collected. After a hot loop has been +identified, a special tracing mode is entered which records all executed +operations of that loop. This sequence of operations is called a **trace**. +The trace is then optimized and compiled to machine code (trace). When this +loop is executed again the compiled trace is called instead of the program +counterpart [#tracing_jit]_. + +Why the tracing JIT is important for us? The LuaJIT tracing compiler can detect +tail-, up- and down-recursion [#luajit-recursion]_, unroll compositions of +functions and inline high-order functions [#luajit-optimizations]_. +All of these concepts make the foundation for functional programming. + +.. [#iterators] http://en.wikipedia.org/wiki/Turtles_all_the_way_down +.. [#lua_for] http://www.lua.org/manual/5.2/manual.html#3.3.5 +.. [#pure_function] http://en.wikipedia.org/wiki/Pure_function +.. [#turing] `Proved by Turing <http://en.wikipedia.org/wiki/Halting_problem>`_ +.. [#tracing_jit] http://en.wikipedia.org/wiki/Tracing_just-in-time_compilation +.. [#luajit-recursion] http://lambda-the-ultimate.org/node/3851#comment-57679 +.. [#luajit-optimizations] http://wiki.luajit.org/Optimizations  | 
