From 95a888e5b3e01a726af1d5ffe4fd6dfed35a3af2 Mon Sep 17 00:00:00 2001 From: lukaszcz Date: Tue, 21 Jan 2025 13:05:47 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20anoma/ju?= =?UTF-8?q?vix-docs@970308cfde7117470cbc8f2e8e77fe9e8ce9f63d=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pull-137/404.html | 947 + pull-137/CHANGELOG.html | 3844 + pull-137/Juvix/Builtin/V1/Bool-src.html | 9 + pull-137/Juvix/Builtin/V1/Bool.html | 3 + pull-137/Juvix/Builtin/V1/Fixity-src.html | 29 + pull-137/Juvix/Builtin/V1/Fixity.html | 2 + pull-137/Juvix/Builtin/V1/List-src.html | 14 + pull-137/Juvix/Builtin/V1/List.html | 3 + pull-137/Juvix/Builtin/V1/Maybe-src.html | 10 + pull-137/Juvix/Builtin/V1/Maybe.html | 3 + pull-137/Juvix/Builtin/V1/Nat-src.html | 23 + pull-137/Juvix/Builtin/V1/Nat.html | 4 + pull-137/Juvix/Builtin/V1/Nat/Base-src.html | 49 + pull-137/Juvix/Builtin/V1/Nat/Base.html | 10 + pull-137/Juvix/Builtin/V1/String-src.html | 14 + pull-137/Juvix/Builtin/V1/String.html | 4 + .../Builtin/V1/Trait/FromNatural-src.html | 14 + .../Juvix/Builtin/V1/Trait/FromNatural.html | 6 + .../Juvix/Builtin/V1/Trait/Natural-src.html | 21 + pull-137/Juvix/Builtin/V1/Trait/Natural.html | 11 + pull-137/Package.juvix | 22 + pull-137/README-src.html | 5 + pull-137/README.html | 1278 + pull-137/Stdlib/Data/BinaryTree-src.html | 27 + pull-137/Stdlib/Data/BinaryTree.html | 6 + pull-137/Stdlib/Data/Bool-src.html | 27 + pull-137/Stdlib/Data/Bool.html | 7 + pull-137/Stdlib/Data/Bool/Base-src.html | 43 + pull-137/Stdlib/Data/Bool/Base.html | 6 + pull-137/Stdlib/Data/Byte-src.html | 30 + pull-137/Stdlib/Data/Byte.html | 5 + pull-137/Stdlib/Data/Byte/Base-src.html | 24 + pull-137/Stdlib/Data/Byte/Base.html | 6 + pull-137/Stdlib/Data/Field-src.html | 57 + pull-137/Stdlib/Data/Field.html | 8 + pull-137/Stdlib/Data/Field/Base-src.html | 46 + pull-137/Stdlib/Data/Field/Base.html | 10 + pull-137/Stdlib/Data/Fixity-src.html | 5 + pull-137/Stdlib/Data/Fixity.html | 2 + pull-137/Stdlib/Data/Int-src.html | 70 + pull-137/Stdlib/Data/Int.html | 10 + pull-137/Stdlib/Data/Int/Base-src.html | 97 + pull-137/Stdlib/Data/Int/Base.html | 12 + pull-137/Stdlib/Data/Int/Ord-src.html | 62 + pull-137/Stdlib/Data/Int/Ord.html | 5 + pull-137/Stdlib/Data/List-src.html | 108 + pull-137/Stdlib/Data/List.html | 11 + pull-137/Stdlib/Data/List/Base-src.html | 260 + pull-137/Stdlib/Data/List/Base.html | 5 + pull-137/Stdlib/Data/Map-src.html | 377 + pull-137/Stdlib/Data/Map.html | 76 + pull-137/Stdlib/Data/Maybe-src.html | 66 + pull-137/Stdlib/Data/Maybe.html | 11 + pull-137/Stdlib/Data/Maybe/Base-src.html | 26 + pull-137/Stdlib/Data/Maybe/Base.html | 2 + pull-137/Stdlib/Data/Nat-src.html | 49 + pull-137/Stdlib/Data/Nat.html | 8 + pull-137/Stdlib/Data/Nat/Base-src.html | 5 + pull-137/Stdlib/Data/Nat/Base.html | 2 + pull-137/Stdlib/Data/Nat/Ord-src.html | 69 + pull-137/Stdlib/Data/Nat/Ord.html | 5 + pull-137/Stdlib/Data/Ordering-src.html | 40 + pull-137/Stdlib/Data/Ordering.html | 5 + pull-137/Stdlib/Data/Pair-src.html | 27 + pull-137/Stdlib/Data/Pair.html | 7 + pull-137/Stdlib/Data/Pair/Base-src.html | 39 + pull-137/Stdlib/Data/Pair/Base.html | 3 + pull-137/Stdlib/Data/Range-src.html | 94 + pull-137/Stdlib/Data/Range.html | 10 + pull-137/Stdlib/Data/Result-src.html | 71 + pull-137/Stdlib/Data/Result.html | 13 + pull-137/Stdlib/Data/Result/Base-src.html | 80 + pull-137/Stdlib/Data/Result/Base.html | 21 + pull-137/Stdlib/Data/Set-src.html | 13 + pull-137/Stdlib/Data/Set.html | 2 + pull-137/Stdlib/Data/Set/AVL-src.html | 485 + pull-137/Stdlib/Data/Set/AVL.html | 42 + pull-137/Stdlib/Data/String-src.html | 19 + pull-137/Stdlib/Data/String.html | 4 + pull-137/Stdlib/Data/String/Base-src.html | 14 + pull-137/Stdlib/Data/String/Base.html | 2 + pull-137/Stdlib/Data/String/Ord-src.html | 13 + pull-137/Stdlib/Data/String/Ord.html | 3 + pull-137/Stdlib/Data/Tree-src.html | 38 + pull-137/Stdlib/Data/Tree.html | 7 + pull-137/Stdlib/Data/Unit-src.html | 45 + pull-137/Stdlib/Data/Unit.html | 6 + pull-137/Stdlib/Data/Unit/Base-src.html | 15 + pull-137/Stdlib/Data/Unit/Base.html | 2 + pull-137/Stdlib/Debug/Fail-src.html | 9 + pull-137/Stdlib/Debug/Fail.html | 3 + pull-137/Stdlib/Debug/Trace-src.html | 7 + pull-137/Stdlib/Debug/Trace.html | 3 + pull-137/Stdlib/Function-src.html | 59 + pull-137/Stdlib/Function.html | 3 + pull-137/Stdlib/Prelude-src.html | 23 + pull-137/Stdlib/Prelude.html | 2 + pull-137/Stdlib/System/IO-src.html | 15 + pull-137/Stdlib/System/IO.html | 2 + pull-137/Stdlib/System/IO/Base-src.html | 12 + pull-137/Stdlib/System/IO/Base.html | 4 + pull-137/Stdlib/System/IO/Bool-src.html | 12 + pull-137/Stdlib/System/IO/Bool.html | 3 + pull-137/Stdlib/System/IO/Int-src.html | 12 + pull-137/Stdlib/System/IO/Int.html | 3 + pull-137/Stdlib/System/IO/Nat-src.html | 12 + pull-137/Stdlib/System/IO/Nat.html | 3 + pull-137/Stdlib/System/IO/String-src.html | 14 + pull-137/Stdlib/System/IO/String.html | 4 + pull-137/Stdlib/Trait-src.html | 17 + pull-137/Stdlib/Trait.html | 2 + pull-137/Stdlib/Trait/Applicative-src.html | 63 + pull-137/Stdlib/Trait/Applicative.html | 21 + pull-137/Stdlib/Trait/DivMod-src.html | 14 + pull-137/Stdlib/Trait/DivMod.html | 8 + pull-137/Stdlib/Trait/Eq-src.html | 25 + pull-137/Stdlib/Trait/Eq.html | 7 + pull-137/Stdlib/Trait/Foldable-src.html | 6 + pull-137/Stdlib/Trait/Foldable.html | 2 + .../Trait/Foldable/Monomorphic-src.html | 57 + .../Stdlib/Trait/Foldable/Monomorphic.html | 26 + .../Trait/Foldable/Polymorphic-src.html | 46 + .../Stdlib/Trait/Foldable/Polymorphic.html | 22 + pull-137/Stdlib/Trait/FromNatural-src.html | 5 + pull-137/Stdlib/Trait/FromNatural.html | 2 + pull-137/Stdlib/Trait/Functor-src.html | 9 + pull-137/Stdlib/Trait/Functor.html | 4 + .../Stdlib/Trait/Functor/Monomorphic-src.html | 43 + .../Stdlib/Trait/Functor/Monomorphic.html | 18 + .../Stdlib/Trait/Functor/Polymorphic-src.html | 31 + .../Stdlib/Trait/Functor/Polymorphic.html | 7 + pull-137/Stdlib/Trait/Integral-src.html | 20 + pull-137/Stdlib/Trait/Integral.html | 10 + pull-137/Stdlib/Trait/Monad-src.html | 30 + pull-137/Stdlib/Trait/Monad.html | 14 + pull-137/Stdlib/Trait/Natural-src.html | 5 + pull-137/Stdlib/Trait/Natural.html | 2 + pull-137/Stdlib/Trait/Numeric-src.html | 16 + pull-137/Stdlib/Trait/Numeric.html | 7 + pull-137/Stdlib/Trait/Ord-src.html | 66 + pull-137/Stdlib/Trait/Ord.html | 8 + pull-137/Stdlib/Trait/Partial-src.html | 16 + pull-137/Stdlib/Trait/Partial.html | 5 + pull-137/Stdlib/Trait/Show-src.html | 11 + pull-137/Stdlib/Trait/Show.html | 5 + pull-137/assets/css/extra.css | 142 + pull-137/assets/css/juvix-highlighting.css | 67 + .../assets/css/juvix_codeblock_footer.css | 8 + pull-137/assets/css/linuwial.css | 1016 + pull-137/assets/css/source-ayu-light.css | 64 + pull-137/assets/css/source-macchiato.css | 76 + pull-137/assets/css/source-nord.css | 64 + pull-137/assets/images/favicon.png | Bin 0 -> 1870 bytes .../images/favicon/android-chrome-192x192.png | Bin 0 -> 15302 bytes .../images/favicon/android-chrome-512x512.png | Bin 0 -> 47664 bytes .../images/favicon/apple-touch-icon.png | Bin 0 -> 14226 bytes .../assets/images/favicon/browserconfig.xml | 9 + .../assets/images/favicon/favicon-16x16.png | Bin 0 -> 1109 bytes .../assets/images/favicon/favicon-32x32.png | Bin 0 -> 1895 bytes pull-137/assets/images/favicon/favicon.ico | Bin 0 -> 15086 bytes .../assets/images/favicon/mstile-150x150.png | Bin 0 -> 9950 bytes .../images/favicon/safari-pinned-tab.svg | 64 + .../assets/images/favicon/site.webmanifest | 19 + pull-137/assets/images/social/CHANGELOG.png | Bin 0 -> 32912 bytes .../assets/images/social/README.juvix.png | Bin 0 -> 35220 bytes .../images/social/blog/archive/2022.png | Bin 0 -> 28058 bytes .../images/social/blog/archive/2023.png | Bin 0 -> 29387 bytes .../images/social/blog/category/language.png | Bin 0 -> 30567 bytes .../social/blog/category/type-system.png | Bin 0 -> 32105 bytes pull-137/assets/images/social/blog/index.png | Bin 0 -> 32677 bytes .../images/social/blog/posts/iterators.png | Bin 0 -> 33981 bytes .../posts/strictly-positive-data-types.png | Bin 0 -> 35895 bytes .../assets/images/social/everything.juvix.png | Bin 0 -> 32015 bytes .../images/social/explanations/README.png | Bin 0 -> 29167 bytes .../social/explanations/totality/coverage.png | Bin 0 -> 36974 bytes .../social/explanations/totality/positive.png | Bin 0 -> 44022 bytes .../explanations/totality/termination.png | Bin 0 -> 31053 bytes .../images/social/explanations/typetheory.png | Bin 0 -> 31611 bytes .../assets/images/social/howto/README.png | Bin 0 -> 34130 bytes .../images/social/howto/compilation.png | Bin 0 -> 40091 bytes .../images/social/howto/contributing.png | Bin 0 -> 32528 bytes .../assets/images/social/howto/installing.png | Bin 0 -> 33809 bytes pull-137/assets/images/social/howto/judoc.png | Bin 0 -> 38739 bytes .../assets/images/social/howto/project.png | Bin 0 -> 36924 bytes .../images/social/howto/quick-start.png | Bin 0 -> 33462 bytes .../assets/images/social/juvix-packages.png | Bin 0 -> 44568 bytes .../assets/images/social/reference/README.png | Bin 0 -> 30089 bytes .../images/social/reference/benchmarks.png | Bin 0 -> 33624 bytes .../images/social/reference/compiler.png | Bin 0 -> 38869 bytes .../images/social/reference/examples.png | Bin 0 -> 35785 bytes .../assets/images/social/reference/judoc.png | Bin 0 -> 33945 bytes .../social/reference/language/README.png | Bin 0 -> 29167 bytes .../reference/language/aliases.juvix.png | Bin 0 -> 30905 bytes .../reference/language/axioms.juvix.png | Bin 0 -> 31577 bytes .../reference/language/builtins.juvix.png | Bin 0 -> 29291 bytes .../social/reference/language/comments.png | Bin 0 -> 32241 bytes .../reference/language/control.juvix.png | Bin 0 -> 33844 bytes .../reference/language/datatypes.juvix.png | Bin 0 -> 32885 bytes .../reference/language/fixity.juvix.png | Bin 0 -> 29806 bytes .../reference/language/functions.juvix.png | Bin 0 -> 30753 bytes .../social/reference/language/iterators.png | Bin 0 -> 30954 bytes .../social/reference/language/lets.juvix.png | Bin 0 -> 34258 bytes .../social/reference/language/modules.png | Bin 0 -> 31910 bytes .../reference/language/operators.juvix.png | Bin 0 -> 33481 bytes .../reference/language/pragmas.juvix.png | Bin 0 -> 31313 bytes .../reference/language/records.juvix.png | Bin 0 -> 32334 bytes .../social/reference/language/syntax.png | Bin 0 -> 30581 bytes .../reference/language/traits.juvix.png | Bin 0 -> 28659 bytes .../assets/images/social/reference/stdlib.png | Bin 0 -> 33489 bytes .../images/social/reference/tooling/CLI.png | Bin 0 -> 38675 bytes .../social/reference/tooling/doctor.png | Bin 0 -> 29473 bytes .../images/social/reference/tooling/emacs.png | Bin 0 -> 33235 bytes .../social/reference/tooling/testing.png | Bin 0 -> 31943 bytes pull-137/assets/images/social/talks.png | Bin 0 -> 38180 bytes .../assets/images/social/tutorials/README.png | Bin 0 -> 30457 bytes .../images/social/tutorials/emacs.juvix.png | Bin 0 -> 36851 bytes .../social/tutorials/essential.juvix.png | Bin 0 -> 33573 bytes .../images/social/tutorials/learn.juvix.png | Bin 0 -> 44028 bytes .../images/social/tutorials/structure.png | Bin 0 -> 30724 bytes .../images/social/tutorials/vscode.juvix.png | Bin 0 -> 43017 bytes pull-137/assets/images/tara-doctor.svg | 1 + pull-137/assets/images/tara-magicien.png | Bin 0 -> 150646 bytes pull-137/assets/images/tara-seating.svg | 1 + pull-137/assets/images/tara-smiling.png | Bin 0 -> 72751 bytes pull-137/assets/images/tara-smiling.svg | 1 + pull-137/assets/images/tara-teaching.png | Bin 0 -> 69541 bytes pull-137/assets/images/tara-teaching.svg | 1 + .../assets/javascripts/bundle.60a45f97.min.js | 16 + .../javascripts/bundle.60a45f97.min.js.map | 7 + .../javascripts/lunr/min/lunr.ar.min.js | 1 + .../javascripts/lunr/min/lunr.da.min.js | 18 + .../javascripts/lunr/min/lunr.de.min.js | 18 + .../javascripts/lunr/min/lunr.du.min.js | 18 + .../javascripts/lunr/min/lunr.el.min.js | 1 + .../javascripts/lunr/min/lunr.es.min.js | 18 + .../javascripts/lunr/min/lunr.fi.min.js | 18 + .../javascripts/lunr/min/lunr.fr.min.js | 18 + .../javascripts/lunr/min/lunr.he.min.js | 1 + .../javascripts/lunr/min/lunr.hi.min.js | 1 + .../javascripts/lunr/min/lunr.hu.min.js | 18 + .../javascripts/lunr/min/lunr.hy.min.js | 1 + .../javascripts/lunr/min/lunr.it.min.js | 18 + .../javascripts/lunr/min/lunr.ja.min.js | 1 + .../javascripts/lunr/min/lunr.jp.min.js | 1 + .../javascripts/lunr/min/lunr.kn.min.js | 1 + .../javascripts/lunr/min/lunr.ko.min.js | 1 + .../javascripts/lunr/min/lunr.multi.min.js | 1 + .../javascripts/lunr/min/lunr.nl.min.js | 18 + .../javascripts/lunr/min/lunr.no.min.js | 18 + .../javascripts/lunr/min/lunr.pt.min.js | 18 + .../javascripts/lunr/min/lunr.ro.min.js | 18 + .../javascripts/lunr/min/lunr.ru.min.js | 18 + .../javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + .../javascripts/lunr/min/lunr.sv.min.js | 18 + .../javascripts/lunr/min/lunr.ta.min.js | 1 + .../javascripts/lunr/min/lunr.te.min.js | 1 + .../javascripts/lunr/min/lunr.th.min.js | 1 + .../javascripts/lunr/min/lunr.tr.min.js | 18 + .../javascripts/lunr/min/lunr.vi.min.js | 1 + .../javascripts/lunr/min/lunr.zh.min.js | 1 + pull-137/assets/javascripts/lunr/tinyseg.js | 206 + pull-137/assets/javascripts/lunr/wordcut.js | 6708 ++ .../workers/search.f8cc74c7.min.js | 42 + .../workers/search.f8cc74c7.min.js.map | 7 + pull-137/assets/js/extra.js | 0 pull-137/assets/js/highlight.js | 26 + pull-137/assets/js/mathjax.js | 16 + pull-137/assets/js/tex-chtml.js | 66590 ++++++++++++++++ pull-137/assets/logo-juvix.svg | 92 + .../assets/stylesheets/main.a40c8224.min.css | 1 + .../stylesheets/main.a40c8224.min.css.map | 1 + .../stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + pull-137/blog/archive/2022.html | 1333 + pull-137/blog/archive/2023.html | 1330 + pull-137/blog/category/language.html | 1330 + pull-137/blog/category/type-system.html | 1333 + pull-137/blog/index.html | 1292 + pull-137/blog/iterators.html | 1590 + .../blog/strictly-positive-data-types.html | 1454 + .../strictly-positive-data-types/Main.juvix | 50 + .../Package.juvix | 10 + .../juvix.lock.yaml | 11 + pull-137/css/timeago.css | 15 + pull-137/everything-src.html | 21 + pull-137/everything.html | 1111 + pull-137/examples/demo/Demo.juvix | 56 + pull-137/examples/demo/Package.juvix | 9 + .../examples/midsquare/MidSquareHash.juvix | 26 + pull-137/examples/midsquare/MidSquareHash.jvc | 24 + .../midsquare/MidSquareHashUnrolled.juvix | 123 + .../midsquare/MidSquareHashUnrolled.jvc | 51 + pull-137/examples/midsquare/Package.juvix | 9 + pull-137/examples/milestone/Bank/Bank.juvix | 101 + .../examples/milestone/Bank/Package.juvix | 8 + .../examples/milestone/Collatz/Collatz.juvix | 30 + .../examples/milestone/Collatz/Package.juvix | 10 + .../milestone/Fibonacci/Fibonacci.juvix | 11 + .../milestone/Fibonacci/Package.juvix | 10 + pull-137/examples/milestone/Hanoi/Hanoi.juvix | 58 + .../examples/milestone/Hanoi/Package.juvix | 10 + .../milestone/HelloWorld/HelloWorld.juvix | 6 + .../milestone/HelloWorld/Package.juvix | 10 + .../milestone/PascalsTriangle/Package.juvix | 10 + .../PascalsTriangle/PascalsTriangle.juvix | 35 + .../milestone/TicTacToe/CLI/TicTacToe.juvix | 44 + .../milestone/TicTacToe/Logic/Board.juvix | 45 + .../milestone/TicTacToe/Logic/Extra.juvix | 16 + .../milestone/TicTacToe/Logic/Game.juvix | 45 + .../milestone/TicTacToe/Logic/GameState.juvix | 50 + .../milestone/TicTacToe/Logic/Square.juvix | 40 + .../milestone/TicTacToe/Logic/Symbol.juvix | 33 + .../milestone/TicTacToe/Package.juvix | 10 + .../examples/milestone/TicTacToe/README.org | 37 + .../milestone/TicTacToe/TicTacToe.juvix | 3 + .../examples/milestone/Tutorial/Package.juvix | 9 + .../milestone/Tutorial/Tutorial.juvix | 9 + pull-137/explanations/index.html | 1111 + pull-137/explanations/totality/coverage.html | 1164 + pull-137/explanations/totality/positive.html | 1164 + .../explanations/totality/termination.html | 1212 + pull-137/explanations/typetheory.html | 1164 + pull-137/feed_json_created.json | 1 + pull-137/feed_json_updated.json | 1 + pull-137/feed_rss_created.xml | 1 + pull-137/feed_rss_updated.xml | 1 + pull-137/howto/compilation.html | 1478 + pull-137/howto/compilation/HelloWorld.juvix | 12 + pull-137/howto/contributing.html | 1538 + pull-137/howto/index.html | 1308 + pull-137/howto/installing.html | 1645 + pull-137/howto/judoc.html | 1448 + pull-137/howto/judoc/Main.juvix | 15 + pull-137/howto/project.html | 1626 + pull-137/howto/project/CLI.yaml | 14 + pull-137/howto/project/Package.juvix | 7 + pull-137/howto/project/ex1/Package.juvix | 12 + pull-137/howto/project/ex2/Package.juvix | 17 + pull-137/howto/quick-start.html | 1190 + pull-137/index.html | 14 + pull-137/js/timeago.min.js | 2 + pull-137/js/timeago_mkdocs_material.js | 33 + pull-137/juvix-packages.html | 1350 + pull-137/juvix.lock.yaml | 28 + pull-137/overrides/main.html | 18 + pull-137/overrides/partials/comments.html | 49 + pull-137/overrides/partials/content.html | 36 + pull-137/overrides/partials/copyright.html | 17 + pull-137/reference/benchmarks.html | 1164 + pull-137/reference/compiler.html | 1405 + pull-137/reference/examples.html | 1432 + pull-137/reference/index.html | 1793 + pull-137/reference/judoc.html | 1793 + pull-137/reference/language/aliases-src.html | 42 + pull-137/reference/language/aliases.html | 1893 + pull-137/reference/language/axioms-src.html | 7 + pull-137/reference/language/axioms.html | 1789 + pull-137/reference/language/builtins-src.html | 25 + pull-137/reference/language/builtins.html | 1801 + pull-137/reference/language/comments.html | 1868 + pull-137/reference/language/control.html | 1858 + .../reference/language/datatypes-src.html | 45 + pull-137/reference/language/datatypes.html | 1885 + pull-137/reference/language/fixity-src.html | 48 + pull-137/reference/language/fixity.html | 2042 + .../reference/language/functions-src.html | 85 + pull-137/reference/language/functions.html | 2012 + pull-137/reference/language/index.html | 1220 + pull-137/reference/language/iterators.html | 1810 + pull-137/reference/language/lets-src.html | 32 + pull-137/reference/language/lets.html | 1787 + pull-137/reference/language/modules.html | 1994 + .../reference/language/operators-src.html | 7 + pull-137/reference/language/operators.html | 1810 + pull-137/reference/language/pragmas-src.html | 75 + pull-137/reference/language/pragmas.html | 1897 + pull-137/reference/language/records-src.html | 90 + pull-137/reference/language/records.html | 2021 + pull-137/reference/language/syntax.html | 1209 + pull-137/reference/language/traits-src.html | 141 + pull-137/reference/language/traits.html | 2057 + pull-137/reference/stdlib.html | 1414 + pull-137/reference/tooling/CLI.html | 1860 + pull-137/reference/tooling/doctor.html | 1973 + pull-137/reference/tooling/emacs.html | 1719 + pull-137/reference/tooling/testing.html | 1631 + pull-137/search/search_index.json | 1 + pull-137/sitemap.xml | 231 + pull-137/sitemap.xml.gz | Bin 0 -> 661 bytes pull-137/talks.html | 1270 + pull-137/tutorials/emacs-src.html | 15 + pull-137/tutorials/emacs.html | 1364 + pull-137/tutorials/essential-src.html | 383 + pull-137/tutorials/essential.html | 2572 + pull-137/tutorials/index.html | 1284 + pull-137/tutorials/learn-src.html | 581 + pull-137/tutorials/learn.html | 2592 + pull-137/tutorials/structure.html | 1111 + pull-137/tutorials/vscode-src.html | 10 + pull-137/tutorials/vscode.html | 1360 + 401 files changed, 175481 insertions(+) create mode 100644 pull-137/404.html create mode 100644 pull-137/CHANGELOG.html create mode 100644 pull-137/Juvix/Builtin/V1/Bool-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Bool.html create mode 100644 pull-137/Juvix/Builtin/V1/Fixity-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Fixity.html create mode 100644 pull-137/Juvix/Builtin/V1/List-src.html create mode 100644 pull-137/Juvix/Builtin/V1/List.html create mode 100644 pull-137/Juvix/Builtin/V1/Maybe-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Maybe.html create mode 100644 pull-137/Juvix/Builtin/V1/Nat-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Nat.html create mode 100644 pull-137/Juvix/Builtin/V1/Nat/Base-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Nat/Base.html create mode 100644 pull-137/Juvix/Builtin/V1/String-src.html create mode 100644 pull-137/Juvix/Builtin/V1/String.html create mode 100644 pull-137/Juvix/Builtin/V1/Trait/FromNatural-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Trait/FromNatural.html create mode 100644 pull-137/Juvix/Builtin/V1/Trait/Natural-src.html create mode 100644 pull-137/Juvix/Builtin/V1/Trait/Natural.html create mode 100644 pull-137/Package.juvix create mode 100644 pull-137/README-src.html create mode 100644 pull-137/README.html create mode 100644 pull-137/Stdlib/Data/BinaryTree-src.html create mode 100644 pull-137/Stdlib/Data/BinaryTree.html create mode 100644 pull-137/Stdlib/Data/Bool-src.html create mode 100644 pull-137/Stdlib/Data/Bool.html create mode 100644 pull-137/Stdlib/Data/Bool/Base-src.html create mode 100644 pull-137/Stdlib/Data/Bool/Base.html create mode 100644 pull-137/Stdlib/Data/Byte-src.html create mode 100644 pull-137/Stdlib/Data/Byte.html create mode 100644 pull-137/Stdlib/Data/Byte/Base-src.html create mode 100644 pull-137/Stdlib/Data/Byte/Base.html create mode 100644 pull-137/Stdlib/Data/Field-src.html create mode 100644 pull-137/Stdlib/Data/Field.html create mode 100644 pull-137/Stdlib/Data/Field/Base-src.html create mode 100644 pull-137/Stdlib/Data/Field/Base.html create mode 100644 pull-137/Stdlib/Data/Fixity-src.html create mode 100644 pull-137/Stdlib/Data/Fixity.html create mode 100644 pull-137/Stdlib/Data/Int-src.html create mode 100644 pull-137/Stdlib/Data/Int.html create mode 100644 pull-137/Stdlib/Data/Int/Base-src.html create mode 100644 pull-137/Stdlib/Data/Int/Base.html create mode 100644 pull-137/Stdlib/Data/Int/Ord-src.html create mode 100644 pull-137/Stdlib/Data/Int/Ord.html create mode 100644 pull-137/Stdlib/Data/List-src.html create mode 100644 pull-137/Stdlib/Data/List.html create mode 100644 pull-137/Stdlib/Data/List/Base-src.html create mode 100644 pull-137/Stdlib/Data/List/Base.html create mode 100644 pull-137/Stdlib/Data/Map-src.html create mode 100644 pull-137/Stdlib/Data/Map.html create mode 100644 pull-137/Stdlib/Data/Maybe-src.html create mode 100644 pull-137/Stdlib/Data/Maybe.html create mode 100644 pull-137/Stdlib/Data/Maybe/Base-src.html create mode 100644 pull-137/Stdlib/Data/Maybe/Base.html create mode 100644 pull-137/Stdlib/Data/Nat-src.html create mode 100644 pull-137/Stdlib/Data/Nat.html create mode 100644 pull-137/Stdlib/Data/Nat/Base-src.html create mode 100644 pull-137/Stdlib/Data/Nat/Base.html create mode 100644 pull-137/Stdlib/Data/Nat/Ord-src.html create mode 100644 pull-137/Stdlib/Data/Nat/Ord.html create mode 100644 pull-137/Stdlib/Data/Ordering-src.html create mode 100644 pull-137/Stdlib/Data/Ordering.html create mode 100644 pull-137/Stdlib/Data/Pair-src.html create mode 100644 pull-137/Stdlib/Data/Pair.html create mode 100644 pull-137/Stdlib/Data/Pair/Base-src.html create mode 100644 pull-137/Stdlib/Data/Pair/Base.html create mode 100644 pull-137/Stdlib/Data/Range-src.html create mode 100644 pull-137/Stdlib/Data/Range.html create mode 100644 pull-137/Stdlib/Data/Result-src.html create mode 100644 pull-137/Stdlib/Data/Result.html create mode 100644 pull-137/Stdlib/Data/Result/Base-src.html create mode 100644 pull-137/Stdlib/Data/Result/Base.html create mode 100644 pull-137/Stdlib/Data/Set-src.html create mode 100644 pull-137/Stdlib/Data/Set.html create mode 100644 pull-137/Stdlib/Data/Set/AVL-src.html create mode 100644 pull-137/Stdlib/Data/Set/AVL.html create mode 100644 pull-137/Stdlib/Data/String-src.html create mode 100644 pull-137/Stdlib/Data/String.html create mode 100644 pull-137/Stdlib/Data/String/Base-src.html create mode 100644 pull-137/Stdlib/Data/String/Base.html create mode 100644 pull-137/Stdlib/Data/String/Ord-src.html create mode 100644 pull-137/Stdlib/Data/String/Ord.html create mode 100644 pull-137/Stdlib/Data/Tree-src.html create mode 100644 pull-137/Stdlib/Data/Tree.html create mode 100644 pull-137/Stdlib/Data/Unit-src.html create mode 100644 pull-137/Stdlib/Data/Unit.html create mode 100644 pull-137/Stdlib/Data/Unit/Base-src.html create mode 100644 pull-137/Stdlib/Data/Unit/Base.html create mode 100644 pull-137/Stdlib/Debug/Fail-src.html create mode 100644 pull-137/Stdlib/Debug/Fail.html create mode 100644 pull-137/Stdlib/Debug/Trace-src.html create mode 100644 pull-137/Stdlib/Debug/Trace.html create mode 100644 pull-137/Stdlib/Function-src.html create mode 100644 pull-137/Stdlib/Function.html create mode 100644 pull-137/Stdlib/Prelude-src.html create mode 100644 pull-137/Stdlib/Prelude.html create mode 100644 pull-137/Stdlib/System/IO-src.html create mode 100644 pull-137/Stdlib/System/IO.html create mode 100644 pull-137/Stdlib/System/IO/Base-src.html create mode 100644 pull-137/Stdlib/System/IO/Base.html create mode 100644 pull-137/Stdlib/System/IO/Bool-src.html create mode 100644 pull-137/Stdlib/System/IO/Bool.html create mode 100644 pull-137/Stdlib/System/IO/Int-src.html create mode 100644 pull-137/Stdlib/System/IO/Int.html create mode 100644 pull-137/Stdlib/System/IO/Nat-src.html create mode 100644 pull-137/Stdlib/System/IO/Nat.html create mode 100644 pull-137/Stdlib/System/IO/String-src.html create mode 100644 pull-137/Stdlib/System/IO/String.html create mode 100644 pull-137/Stdlib/Trait-src.html create mode 100644 pull-137/Stdlib/Trait.html create mode 100644 pull-137/Stdlib/Trait/Applicative-src.html create mode 100644 pull-137/Stdlib/Trait/Applicative.html create mode 100644 pull-137/Stdlib/Trait/DivMod-src.html create mode 100644 pull-137/Stdlib/Trait/DivMod.html create mode 100644 pull-137/Stdlib/Trait/Eq-src.html create mode 100644 pull-137/Stdlib/Trait/Eq.html create mode 100644 pull-137/Stdlib/Trait/Foldable-src.html create mode 100644 pull-137/Stdlib/Trait/Foldable.html create mode 100644 pull-137/Stdlib/Trait/Foldable/Monomorphic-src.html create mode 100644 pull-137/Stdlib/Trait/Foldable/Monomorphic.html create mode 100644 pull-137/Stdlib/Trait/Foldable/Polymorphic-src.html create mode 100644 pull-137/Stdlib/Trait/Foldable/Polymorphic.html create mode 100644 pull-137/Stdlib/Trait/FromNatural-src.html create mode 100644 pull-137/Stdlib/Trait/FromNatural.html create mode 100644 pull-137/Stdlib/Trait/Functor-src.html create mode 100644 pull-137/Stdlib/Trait/Functor.html create mode 100644 pull-137/Stdlib/Trait/Functor/Monomorphic-src.html create mode 100644 pull-137/Stdlib/Trait/Functor/Monomorphic.html create mode 100644 pull-137/Stdlib/Trait/Functor/Polymorphic-src.html create mode 100644 pull-137/Stdlib/Trait/Functor/Polymorphic.html create mode 100644 pull-137/Stdlib/Trait/Integral-src.html create mode 100644 pull-137/Stdlib/Trait/Integral.html create mode 100644 pull-137/Stdlib/Trait/Monad-src.html create mode 100644 pull-137/Stdlib/Trait/Monad.html create mode 100644 pull-137/Stdlib/Trait/Natural-src.html create mode 100644 pull-137/Stdlib/Trait/Natural.html create mode 100644 pull-137/Stdlib/Trait/Numeric-src.html create mode 100644 pull-137/Stdlib/Trait/Numeric.html create mode 100644 pull-137/Stdlib/Trait/Ord-src.html create mode 100644 pull-137/Stdlib/Trait/Ord.html create mode 100644 pull-137/Stdlib/Trait/Partial-src.html create mode 100644 pull-137/Stdlib/Trait/Partial.html create mode 100644 pull-137/Stdlib/Trait/Show-src.html create mode 100644 pull-137/Stdlib/Trait/Show.html create mode 100644 pull-137/assets/css/extra.css create mode 100644 pull-137/assets/css/juvix-highlighting.css create mode 100644 pull-137/assets/css/juvix_codeblock_footer.css create mode 100644 pull-137/assets/css/linuwial.css create mode 100644 pull-137/assets/css/source-ayu-light.css create mode 100644 pull-137/assets/css/source-macchiato.css create mode 100644 pull-137/assets/css/source-nord.css create mode 100644 pull-137/assets/images/favicon.png create mode 100644 pull-137/assets/images/favicon/android-chrome-192x192.png create mode 100644 pull-137/assets/images/favicon/android-chrome-512x512.png create mode 100644 pull-137/assets/images/favicon/apple-touch-icon.png create mode 100644 pull-137/assets/images/favicon/browserconfig.xml create mode 100644 pull-137/assets/images/favicon/favicon-16x16.png create mode 100644 pull-137/assets/images/favicon/favicon-32x32.png create mode 100644 pull-137/assets/images/favicon/favicon.ico create mode 100644 pull-137/assets/images/favicon/mstile-150x150.png create mode 100644 pull-137/assets/images/favicon/safari-pinned-tab.svg create mode 100644 pull-137/assets/images/favicon/site.webmanifest create mode 100644 pull-137/assets/images/social/CHANGELOG.png create mode 100644 pull-137/assets/images/social/README.juvix.png create mode 100644 pull-137/assets/images/social/blog/archive/2022.png create mode 100644 pull-137/assets/images/social/blog/archive/2023.png create mode 100644 pull-137/assets/images/social/blog/category/language.png create mode 100644 pull-137/assets/images/social/blog/category/type-system.png create mode 100644 pull-137/assets/images/social/blog/index.png create mode 100644 pull-137/assets/images/social/blog/posts/iterators.png create mode 100644 pull-137/assets/images/social/blog/posts/strictly-positive-data-types.png create mode 100644 pull-137/assets/images/social/everything.juvix.png create mode 100644 pull-137/assets/images/social/explanations/README.png create mode 100644 pull-137/assets/images/social/explanations/totality/coverage.png create mode 100644 pull-137/assets/images/social/explanations/totality/positive.png create mode 100644 pull-137/assets/images/social/explanations/totality/termination.png create mode 100644 pull-137/assets/images/social/explanations/typetheory.png create mode 100644 pull-137/assets/images/social/howto/README.png create mode 100644 pull-137/assets/images/social/howto/compilation.png create mode 100644 pull-137/assets/images/social/howto/contributing.png create mode 100644 pull-137/assets/images/social/howto/installing.png create mode 100644 pull-137/assets/images/social/howto/judoc.png create mode 100644 pull-137/assets/images/social/howto/project.png create mode 100644 pull-137/assets/images/social/howto/quick-start.png create mode 100644 pull-137/assets/images/social/juvix-packages.png create mode 100644 pull-137/assets/images/social/reference/README.png create mode 100644 pull-137/assets/images/social/reference/benchmarks.png create mode 100644 pull-137/assets/images/social/reference/compiler.png create mode 100644 pull-137/assets/images/social/reference/examples.png create mode 100644 pull-137/assets/images/social/reference/judoc.png create mode 100644 pull-137/assets/images/social/reference/language/README.png create mode 100644 pull-137/assets/images/social/reference/language/aliases.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/axioms.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/builtins.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/comments.png create mode 100644 pull-137/assets/images/social/reference/language/control.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/datatypes.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/fixity.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/functions.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/iterators.png create mode 100644 pull-137/assets/images/social/reference/language/lets.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/modules.png create mode 100644 pull-137/assets/images/social/reference/language/operators.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/pragmas.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/records.juvix.png create mode 100644 pull-137/assets/images/social/reference/language/syntax.png create mode 100644 pull-137/assets/images/social/reference/language/traits.juvix.png create mode 100644 pull-137/assets/images/social/reference/stdlib.png create mode 100644 pull-137/assets/images/social/reference/tooling/CLI.png create mode 100644 pull-137/assets/images/social/reference/tooling/doctor.png create mode 100644 pull-137/assets/images/social/reference/tooling/emacs.png create mode 100644 pull-137/assets/images/social/reference/tooling/testing.png create mode 100644 pull-137/assets/images/social/talks.png create mode 100644 pull-137/assets/images/social/tutorials/README.png create mode 100644 pull-137/assets/images/social/tutorials/emacs.juvix.png create mode 100644 pull-137/assets/images/social/tutorials/essential.juvix.png create mode 100644 pull-137/assets/images/social/tutorials/learn.juvix.png create mode 100644 pull-137/assets/images/social/tutorials/structure.png create mode 100644 pull-137/assets/images/social/tutorials/vscode.juvix.png create mode 100644 pull-137/assets/images/tara-doctor.svg create mode 100644 pull-137/assets/images/tara-magicien.png create mode 100644 pull-137/assets/images/tara-seating.svg create mode 100644 pull-137/assets/images/tara-smiling.png create mode 100644 pull-137/assets/images/tara-smiling.svg create mode 100644 pull-137/assets/images/tara-teaching.png create mode 100644 pull-137/assets/images/tara-teaching.svg create mode 100644 pull-137/assets/javascripts/bundle.60a45f97.min.js create mode 100644 pull-137/assets/javascripts/bundle.60a45f97.min.js.map create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 pull-137/assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 pull-137/assets/javascripts/lunr/tinyseg.js create mode 100644 pull-137/assets/javascripts/lunr/wordcut.js create mode 100644 pull-137/assets/javascripts/workers/search.f8cc74c7.min.js create mode 100644 pull-137/assets/javascripts/workers/search.f8cc74c7.min.js.map create mode 100644 pull-137/assets/js/extra.js create mode 100644 pull-137/assets/js/highlight.js create mode 100644 pull-137/assets/js/mathjax.js create mode 100644 pull-137/assets/js/tex-chtml.js create mode 100644 pull-137/assets/logo-juvix.svg create mode 100644 pull-137/assets/stylesheets/main.a40c8224.min.css create mode 100644 pull-137/assets/stylesheets/main.a40c8224.min.css.map create mode 100644 pull-137/assets/stylesheets/palette.06af60db.min.css create mode 100644 pull-137/assets/stylesheets/palette.06af60db.min.css.map create mode 100644 pull-137/blog/archive/2022.html create mode 100644 pull-137/blog/archive/2023.html create mode 100644 pull-137/blog/category/language.html create mode 100644 pull-137/blog/category/type-system.html create mode 100644 pull-137/blog/index.html create mode 100644 pull-137/blog/iterators.html create mode 100644 pull-137/blog/strictly-positive-data-types.html create mode 100644 pull-137/blog/strictly-positive-data-types/Main.juvix create mode 100644 pull-137/blog/strictly-positive-data-types/Package.juvix create mode 100644 pull-137/blog/strictly-positive-data-types/juvix.lock.yaml create mode 100644 pull-137/css/timeago.css create mode 100644 pull-137/everything-src.html create mode 100644 pull-137/everything.html create mode 100644 pull-137/examples/demo/Demo.juvix create mode 100644 pull-137/examples/demo/Package.juvix create mode 100644 pull-137/examples/midsquare/MidSquareHash.juvix create mode 100644 pull-137/examples/midsquare/MidSquareHash.jvc create mode 100644 pull-137/examples/midsquare/MidSquareHashUnrolled.juvix create mode 100644 pull-137/examples/midsquare/MidSquareHashUnrolled.jvc create mode 100644 pull-137/examples/midsquare/Package.juvix create mode 100644 pull-137/examples/milestone/Bank/Bank.juvix create mode 100644 pull-137/examples/milestone/Bank/Package.juvix create mode 100644 pull-137/examples/milestone/Collatz/Collatz.juvix create mode 100644 pull-137/examples/milestone/Collatz/Package.juvix create mode 100644 pull-137/examples/milestone/Fibonacci/Fibonacci.juvix create mode 100644 pull-137/examples/milestone/Fibonacci/Package.juvix create mode 100644 pull-137/examples/milestone/Hanoi/Hanoi.juvix create mode 100644 pull-137/examples/milestone/Hanoi/Package.juvix create mode 100644 pull-137/examples/milestone/HelloWorld/HelloWorld.juvix create mode 100644 pull-137/examples/milestone/HelloWorld/Package.juvix create mode 100644 pull-137/examples/milestone/PascalsTriangle/Package.juvix create mode 100644 pull-137/examples/milestone/PascalsTriangle/PascalsTriangle.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/CLI/TicTacToe.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/Board.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/Extra.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/Game.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/GameState.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/Square.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Logic/Symbol.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/Package.juvix create mode 100644 pull-137/examples/milestone/TicTacToe/README.org create mode 100644 pull-137/examples/milestone/TicTacToe/TicTacToe.juvix create mode 100644 pull-137/examples/milestone/Tutorial/Package.juvix create mode 100644 pull-137/examples/milestone/Tutorial/Tutorial.juvix create mode 100644 pull-137/explanations/index.html create mode 100644 pull-137/explanations/totality/coverage.html create mode 100644 pull-137/explanations/totality/positive.html create mode 100644 pull-137/explanations/totality/termination.html create mode 100644 pull-137/explanations/typetheory.html create mode 100644 pull-137/feed_json_created.json create mode 100644 pull-137/feed_json_updated.json create mode 100644 pull-137/feed_rss_created.xml create mode 100644 pull-137/feed_rss_updated.xml create mode 100644 pull-137/howto/compilation.html create mode 100644 pull-137/howto/compilation/HelloWorld.juvix create mode 100644 pull-137/howto/contributing.html create mode 100644 pull-137/howto/index.html create mode 100644 pull-137/howto/installing.html create mode 100644 pull-137/howto/judoc.html create mode 100644 pull-137/howto/judoc/Main.juvix create mode 100644 pull-137/howto/project.html create mode 100644 pull-137/howto/project/CLI.yaml create mode 100644 pull-137/howto/project/Package.juvix create mode 100644 pull-137/howto/project/ex1/Package.juvix create mode 100644 pull-137/howto/project/ex2/Package.juvix create mode 100644 pull-137/howto/quick-start.html create mode 100644 pull-137/index.html create mode 100644 pull-137/js/timeago.min.js create mode 100644 pull-137/js/timeago_mkdocs_material.js create mode 100644 pull-137/juvix-packages.html create mode 100644 pull-137/juvix.lock.yaml create mode 100644 pull-137/overrides/main.html create mode 100644 pull-137/overrides/partials/comments.html create mode 100644 pull-137/overrides/partials/content.html create mode 100644 pull-137/overrides/partials/copyright.html create mode 100644 pull-137/reference/benchmarks.html create mode 100644 pull-137/reference/compiler.html create mode 100644 pull-137/reference/examples.html create mode 100644 pull-137/reference/index.html create mode 100644 pull-137/reference/judoc.html create mode 100644 pull-137/reference/language/aliases-src.html create mode 100644 pull-137/reference/language/aliases.html create mode 100644 pull-137/reference/language/axioms-src.html create mode 100644 pull-137/reference/language/axioms.html create mode 100644 pull-137/reference/language/builtins-src.html create mode 100644 pull-137/reference/language/builtins.html create mode 100644 pull-137/reference/language/comments.html create mode 100644 pull-137/reference/language/control.html create mode 100644 pull-137/reference/language/datatypes-src.html create mode 100644 pull-137/reference/language/datatypes.html create mode 100644 pull-137/reference/language/fixity-src.html create mode 100644 pull-137/reference/language/fixity.html create mode 100644 pull-137/reference/language/functions-src.html create mode 100644 pull-137/reference/language/functions.html create mode 100644 pull-137/reference/language/index.html create mode 100644 pull-137/reference/language/iterators.html create mode 100644 pull-137/reference/language/lets-src.html create mode 100644 pull-137/reference/language/lets.html create mode 100644 pull-137/reference/language/modules.html create mode 100644 pull-137/reference/language/operators-src.html create mode 100644 pull-137/reference/language/operators.html create mode 100644 pull-137/reference/language/pragmas-src.html create mode 100644 pull-137/reference/language/pragmas.html create mode 100644 pull-137/reference/language/records-src.html create mode 100644 pull-137/reference/language/records.html create mode 100644 pull-137/reference/language/syntax.html create mode 100644 pull-137/reference/language/traits-src.html create mode 100644 pull-137/reference/language/traits.html create mode 100644 pull-137/reference/stdlib.html create mode 100644 pull-137/reference/tooling/CLI.html create mode 100644 pull-137/reference/tooling/doctor.html create mode 100644 pull-137/reference/tooling/emacs.html create mode 100644 pull-137/reference/tooling/testing.html create mode 100644 pull-137/search/search_index.json create mode 100644 pull-137/sitemap.xml create mode 100644 pull-137/sitemap.xml.gz create mode 100644 pull-137/talks.html create mode 100644 pull-137/tutorials/emacs-src.html create mode 100644 pull-137/tutorials/emacs.html create mode 100644 pull-137/tutorials/essential-src.html create mode 100644 pull-137/tutorials/essential.html create mode 100644 pull-137/tutorials/index.html create mode 100644 pull-137/tutorials/learn-src.html create mode 100644 pull-137/tutorials/learn.html create mode 100644 pull-137/tutorials/structure.html create mode 100644 pull-137/tutorials/vscode-src.html create mode 100644 pull-137/tutorials/vscode.html diff --git a/pull-137/404.html b/pull-137/404.html new file mode 100644 index 000000000..fbf655ef2 --- /dev/null +++ b/pull-137/404.html @@ -0,0 +1,947 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Juvix Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pull-137/CHANGELOG.html b/pull-137/CHANGELOG.html new file mode 100644 index 000000000..fa761f920 --- /dev/null +++ b/pull-137/CHANGELOG.html @@ -0,0 +1,3844 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - Juvix Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + +

Changelog

+

+Juvix Mascot +

+

v0.6.9 (2024-12-20)

+

Full Changelog

+

Merged pull requests:

+ +

v0.6.8 (2024-11-11)

+

Full Changelog

+

Merged pull requests:

+ +

v0.6.7 (2024-11-06)

+

Full Changelog

+

Merged pull requests:

+ +

v0.6.6 (2024-09-03)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.5 (2024-08-14)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.4 (2024-07-19)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.3 (2024-07-02)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.2 (2024-06-12)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.1 (2024-03-25)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.6.0 (2024-03-01)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.5.5 (2023-12-01)

+

Full Changelog

+

Implemented enhancements:

+
    +
  • Add new case for positivity checker: type cannot occur as arg of bound var #2542 (jonaprieto)
  • +
  • Add dependent defaults for the new typechecker #2541 (janmasrovira)
  • +
  • Extract builtin definitions for loading a Package into bundled package-base package #2535 (paulcadman)
  • +
  • Update the Juvix lock file when the Package file changes #2522 (paulcadman)
  • +
  • Add non-dependent default values to the new typechecking algorithm #2516 (janmasrovira)
  • +
+

Merged pull requests:

+ +

v0.5.4 (2023-11-17)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.5.3 (2023-11-01)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.5.2 (2023-10-04)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

0.5.1 (2023-09-15)

+

Full Changelog

+

Merged pull requests:

+ +

v0.5.0 (2023-09-14)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.4.3 (2023-08-24)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.4.2 (2023-07-25)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.4.1 (2023-06-23)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.4.0 - Prague! (2023-06-02)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.5 (2023-06-02)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.4 (2023-05-22)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.3 (2023-05-08)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.2 (2023-04-18)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.1 (2023-03-31)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.3.0 (2023-03-15)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.2.9 (2023-01-18)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.2.8 (2022-12-20)

+

Full Changelog

+

Implemented enhancements:

+ +

Merged pull requests:

+ +

v0.2.7 (2022-12-05)

+

Full Changelog

+

Implemented enhancements:

+
    +
  • Add juvix-repl-mode for emacs + #1612 + (paulcadman)
  • +
  • Make lambda lifting correct when free variables occur in the types + of binders #1609 + (janmasrovira)
  • +
+

Merged pull requests:

+ +

v0.2.6 (2022-10-26)

+

Full Changelog

+

Implemented enhancements:

+ +

Fixed bugs:

+ +

Merged pull requests:

+ +

v0.2.5 (2022-09-14)

+

Full Changelog

+

Fixed bugs:

+
    +
  • Properly type check patterns that need normalization + #1472 + (janmasrovira)
  • +
  • Detect nested patterns as smaller in the termination checker + #1524
  • +
  • Fix developBeta in Core/Extra.hs + #1487 + (lukaszcz)
  • +
  • Core/Extra/Recursors/Collector bugfix + #1510 + (lukaszcz)
  • +
+

Merged pull requests:

+ +

v0.2.4 (2022-08-19)

+

Full Changelog

+

(Special version for Heliax's retreat in Italy)

+

Implemented enhancements:

+ +

Fixed bugs:

+ +

Merged pull requests:

+ +

v0.2.3 (2022-08-15)

+

Full Changelog

+

Implemented enhancements:

+ +

Fixed bugs:

+ +

Merged pull requests:

+ +

v0.2.2 (2022-07-25)

+

Full Changelog

+

Implemented enhancements:

+ +

Fixed bugs:

+ +

Merged pull requests:

+ +

New name: Juvix

+

Since version 0.2.2, the project has been renamed from "Mini Juvix" to +"Juvix". The new name reflects the fact that the project is no longer +just a compiler for a subset of Juvix, but a full implementation of the +language. Affected by this change are:

+
    +
  • Github repository moved from the Heliax organization to the Anoma + organization. "anoma/juvix" is the new repository name.
  • +
  • All references to "Mini Juvix" have been replaced with "Juvix". + Unfortunetly,
  • +
+

due to the move, the old links to the Mini Juvix repository are broken +and will not be fixed.

+

v0.2.1 (2022-07-12)

+

Implemented enhancements:

+
    +
  • Specialize commands of/for internal use MiniJuvix-#270 + (jonaprieto)
  • +
  • Improve handling of location information for different objs + MiniJuvix-#263 (jonaprieto)
  • +
  • Add issues and PR templates MiniJuvix-#261 + (jonaprieto)
  • +
  • Throw error when reading a file that conflicts with embedded stdlib + MiniJuvix-#243 (paulcadman)
  • +
  • Embed standard library in the minijuvix binary MiniJuvix-#210 + (paulcadman)
  • +
+

Fixed bugs:

+
    +
  • Fixed a bug with the path to walloc.c MiniJuvix-#237 + (lukaszcz)
  • +
  • Perform ScopedToAbstract exactly once for each module MiniJuvix-#223 + (paulcadman)
  • +
+

Merged pull requests:

+
    +
  • Label renaming MiniJuvix-#275 + (jonaprieto)
  • +
  • Update link to discord MiniJuvix-#264 + (Romainua)
  • +
  • Include open import statements when generating HTML MiniJuvix-#260 + (paulcadman)
  • +
  • Renaming MiniJuvix to Juvix MiniJuvix-#259 + (jonaprieto)
  • +
  • Updates tests to use the updated standard library MiniJuvix-#253 + (paulcadman)
  • +
  • Enforce C99 standard in the generated C files MiniJuvix-#252 + (lukaszcz)
  • +
  • Restore mascot images to the minijuvix book MiniJuvix-#250 + (paulcadman)
  • +
  • Allow jumping to another module in emacs MiniJuvix-#249 + (janmasrovira)
  • +
  • Restore Juvix mascot image to README MiniJuvix-#248 + (paulcadman)
  • +
  • Add emacs option minijuvix-disable-embedded-stdlib MiniJuvix-#247 + (paulcadman)
  • +
  • Deprecate GHC backend MiniJuvix-#244 + (lukaszcz)
  • +
  • Removed 'eval' and 'print' keywords (#214) MiniJuvix-#242 + (lukaszcz)
  • +
  • Add option to disable minijuvix input method MiniJuvix-#239 + (janmasrovira)
  • +
  • Remove the 'match' keyword MiniJuvix-#238 + (lukaszcz)
  • +
  • Removed tests/positive/HelloWorld.mjuvix and specified clang version + in the documentation MiniJuvix-#236 + (lukaszcz)
  • +
  • Filter symbol entries properly in the scoper MiniJuvix-#234 + (janmasrovira)
  • +
  • Use the ModulesCache for open statements in ScopedToAbstract pass + MiniJuvix-#224 (paulcadman)
  • +
  • README: Include --recursive in git clone command to fetch stdlib + MiniJuvix-#211 (paulcadman)
  • +
  • Update project description v0.2.0 MiniJuvix-#209 + (jonaprieto)
  • +
  • Unify AST representation of types and expressions in MicroJuvix + MiniJuvix-#188 (janmasrovira)
  • +
+

v0.2.0 (2022-06-28)

+

Implemented enhancements:

+
    +
  • Support built in types MiniJuvix-#192 + (janmasrovira)
  • +
  • Support partial application and closure passing in C backend + MiniJuvix-#190 (paulcadman)
  • +
  • Allow open import statements MiniJuvix-#175 + (janmasrovira)
  • +
  • Remove TypeAny and adapt typechecking for literals MiniJuvix-#173 + (janmasrovira)
  • +
  • Allow holes to be refined into function types MiniJuvix-#165 + (janmasrovira)
  • +
  • Support implicit arguments MiniJuvix-#144 + (janmasrovira)
  • +
  • Add support for holes in type signatures MiniJuvix-#141 + (janmasrovira)
  • +
  • Support function closures with no environment in minic + MiniJuvix-#137 (paulcadman)
  • +
  • Add holes for expressions in function clauses and inference support + MiniJuvix-#136 (janmasrovira)
  • +
  • Add "-Oz" optimization flag to clang args MiniJuvix-#133 + (paulcadman)
  • +
  • Add version and help option and root command to the CLI + MiniJuvix-#131 (jonaprieto)
  • +
+

Fixed bugs:

+
    +
  • Fix: Ignore implicit patterns and arguments in termination checking + MiniJuvix-#172 (janmasrovira)
  • +
  • Fix: pretty printing for terminating keyword MiniJuvix-#145 + (jonaprieto)
  • +
+

Merged pull requests:

+
    +
  • Fix: proper error handling for typechecker errors MiniJuvix-#189 + (jonaprieto)
  • +
  • Add juvix version info and date to HTML output MiniJuvix-#186 + (jonaprieto)
  • +
  • Fix: Add check for constructor return types MiniJuvix-#182 + (jonaprieto)
  • +
  • Use Abstract name in Abstract syntax and Micro/MonoJuvix + MiniJuvix-#181 (janmasrovira)
  • +
  • Add an option to specify the path where to put the HTML output + MiniJuvix-#179 (jonaprieto)
  • +
  • Upgrade to ghc-9.2.3 MiniJuvix-#178 + (janmasrovira)
  • +
  • Replace dead link in README with a link to the Juvix book + MiniJuvix-#177 (paulcadman)
  • +
  • Embed HTML assets in the juvix binary MiniJuvix-#176 + (paulcadman)
  • +
  • Fix: identifiers with a keyword prefix cannot be parsed + MiniJuvix-#171 (janmasrovira)
  • +
  • Improve filepath equality MiniJuvix-#170 + (janmasrovira)
  • +
  • Update validity predicate milestone example to 0.2 syntax + MiniJuvix-#167 (paulcadman)
  • +
  • Fix links in documentation and update to new syntax MiniJuvix-#163 + (paulcadman)
  • +
  • Update stdlib to work with version 0.2 MiniJuvix-#160 + (janmasrovira)
  • +
  • Update README usage example to use the compile command + MiniJuvix-#158 (paulcadman)
  • +
  • Remove dead code related to the pipeline MiniJuvix-#156 + (janmasrovira)
  • +
  • Add negative test for AppLeftImplicit MiniJuvix-#154 + (janmasrovira)
  • +
  • Add positive test designed for implicit arguments MiniJuvix-#153 + (janmasrovira)
  • +
  • Remove ExpressionTyped from MicroJuvix MiniJuvix-#143 + (janmasrovira)
  • +
  • Revision for package.yaml and minor deletions MiniJuvix-#135 + (jonaprieto)
  • +
+

v0.1.4 (2022-05-30)

+

Merged pull requests:

+
    +
  • Generic Errors and refactoring MiniJuvix-#123 + (jonaprieto)
  • +
  • Only generates docs if the pull request merges MiniJuvix-#121 + (jonaprieto)
  • +
  • Add initial docs generation website MiniJuvix-#119 + (jonaprieto)
  • +
  • Fix internal link in README MiniJuvix-#116 + (paulcadman)
  • +
  • Add minic-runtime for linking without libc MiniJuvix-#113 + (paulcadman)
  • +
  • Add termination checking to the pipeline MiniJuvix-#111 + (jonaprieto)
  • +
  • Support uncurried higher order functions MiniJuvix-#110 + (paulcadman)
  • +
  • Improve error generation and handling MiniJuvix-#108 + (janmasrovira)
  • +
  • Add MiniC tests with clang+wasi-sdk MiniJuvix-#105 + (paulcadman)
  • +
  • Add usage example and move developer docs MiniJuvix-#96 + (paulcadman)
  • +
  • Refactor warning related stuff MiniJuvix-#91 + (janmasrovira)
  • +
  • Remove Agda backend MiniJuvix-#86 + (paulcadman)
  • +
+

Implemented enhancements:

+
    +
  • Add compile subcommand to generate binaries MiniJuvix-#128
  • +
  • Add intervals to flycheck errors MiniJuvix-#124
  • +
  • Improve error handling in juvix-mode MiniJuvix-#107
  • +
  • Support multiple modules in compilation MiniJuvix-#93
  • +
  • Add compile command to CLI MiniJuvix-#130 + (paulcadman)
  • +
  • Use Interval in GenericErrors MiniJuvix-#125 + (janmasrovira)
  • +
  • Remove dev in the CI and other tweaks MiniJuvix-#118 + (jonaprieto)
  • +
  • Highlight comments correctly MiniJuvix-#106 + (janmasrovira)
  • +
  • Support multiple modules in compilation MiniJuvix-#100 + (janmasrovira)
  • +
  • New target syntax and modular VP examples MiniJuvix-#92 + (jonaprieto)
  • +
+

Fixed bugs:

+
    +
  • Missing error messages when using throw/error MiniJuvix-#117
  • +
  • Fix highlight of comments MiniJuvix-#104
  • +
  • Fix juvix-mode coloring for projects with multiple modules + MiniJuvix-#101
  • +
  • Fix highlight command for modules with import statements + MiniJuvix-#102 (janmasrovira)
  • +
+

Closed issues:

+
    +
  • Deprecate the class JuvixError MiniJuvix-#115
  • +
  • Add ToGenericError instance for the infix parsing errors + MiniJuvix-#114
  • +
  • Compile to WASM without linking libc MiniJuvix-#112
  • +
  • Add the termination checker to the pipeline MiniJuvix-#109
  • +
  • Use clang + wasi-sdk instead of emcc to compile to WASM + MiniJuvix-#103
  • +
  • Move developer tooling docs out of README MiniJuvix-#95
  • +
  • Add pre-commit checks to CI checks MiniJuvix-#94
  • +
  • Support higher order functions in C backend MiniJuvix-#90
  • +
  • Remove dev from the list of branches in the CI MiniJuvix-#89
  • +
  • Refactor warning related stuff MiniJuvix-#87
  • +
  • The Juvix website MiniJuvix-#51
  • +
+

v0.1.3 (2022-05-05)

+

Closed issues:

+
    +
  • Monomorphisation naming inconsistency MiniJuvix-#84
  • +
  • Remove BackendAgda MiniJuvix-#83
  • +
  • Change terminating keyword behavior MiniJuvix-#81
  • +
  • MonoJuvix ExpressionTyped is never used MiniJuvix-#79
  • +
  • Bump stackage nightly and delete allow-newer: true from + stack.yaml MiniJuvix-#75
  • +
  • Generate automatically CHANGELOG and Github Release Notes + MiniJuvix-#73
  • +
  • Make flag –show-name-ids global MiniJuvix-#61
  • +
  • Add C code generation backend MiniJuvix-#60
  • +
  • Add polymorphism MiniJuvix-#59
  • +
  • Add the compile keyword to the frontend syntax (support up to + Scoping) MiniJuvix-#58
  • +
  • Error with undefined or underscores MiniJuvix-#54
  • +
  • Add support for other GHC and Stack stable version MiniJuvix-#52
  • +
  • Autodetect output ANSI support when prettyprinting MiniJuvix-#38
  • +
  • Terminating for type signatures MiniJuvix-#11
  • +
+

Merged pull requests:

+
    +
  • Remove agda backend MiniJuvix-#86 + (paulcadman)
  • +
  • 84 monomorphisation naming inconsistency MiniJuvix-#85 + (janmasrovira)
  • +
  • Change terminating keyword behavior MiniJuvix-#82 + (jonaprieto)
  • +
  • Remove unused constructor ExpressionTyped in Monojuvix MiniJuvix-#80 + (janmasrovira)
  • +
  • Stricter stack builds and pedantic mode for CI MiniJuvix-#78 + (jonaprieto)
  • +
  • Bump stackage version and remove allow-newer MiniJuvix-#76 + (janmasrovira)
  • +
  • Add automatically updates/issues/merged PRs to the changelog + MiniJuvix-#74 (jonaprieto)
  • +
  • Add terminating keyword MiniJuvix-#71 + (jonaprieto)
  • +
  • Monomorphization MiniJuvix-#70 + (janmasrovira)
  • +
  • Remove StatementCompile in AST after scoping MiniJuvix-#69 + (paulcadman)
  • +
  • Add C code generation backend MiniJuvix-#68 + (paulcadman)
  • +
  • Check if stderr supports ANSI and print accordingly MiniJuvix-#67 + (janmasrovira)
  • +
  • Add support for compile (by Jonathan) MiniJuvix-#66 + (paulcadman)
  • +
  • Add NameIdGen effect to the pipeline MiniJuvix-#64 + (janmasrovira)
  • +
  • Make the --show-name-ids flag global MiniJuvix-#63 + (janmasrovira)
  • +
  • Implement type checker with polymorphism MiniJuvix-#62 + (janmasrovira)
  • +
+

v0.1.2 (2022-04-11)

+

Closed issues:

+
    +
  • Add en emacs mode with support for scoped highlighting MiniJuvix-#25
  • +
  • Add support for project root detection through a juvix.yaml file + MiniJuvix-#24
  • +
  • Add CLI cmd to generate juvix autocompletion files for fish and zsh + MiniJuvix-#23
  • +
  • Add pretty and typecheck subcommands to the microjuvix CLI + MiniJuvix-#21
  • +
  • Translate identifiers from MicroJuvix to MiniHaskell (valid Haskell) + MiniJuvix-#19
  • +
  • Implement the MiniHaskell to Haskell translation (prettyprinter) + MiniJuvix-#18
  • +
  • Implementation of a typechecker for MicroJuvix MiniJuvix-#16
  • +
  • Add references to the Abstract AST to update compilation to + MiniHaskell MiniJuvix-#12
  • +
  • Order in the house MiniJuvix-#10
  • +
+

Merged pull requests:

+
    +
  • The Juvix project now follows the same goals as the original Juvix + project. MiniJuvix-#7 (jonaprieto)
  • +
  • Dev→main MiniJuvix-#6 (jonaprieto)
  • +
  • Big update including termination checking MiniJuvix-#5 + (janmasrovira)
  • +
  • Parser and scoper MiniJuvix-#3 + (jonaprieto)
  • +
  • Upgrade to ghc9 and use hpack MiniJuvix-#2 + (janmasrovira)
  • +
  • Merge MiniJuvix-#1 (jonaprieto)
  • +
+

v0.1.1 (2022-03-25)

+
    +
  • Add support in the parser/scoper for Axiom backends
  • +
  • Add support for foreign keyword
  • +
  • Add flag --no-colors for the scope command
  • +
  • Upgrade to GHC 9.2.2
  • +
  • Improve resolution of local symbols in the scoper
  • +
  • Several new tests related to ambiguous symbols
  • +
  • Add --version flag
  • +
  • Add InfoTableBuilder effect for the scoper
  • +
+

Closed issues:

+
    +
  • Add diff output to the test suite MiniJuvix-#9
  • +
  • Improve scoper ambiguity error messages MiniJuvix-#8
  • +
+ + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Bool-src.html b/pull-137/Juvix/Builtin/V1/Bool-src.html new file mode 100644 index 000000000..73286dd72 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Bool-src.html @@ -0,0 +1,9 @@ + +
module Juvix.Builtin.V1.Bool;
+
+--- Inductive definition of booleans.
+builtin bool
+type Bool :=
+  | false
+  | true;
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Bool.html b/pull-137/Juvix/Builtin/V1/Bool.html new file mode 100644 index 000000000..bf5574c3c --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Bool.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Bool

Definitions

builtin bool +type BoolSource#

Inductive definition of booleans.

Constructors

| false
| true
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Fixity-src.html b/pull-137/Juvix/Builtin/V1/Fixity-src.html new file mode 100644 index 000000000..8b531e287 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Fixity-src.html @@ -0,0 +1,29 @@ + +
module Juvix.Builtin.V1.Fixity;
+
+syntax fixity none := none;
+
+syntax fixity rapp := binary {assoc := right};
+syntax fixity lapp := binary {assoc := left; same := rapp};
+syntax fixity seq := binary {assoc := left; above := [lapp]};
+
+syntax fixity functor := binary {assoc := right};
+
+syntax fixity logical := binary {assoc := right; above := [seq]};
+syntax fixity comparison := binary {assoc := none; above := [logical]};
+
+syntax fixity pair := binary {assoc := right};
+syntax fixity cons := binary {assoc := right; above := [pair]};
+
+syntax fixity step := binary {assoc := right};
+syntax fixity range := binary {assoc := right; above := [step]};
+
+syntax fixity additive := binary {
+  assoc := left;
+  above := [comparison; range; cons];
+};
+syntax fixity multiplicative := binary {assoc := left; above := [additive]};
+
+syntax fixity composition := binary {assoc := right; above := [multiplicative]};
+syntax fixity lcomposition := binary {assoc := left; above := [multiplicative]};
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Fixity.html b/pull-137/Juvix/Builtin/V1/Fixity.html new file mode 100644 index 000000000..30ff78142 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Fixity.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Fixity

Definitions

syntax fixity noneSource#

Fixity details

none

syntax fixity rappSource#

Fixity details

binary; right-associative

syntax fixity lappSource#

Fixity details

binary; left-associative
Same precedence as rapp

syntax fixity seqSource#

Fixity details

binary; left-associative
Higher precedence than: lapp

syntax fixity functorSource#

Fixity details

binary; right-associative

syntax fixity logicalSource#

Fixity details

binary; right-associative
Higher precedence than: seq

syntax fixity comparisonSource#

Fixity details

binary
Higher precedence than: logical

syntax fixity pairSource#

Fixity details

binary; right-associative

syntax fixity consSource#

Fixity details

binary; right-associative
Higher precedence than: pair

syntax fixity stepSource#

Fixity details

binary; right-associative

syntax fixity rangeSource#

Fixity details

binary; right-associative
Higher precedence than: step

syntax fixity additiveSource#

Fixity details

binary; left-associative
Higher precedence than: comparison; range; cons

syntax fixity multiplicativeSource#

Fixity details

binary; left-associative
Higher precedence than: additive

syntax fixity compositionSource#

Fixity details

binary; right-associative
Higher precedence than: multiplicative

syntax fixity lcompositionSource#

Fixity details

binary; left-associative
Higher precedence than: multiplicative
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/List-src.html b/pull-137/Juvix/Builtin/V1/List-src.html new file mode 100644 index 000000000..ea167b55e --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/List-src.html @@ -0,0 +1,14 @@ + +
module Juvix.Builtin.V1.List;
+
+import Juvix.Builtin.V1.Fixity open;
+
+syntax operator :: cons;
+--- Inductive list.
+builtin list
+type List (A : Type) :=
+  | --- The empty list
+    nil
+  | --- An element followed by a list
+    :: A (List A);
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/List.html b/pull-137/Juvix/Builtin/V1/List.html new file mode 100644 index 000000000..43fda2023 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/List.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.List

Definitions

builtin list +type List (A : Type)Source#

Inductive list.

Constructors

| nil

The empty list

| :: A (List A)

An element followed by a list

\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Maybe-src.html b/pull-137/Juvix/Builtin/V1/Maybe-src.html new file mode 100644 index 000000000..2ca461662 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Maybe-src.html @@ -0,0 +1,10 @@ + +
module Juvix.Builtin.V1.Maybe;
+
+--- Represents an optional value that may or may not be present. Provides a way
+--- to handle null or missing values in a type-safe manner.
+builtin maybe
+type Maybe A :=
+  | nothing
+  | just A;
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Maybe.html b/pull-137/Juvix/Builtin/V1/Maybe.html new file mode 100644 index 000000000..0969abcdf --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Maybe.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Maybe

Definitions

builtin maybe +type Maybe ASource#

Represents an optional value that may or may not be present. Provides a way to handle null or missing values in a type-safe manner.

Constructors

| nothing
| just A
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Nat-src.html b/pull-137/Juvix/Builtin/V1/Nat-src.html new file mode 100644 index 000000000..35dff899c --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Nat-src.html @@ -0,0 +1,23 @@ + +
module Juvix.Builtin.V1.Nat;
+
+import Juvix.Builtin.V1.Trait.Natural open public;
+import Juvix.Builtin.V1.Trait.FromNatural open public;
+import Juvix.Builtin.V1.Nat.Base open hiding {+; *; div; mod} public;
+import Juvix.Builtin.V1.Nat.Base as Nat;
+
+{-# specialize: true, inline: case #-}
+instance
+fromNaturalNatI : FromNatural Nat :=
+  mkFromNatural@{
+    fromNat (x : Nat) : Nat := x;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+naturalNatI : Natural Nat :=
+  mkNatural@{
+    + := (Nat.+);
+    * := (Nat.*);
+  };
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Nat.html b/pull-137/Juvix/Builtin/V1/Nat.html new file mode 100644 index 000000000..475040b96 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Nat.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Nat

\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Nat/Base-src.html b/pull-137/Juvix/Builtin/V1/Nat/Base-src.html new file mode 100644 index 000000000..2e1602437 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Nat/Base-src.html @@ -0,0 +1,49 @@ + +
module Juvix.Builtin.V1.Nat.Base;
+
+import Juvix.Builtin.V1.Fixity open;
+
+--- Inductive natural numbers. I.e. whole non-negative numbers.
+builtin nat
+type Nat :=
+  | zero
+  | suc Nat;
+
+syntax operator + additive;
+
+--- Addition for ;Nat;s.
+builtin nat-plus
++ : Nat -> Nat -> Nat
+  | zero b := b
+  | (suc a) b := suc (a + b);
+
+syntax operator * multiplicative;
+
+--- Multiplication for ;Nat;s.
+builtin nat-mul
+* : Nat -> Nat -> Nat
+  | zero _ := zero
+  | (suc a) b := b + a * b;
+
+--- Truncated subtraction for ;Nat;s.
+builtin nat-sub
+sub : Nat -> Nat -> Nat
+  | zero _ := zero
+  | n zero := n
+  | (suc n) (suc m) := sub n m;
+
+--- Division for ;Nat;s. Returns ;zero; if the first element is ;zero;.
+builtin nat-udiv
+terminating
+udiv : Nat -> Nat -> Nat
+  | zero _ := zero
+  | n m := suc (udiv (sub n m) m);
+
+--- Division for ;Nat;s.
+builtin nat-div
+div (n m : Nat) : Nat := udiv (sub (suc n) m) m;
+
+--- Modulo for ;Nat;s.
+builtin nat-mod
+mod (n m : Nat) : Nat := sub n (div n m * m);
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Nat/Base.html b/pull-137/Juvix/Builtin/V1/Nat/Base.html new file mode 100644 index 000000000..5e076f424 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Nat/Base.html @@ -0,0 +1,10 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Nat.Base

Definitions

builtin nat +type NatSource#

Inductive natural numbers. I.e. whole non-negative numbers.

Constructors

| zero
| suc Nat

builtin nat-plus ++ : Nat -> Nat -> NatSource#

Addition for Nats.

builtin nat-mul +* : Nat -> Nat -> NatSource#

Multiplication for Nats.

builtin nat-sub +sub : Nat -> Nat -> NatSource#

Truncated subtraction for Nats.

builtin nat-udiv +terminating +udiv : Nat -> Nat -> NatSource#

Division for Nats. Returns zero if the first element is zero.

builtin nat-div +div (n m : Nat) : NatSource#

Division for Nats.

builtin nat-mod +mod (n m : Nat) : NatSource#

Modulo for Nats.

\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/String-src.html b/pull-137/Juvix/Builtin/V1/String-src.html new file mode 100644 index 000000000..15a5035c5 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/String-src.html @@ -0,0 +1,14 @@ + +
module Juvix.Builtin.V1.String;
+
+import Juvix.Builtin.V1.Fixity open;
+
+--- Primitive representation of a sequence of characters.
+builtin string
+axiom String : Type;
+
+syntax operator ++str cons;
+--- Concatenation of two ;String;s.
+builtin string-concat
+axiom ++str : String -> String -> String;
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/String.html b/pull-137/Juvix/Builtin/V1/String.html new file mode 100644 index 000000000..fe5b11e8e --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/String.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.String

Definitions

builtin string +axiom String : TypeSource#

Primitive representation of a sequence of characters.

builtin string-concat +axiom ++str : String -> String -> StringSource#

Concatenation of two Strings.

\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Trait/FromNatural-src.html b/pull-137/Juvix/Builtin/V1/Trait/FromNatural-src.html new file mode 100644 index 000000000..1daee4f97 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Trait/FromNatural-src.html @@ -0,0 +1,14 @@ + +
module Juvix.Builtin.V1.Trait.FromNatural;
+
+import Juvix.Builtin.V1.Nat.Base open using {Nat};
+
+trait
+type FromNatural A :=
+  mkFromNatural@{
+    builtin from-nat
+    fromNat : Nat -> A;
+  };
+
+open FromNatural public;
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Trait/FromNatural.html b/pull-137/Juvix/Builtin/V1/Trait/FromNatural.html new file mode 100644 index 000000000..4085d1f19 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Trait/FromNatural.html @@ -0,0 +1,6 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Trait.FromNatural

Definitions

trait +type FromNatural ASource#

Constructors

mkFromNatural@{ + builtin from-nat + fromNat : Nat -> A; +}

open FromNatural public

\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Trait/Natural-src.html b/pull-137/Juvix/Builtin/V1/Trait/Natural-src.html new file mode 100644 index 000000000..f18c7b80f --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Trait/Natural-src.html @@ -0,0 +1,21 @@ + +
module Juvix.Builtin.V1.Trait.Natural;
+
+import Juvix.Builtin.V1.Nat.Base open using {Nat};
+import Juvix.Builtin.V1.Fixity open;
+import Juvix.Builtin.V1.Trait.FromNatural open;
+
+trait
+type Natural A :=
+  mkNatural@{
+    {{FromNaturalI}} : FromNatural A;
+    syntax operator + additive;
+    {-# isabelle-operator: {name: "+", prec: 65, assoc: left} #-}
+    + : A -> A -> A;
+    syntax operator * multiplicative;
+    {-# isabelle-operator: {name: "*", prec: 70, assoc: left} #-}
+    * : A -> A -> A;
+  };
+
+open Natural public;
+
\ No newline at end of file diff --git a/pull-137/Juvix/Builtin/V1/Trait/Natural.html b/pull-137/Juvix/Builtin/V1/Trait/Natural.html new file mode 100644 index 000000000..56838e302 --- /dev/null +++ b/pull-137/Juvix/Builtin/V1/Trait/Natural.html @@ -0,0 +1,11 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Juvix.Builtin.V1.Trait.Natural

Definitions

trait +type Natural ASource#

Constructors

mkNatural@{ + {{FromNaturalI}} : FromNatural A; + syntax operator + additive; + {-# isabelle-operator: {name: "+", prec: 65, assoc: left} #-} + + : A -> A -> A; + syntax operator * multiplicative; + {-# isabelle-operator: {name: "*", prec: 70, assoc: left} #-} + * : A -> A -> A; +}

open Natural public

\ No newline at end of file diff --git a/pull-137/Package.juvix b/pull-137/Package.juvix new file mode 100644 index 000000000..86e1e3d7f --- /dev/null +++ b/pull-137/Package.juvix @@ -0,0 +1,22 @@ +{-# format: false #-} +module Package; + +import PackageDescription.V2 open; + +package : Package := +defaultPackage@{ +name := "juvix-docs"; +dependencies := +[ +--8<-- [start:juvix-test] +github "anoma" "juvix-test" "v0.18.0" +--8<-- [end:juvix-test] +; +--8<-- [start:juvix-quickcheck] +github "anoma" "juvix-quickcheck" "v0.18.0" +--8<-- [end:juvix-quickcheck] +; +--8<-- [start:juvix-stdlib] +github "anoma" "juvix-stdlib" "v0.9.0" +--8<-- [end:juvix-stdlib] +]}; diff --git a/pull-137/README-src.html b/pull-137/README-src.html new file mode 100644 index 000000000..42379d9a8 --- /dev/null +++ b/pull-137/README-src.html @@ -0,0 +1,5 @@ + +
module README;
+
+import Stdlib.Prelude open;
+
\ No newline at end of file diff --git a/pull-137/README.html b/pull-137/README.html new file mode 100644 index 000000000..514dd938f --- /dev/null +++ b/pull-137/README.html @@ -0,0 +1,1278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Home - Juvix Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +

Juvix a language for intent-centric and declarative decentralized applications

+
+ +
+

Juvix is an open-source functional language with static typing and +strict semantics. It is the programming language for the +Anoma's blockchain. The primary purpose of this language is +to encode Anoma's intents, enabling private and transparent +execution through the Abstract Resource +Machine on the Anoma +blockchain.

+

Juvix, initially designed for Anoma, provides features typical of any +high-level programming language with many more on the horizon. It can +compile programs into native executable, WASM, Cairo bytecode and +arithmetic circuits facilitating zero-knowledge proofs.

+

Stay tuned for Juvix updates and follow us on Twitter!

+
+
+
+

... a brief overview of what Juvix is about

+
+
+
    +
  • +

    How-to guides

    +
    +

    Learn how to install Juvix on macOS or Linux, as well as compile and + document your Juvix projects.

    +

    Quick start

    +

    How-to guides

    +
  • +
  • +

    Tutorials

    +
    +

    Master the essentials of Juvix through a series of +tailored examples, tutorials and technical explanations.

    +

    Essential Juvix

    +

    Functional programming with Juvix

    +

    Tutorials

    +
  • +
  • +

    Talks and Workshops

    +
    +

    A collection of talks and workshop videos showcasing Juvix. Gain valuable +insights and inspiration from our presentations at various conferences.

    +

    Juvix videos

    +
  • +
  • +

    Reference

    +
    +

    Explore the language reference, milestone examples, and tooling +documentation!

    +

    Reference

    +

    Standard library

    +

    Packages and projects

    +
  • +
  • +

    Blog

    +
    +

    Check out our blog to discover new features in the upcoming release, along +with helpful examples and more.

    +

    Blog

    +
  • +
  • +

    Open Source, GPL3.0

    +
    +

    Juvix is licensed under GPL3 and available on GitHub.

    +

    License

    +
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pull-137/Stdlib/Data/BinaryTree-src.html b/pull-137/Stdlib/Data/BinaryTree-src.html new file mode 100644 index 000000000..d093d70b0 --- /dev/null +++ b/pull-137/Stdlib/Data/BinaryTree-src.html @@ -0,0 +1,27 @@ + +
module Stdlib.Data.BinaryTree;
+
+import Stdlib.Data.Nat open;
+import Stdlib.Data.List open;
+
+type BinaryTree (A : Type) :=
+  | leaf
+  | node@{
+      left : BinaryTree A;
+      element : A;
+      right : BinaryTree A;
+    };
+
+--- fold a tree in depth-first order
+fold {A B} (f : A -> B -> B -> B) (acc : B) (tree : BinaryTree A) : B :=
+  let
+    go (acc : B) : BinaryTree A -> B
+      | leaf := acc
+      | (node l a r) := f a (go acc l) (go acc r);
+  in go acc tree;
+
+length {A} (tree : BinaryTree A) : Nat := fold \{_ l r := 1 + l + r} 0 tree;
+
+toList {A} (tree : BinaryTree A) : List A :=
+  fold \{e ls rs := e :: ls ++ rs} nil tree;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/BinaryTree.html b/pull-137/Stdlib/Data/BinaryTree.html new file mode 100644 index 000000000..6761a6b23 --- /dev/null +++ b/pull-137/Stdlib/Data/BinaryTree.html @@ -0,0 +1,6 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.BinaryTree

Definitions

type BinaryTree (A : Type)Source#

Constructors

| leaf
| node@{ + left : BinaryTree A; + element : A; + right : BinaryTree A; + }

fold {A B} (f : A -> B -> B -> B) (acc : B) (tree : BinaryTree A) : BSource#

fold a tree in depth-first order

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Bool-src.html b/pull-137/Stdlib/Data/Bool-src.html new file mode 100644 index 000000000..3e1788a29 --- /dev/null +++ b/pull-137/Stdlib/Data/Bool-src.html @@ -0,0 +1,27 @@ + +
module Stdlib.Data.Bool;
+
+import Stdlib.Data.Bool.Base open public;
+import Stdlib.Data.Pair.Base open;
+import Stdlib.Data.String.Base open;
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+
+{-# specialize: true, inline: case #-}
+deriving instance
+eqBoolI : Eq Bool;
+
+{-# specialize: true, inline: case #-}
+deriving instance
+ordBoolI : Ord Bool;
+
+instance
+showBoolI : Show Bool :=
+  mkShow@{
+    show (x : Bool) : String :=
+      if 
+        | x := "true"
+        | else := "false";
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Bool.html b/pull-137/Stdlib/Data/Bool.html new file mode 100644 index 000000000..33521e359 --- /dev/null +++ b/pull-137/Stdlib/Data/Bool.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Bool

Definitions

import Stdlib.Data.Bool.Base open public

{-# specialize: true, inline: case #-} +deriving instance +eqBoolI : Eq BoolSource#

{-# specialize: true, inline: case #-} +deriving instance +ordBoolI : Ord BoolSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Bool/Base-src.html b/pull-137/Stdlib/Data/Bool/Base-src.html new file mode 100644 index 000000000..59043c0c4 --- /dev/null +++ b/pull-137/Stdlib/Data/Bool/Base-src.html @@ -0,0 +1,43 @@ + +
module Stdlib.Data.Bool.Base;
+
+import Juvix.Builtin.V1.Bool open public;
+import Stdlib.Data.Fixity open;
+
+--- Logical negation.
+{-# isabelle-function: {name: "\\<not>"} #-}
+not : Bool -> Bool
+  | true := false
+  | false := true;
+
+syntax operator || logical;
+
+--- Logical disjunction. Evaluated lazily. Cannot be partially applied
+builtin bool-or
+|| : Bool -> Bool -> Bool
+  | true _ := true
+  | false a := a;
+
+syntax operator && logical;
+
+--- Logical conjunction. Evaluated lazily. Cannot be partially applied.
+builtin bool-and
+&& : Bool -> Bool -> Bool
+  | true a := a
+  | false _ := false;
+
+--- Returns the first argument if ;true;, otherwise it returns the second argument. Evaluated lazily. Cannot be partially applied.
+builtin bool-if
+ite : {A : Type} -> Bool -> A -> A -> A
+  | true a _ := a
+  | false _ b := b;
+
+--- Logical disjunction.
+or (a b : Bool) : Bool := a || b;
+
+--- Logical conjunction.
+and (a b : Bool) : Bool := a && b;
+
+builtin assert
+assert (x : Bool) : Bool := x;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Bool/Base.html b/pull-137/Stdlib/Data/Bool/Base.html new file mode 100644 index 000000000..8a9c7851d --- /dev/null +++ b/pull-137/Stdlib/Data/Bool/Base.html @@ -0,0 +1,6 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Bool.Base

Definitions

import Juvix.Builtin.V1.Bool open public

not : Bool -> BoolSource#

Logical negation.

builtin bool-or +|| : Bool -> Bool -> BoolSource#

Logical disjunction. Evaluated lazily. Cannot be partially applied

builtin bool-and +&& : Bool -> Bool -> BoolSource#

Logical conjunction. Evaluated lazily. Cannot be partially applied.

builtin bool-if +ite : {A : Type} -> Bool -> A -> A -> ASource#

Returns the first argument if true, otherwise it returns the second argument. Evaluated lazily. Cannot be partially applied.

or (a b : Bool) : BoolSource#

Logical disjunction.

and (a b : Bool) : BoolSource#

Logical conjunction.

builtin assert +assert (x : Bool) : BoolSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Byte-src.html b/pull-137/Stdlib/Data/Byte-src.html new file mode 100644 index 000000000..8f0dee62b --- /dev/null +++ b/pull-137/Stdlib/Data/Byte-src.html @@ -0,0 +1,30 @@ + +
module Stdlib.Data.Byte;
+
+import Stdlib.Data.Byte.Base open using {Byte} public;
+import Stdlib.Data.Byte.Base as Byte public;
+import Stdlib.Function open;
+import Stdlib.Data.Nat;
+import Stdlib.Data.String.Base open;
+
+import Stdlib.Trait.Eq open public;
+import Stdlib.Trait.FromNatural open;
+import Stdlib.Trait.Show open public;
+
+{-# specialize: true, inline: case #-}
+instance
+eqByteI : Eq Byte := mkEq (Byte.==);
+
+instance
+showByteI : Show Byte :=
+  mkShow@{
+    show (x : Byte) : String := Show.show (Byte.toNat x);
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+fromNaturalByteI : FromNatural Byte :=
+  mkFromNatural@{
+    fromNat := Byte.fromNat;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Byte.html b/pull-137/Stdlib/Data/Byte.html new file mode 100644 index 000000000..167af512c --- /dev/null +++ b/pull-137/Stdlib/Data/Byte.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Byte

Definitions

import Stdlib.Data.Byte.Base open using {Byte} public

import Stdlib.Data.Byte.Base as Byte public

import Stdlib.Trait.Eq open public

import Stdlib.Trait.Show open public

instance +eqByteI : Eq ByteSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Byte/Base-src.html b/pull-137/Stdlib/Data/Byte/Base-src.html new file mode 100644 index 000000000..808739ad6 --- /dev/null +++ b/pull-137/Stdlib/Data/Byte/Base-src.html @@ -0,0 +1,24 @@ + +
module Stdlib.Data.Byte.Base;
+
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Nat.Base open;
+
+--- An 8-bit unsigned integer.
+builtin byte
+axiom Byte : Type;
+
+--- Converts a ;Nat; to a ;Byte;. It takes the modulus of the input natural number with 256.
+builtin byte-from-nat
+axiom fromNat : Nat -> Byte;
+
+--- Converts a ;Byte; to the corresponding ;Nat;.
+builtin byte-to-nat
+axiom toNat : Byte -> Nat;
+
+syntax operator == comparison;
+
+builtin byte-eq
+axiom == : Byte -> Byte -> Bool;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Byte/Base.html b/pull-137/Stdlib/Data/Byte/Base.html new file mode 100644 index 000000000..b462a4a82 --- /dev/null +++ b/pull-137/Stdlib/Data/Byte/Base.html @@ -0,0 +1,6 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Byte.Base

Definitions

builtin byte +axiom Byte : TypeSource#

An 8-bit unsigned integer.

builtin byte-from-nat +axiom fromNat : Nat -> ByteSource#

Converts a Nat to a Byte. It takes the modulus of the input natural number with 256.

builtin byte-to-nat +axiom toNat : Byte -> NatSource#

Converts a Byte to the corresponding Nat.

builtin byte-eq +axiom == : Byte -> Byte -> BoolSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Field-src.html b/pull-137/Stdlib/Data/Field-src.html new file mode 100644 index 000000000..4e4c8c3c8 --- /dev/null +++ b/pull-137/Stdlib/Data/Field-src.html @@ -0,0 +1,57 @@ + +
module Stdlib.Data.Field;
+
+import Stdlib.Data.Field.Base open using {Field} public;
+import Stdlib.Data.Field.Base as Field public;
+import Stdlib.Data.String.Base open;
+import Stdlib.Data.Nat;
+
+import Stdlib.Trait.Eq open public;
+import Stdlib.Trait.Show open public;
+import Stdlib.Trait.Natural open public;
+import Stdlib.Trait.FromNatural open;
+import Stdlib.Trait.Integral open public;
+import Stdlib.Trait.Numeric open public;
+
+{-# specialize: true, inline: case #-}
+instance
+eqFieldI : Eq Field := mkEq (Field.==);
+
+instance
+showFieldI : Show Field :=
+  mkShow@{
+    show (f : Field) : String := Show.show (Field.toNat f);
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+fromNaturalFieldI : FromNatural Field :=
+  mkFromNatural@{
+    fromNat := Field.fromNat;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+naturalFieldI : Natural Field :=
+  mkNatural@{
+    + := (Field.+);
+    * := (Field.*);
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+integralFieldI : Integral Field :=
+  mkIntegral@{
+    naturalI := naturalFieldI;
+    - := (Field.-);
+    fromInt := Field.fromInt;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+numericFieldI : Numeric Field :=
+  mkNumeric@{
+    integralI := integralFieldI;
+    / := (Field./);
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Field.html b/pull-137/Stdlib/Data/Field.html new file mode 100644 index 000000000..4a3f6e7d8 --- /dev/null +++ b/pull-137/Stdlib/Data/Field.html @@ -0,0 +1,8 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Field

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Field/Base-src.html b/pull-137/Stdlib/Data/Field/Base-src.html new file mode 100644 index 000000000..30de1ac3b --- /dev/null +++ b/pull-137/Stdlib/Data/Field/Base-src.html @@ -0,0 +1,46 @@ + +
module Stdlib.Data.Field.Base;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Nat.Base open;
+import Stdlib.Data.Int.Base open hiding {toNat};
+import Stdlib.Data.Bool.Base open;
+
+builtin field
+axiom Field : Type;
+
+syntax operator + additive;
+
+builtin field-add
+axiom + : Field -> Field -> Field;
+
+syntax operator - additive;
+
+builtin field-sub
+axiom - : Field -> Field -> Field;
+
+syntax operator * multiplicative;
+
+builtin field-mul
+axiom * : Field -> Field -> Field;
+
+syntax operator / multiplicative;
+
+builtin field-div
+axiom / : Field -> Field -> Field;
+
+syntax operator == comparison;
+
+builtin field-eq
+axiom == : Field -> Field -> Bool;
+
+builtin field-from-int
+axiom fromInt : Int -> Field;
+
+builtin field-to-nat
+axiom toNat : Field -> Nat;
+
+fromNat (n : Nat) : Field := fromInt (ofNat n);
+
+toInt (f : Field) : Int := ofNat (toNat f);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Field/Base.html b/pull-137/Stdlib/Data/Field/Base.html new file mode 100644 index 000000000..2ad7a66d2 --- /dev/null +++ b/pull-137/Stdlib/Data/Field/Base.html @@ -0,0 +1,10 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Field.Base

Definitions

builtin field +axiom Field : TypeSource#

builtin field-add +axiom + : Field -> Field -> FieldSource#

builtin field-sub +axiom - : Field -> Field -> FieldSource#

builtin field-mul +axiom * : Field -> Field -> FieldSource#

builtin field-div +axiom / : Field -> Field -> FieldSource#

builtin field-eq +axiom == : Field -> Field -> BoolSource#

builtin field-from-int +axiom fromInt : Int -> FieldSource#

builtin field-to-nat +axiom toNat : Field -> NatSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Fixity-src.html b/pull-137/Stdlib/Data/Fixity-src.html new file mode 100644 index 000000000..c4f8915a7 --- /dev/null +++ b/pull-137/Stdlib/Data/Fixity-src.html @@ -0,0 +1,5 @@ + +
module Stdlib.Data.Fixity;
+
+import Juvix.Builtin.V1.Fixity open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Fixity.html b/pull-137/Stdlib/Data/Fixity.html new file mode 100644 index 000000000..14a98d4d5 --- /dev/null +++ b/pull-137/Stdlib/Data/Fixity.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Fixity

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int-src.html b/pull-137/Stdlib/Data/Int-src.html new file mode 100644 index 000000000..4e206bfdb --- /dev/null +++ b/pull-137/Stdlib/Data/Int-src.html @@ -0,0 +1,70 @@ + +
module Stdlib.Data.Int;
+
+import Stdlib.Data.Int.Base open hiding {module Int; +; -; *; div; mod} public;
+
+module Int;
+  open Stdlib.Data.Int.Base.Int public;
+
+  import Stdlib.Data.Int.Base open public;
+  import Stdlib.Data.Int.Ord open public;
+end;
+
+import Stdlib.Data.String open;
+import Stdlib.Data.Bool open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait.Natural open;
+import Stdlib.Trait.FromNatural open;
+import Stdlib.Trait.Integral open;
+import Stdlib.Trait.DivMod open;
+
+--- Converts an ;Int; into ;String;.
+builtin int-to-string
+axiom intToString : Int -> String;
+
+{-# specialize: true, inline: case #-}
+instance
+eqIntI : Eq Int := mkEq (Int.==);
+
+{-# specialize: true, inline: case #-}
+instance
+ordIntI : Ord Int := mkOrd Int.compare;
+
+instance
+showIntI : Show Int := mkShow intToString;
+
+{-# specialize: true, inline: case #-}
+instance
+fromNaturalIntI : FromNatural Int :=
+  mkFromNatural@{
+    fromNat := ofNat;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+naturalIntI : Natural Int :=
+  mkNatural@{
+    + := (Int.+);
+    * := (Int.*);
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+integralIntI : Integral Int :=
+  mkIntegral@{
+    naturalI := naturalIntI;
+    - := (Int.-);
+    fromInt (x : Int) : Int := x;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+divModIntI : DivMod Int :=
+  mkDivMod@{
+    div := Int.div;
+    mod := Int.mod;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int.html b/pull-137/Stdlib/Data/Int.html new file mode 100644 index 000000000..8cb16de78 --- /dev/null +++ b/pull-137/Stdlib/Data/Int.html @@ -0,0 +1,10 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Int

Definitions

import Stdlib.Data.Int.Base open hiding {module Int; +; -; *; div; mod} public

module IntSource#

open Stdlib.Data.Int.Base.Int public

import Stdlib.Data.Int.Base open public

import Stdlib.Data.Int.Ord open public

builtin int-to-string +axiom intToString : Int -> StringSource#

Converts an Int into String.

instance +eqIntI : Eq IntSource#

instance +ordIntI : Ord IntSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int/Base-src.html b/pull-137/Stdlib/Data/Int/Base-src.html new file mode 100644 index 000000000..8f98cd0db --- /dev/null +++ b/pull-137/Stdlib/Data/Int/Base-src.html @@ -0,0 +1,97 @@ + +
module Stdlib.Data.Int.Base;
+
+import Stdlib.Data.Fixity open;
+
+import Stdlib.Data.Nat.Base as Nat;
+open Nat using {Nat; zero; suc; sub};
+
+import Stdlib.Data.Bool.Base open;
+
+--- Inductive integers. I.e. whole numbers that can be positive, zero, or negative.
+builtin int
+type Int :=
+  | --- ofNat n represents the integer n
+    ofNat Nat
+  | --- negSuc n represents the integer -(n + 1)
+    negSuc Nat;
+
+--- Converts an ;Int; to a ;Nat;. If the ;Int; is negative, it returns ;zero;.
+toNat (int : Int) : Nat :=
+  case int of
+    | ofNat n := n
+    | negSuc _ := zero;
+
+--- Non-negative predicate for ;Int;s.
+builtin int-nonneg
+nonNeg : Int -> Bool
+  | (ofNat n) := true
+  | (negSuc _) := false;
+
+--- Subtraction for ;Nat;s.
+builtin int-sub-nat
+intSubNat (n m : Nat) : Int :=
+  case sub n m of
+    | zero := ofNat (Nat.sub m n)
+    | suc k := negSuc k;
+
+syntax operator + additive;
+
+--- Addition for ;Int;s.
+builtin int-plus
++ : Int -> Int -> Int
+  | (ofNat m) (ofNat n) := ofNat (m Nat.+ n)
+  | (ofNat m) (negSuc n) := intSubNat m (suc n)
+  | (negSuc m) (ofNat n) := intSubNat n (suc m)
+  | (negSuc m) (negSuc n) := negSuc (suc (m Nat.+ n));
+
+--- Negation for ;Nat;s.
+builtin int-neg-nat
+negNat : Nat -> Int
+  | zero := ofNat zero
+  | (suc n) := negSuc n;
+
+--- Negation for ;Int;s.
+builtin int-neg
+neg : Int -> Int
+  | (ofNat n) := negNat n
+  | (negSuc n) := ofNat (suc n);
+
+syntax operator * multiplicative;
+
+--- Multiplication for ;Int;s.
+builtin int-mul
+* : Int -> Int -> Int
+  | (ofNat m) (ofNat n) := ofNat (m Nat.* n)
+  | (ofNat m) (negSuc n) := negNat (m Nat.* suc n)
+  | (negSuc m) (ofNat n) := negNat (suc m Nat.* n)
+  | (negSuc m) (negSuc n) := ofNat (suc m Nat.* suc n);
+
+syntax operator - additive;
+
+--- Subtraction for ;Int;s.
+builtin int-sub
+- (n m : Int) : Int := m + neg n;
+
+--- Division for ;Int;s.
+builtin int-div
+div : Int -> Int -> Int
+  | (ofNat m) (ofNat n) := ofNat (Nat.div m n)
+  | (ofNat m) (negSuc n) := negNat (Nat.div m (suc n))
+  | (negSuc m) (ofNat n) := negNat (Nat.div (suc m) n)
+  | (negSuc m) (negSuc n) := ofNat (Nat.div (suc m) (suc n));
+
+--- Modulo for ;Int;s.
+builtin int-mod
+mod : Int -> Int -> Int
+  | (ofNat m) (ofNat n) := ofNat (Nat.mod m n)
+  | (ofNat m) (negSuc n) := ofNat (Nat.mod m (suc n))
+  | (negSuc m) (ofNat n) := negNat (Nat.mod (suc m) n)
+  | (negSuc m) (negSuc n) := negNat (Nat.mod (suc m) (suc n));
+
+--- Absolute value
+abs (int : Int) : Nat :=
+  case int of
+    | ofNat n := n
+    | negSuc n := suc n;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int/Base.html b/pull-137/Stdlib/Data/Int/Base.html new file mode 100644 index 000000000..81cc5ba4d --- /dev/null +++ b/pull-137/Stdlib/Data/Int/Base.html @@ -0,0 +1,12 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Int.Base

Definitions

builtin int +type IntSource#

Inductive integers. I.e. whole numbers that can be positive, zero, or negative.

Constructors

| ofNat Nat

ofNat n represents the integer n

| negSuc Nat

negSuc n represents the integer -(n + 1)

toNat (int : Int) : NatSource#

Converts an Int to a Nat. If the Int is negative, it returns zero.

builtin int-nonneg +nonNeg : Int -> BoolSource#

Non-negative predicate for Ints.

builtin int-sub-nat +intSubNat (n m : Nat) : IntSource#

Subtraction for Nats.

builtin int-plus ++ : Int -> Int -> IntSource#

Addition for Ints.

builtin int-neg-nat +negNat : Nat -> IntSource#

Negation for Nats.

builtin int-neg +neg : Int -> IntSource#

Negation for Ints.

builtin int-mul +* : Int -> Int -> IntSource#

Multiplication for Ints.

builtin int-sub +- (n m : Int) : IntSource#

Subtraction for Ints.

builtin int-div +div : Int -> Int -> IntSource#

Division for Ints.

builtin int-mod +mod : Int -> Int -> IntSource#

Modulo for Ints.

abs (int : Int) : NatSource#

Absolute value

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int/Ord-src.html b/pull-137/Stdlib/Data/Int/Ord-src.html new file mode 100644 index 000000000..35dfd97c5 --- /dev/null +++ b/pull-137/Stdlib/Data/Int/Ord-src.html @@ -0,0 +1,62 @@ + +
module Stdlib.Data.Int.Ord;
+
+import Stdlib.Data.Fixity open;
+
+import Stdlib.Data.Int.Base open;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Trait.Ord open using {Equal; LessThan; GreaterThan; Ordering};
+
+import Stdlib.Data.Nat.Base as Nat;
+import Stdlib.Data.Nat.Ord as Nat;
+
+syntax operator == comparison;
+
+--- Tests for equality.
+builtin int-eq
+== : Int -> Int -> Bool
+  | (ofNat m) (ofNat n) := m Nat.== n
+  | (negSuc m) (negSuc n) := m Nat.== n
+  | _ _ := false;
+
+syntax operator /= comparison;
+
+--- Tests for inequality.
+/= (m n : Int) : Bool := not (m == n);
+
+syntax operator <= comparison;
+
+--- Returns ;true; iff the first element is less than or equal to the second.
+builtin int-le
+<= (m n : Int) : Bool := nonNeg (n - m);
+
+syntax operator < comparison;
+
+--- Returns ;true; iff the first element is less than the second.
+builtin int-lt
+< (m n : Int) : Bool := m + ofNat (Nat.suc Nat.zero) <= n;
+
+syntax operator > comparison;
+
+--- Returns ;true; iff the first element is greater than the second.
+> (m n : Int) : Bool := n < m;
+
+syntax operator >= comparison;
+
+--- Returns ;true; iff the first element is greater than or equal to the second.
+>= (m n : Int) : Bool := n <= m;
+
+--- Tests for ;Ordering;.
+{-# inline: true #-}
+compare (m n : Int) : Ordering :=
+  if 
+    | m == n := Equal
+    | m < n := LessThan
+    | else := GreaterThan;
+
+--- Returns the smallest ;Int;.
+min (x y : Int) : Int := ite (x < y) x y;
+
+--- Returns the biggest ;Int;.
+max (x y : Int) : Int := ite (x > y) x y;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Int/Ord.html b/pull-137/Stdlib/Data/Int/Ord.html new file mode 100644 index 000000000..afcd7d682 --- /dev/null +++ b/pull-137/Stdlib/Data/Int/Ord.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Int.Ord

Definitions

builtin int-eq +== : Int -> Int -> BoolSource#

Tests for equality.

/= (m n : Int) : BoolSource#

Tests for inequality.

builtin int-le +<= (m n : Int) : BoolSource#

Returns true iff the first element is less than or equal to the second.

builtin int-lt +< (m n : Int) : BoolSource#

Returns true iff the first element is less than the second.

> (m n : Int) : BoolSource#

Returns true iff the first element is greater than the second.

>= (m n : Int) : BoolSource#

Returns true iff the first element is greater than or equal to the second.

min (x y : Int) : IntSource#

Returns the smallest Int.

max (x y : Int) : IntSource#

Returns the biggest Int.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/List-src.html b/pull-137/Stdlib/Data/List-src.html new file mode 100644 index 000000000..3e59aec9d --- /dev/null +++ b/pull-137/Stdlib/Data/List-src.html @@ -0,0 +1,108 @@ + +
module Stdlib.Data.List;
+
+import Stdlib.Data.List.Base open public;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.String.Base open;
+import Stdlib.Function open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait open;
+import Stdlib.Trait.Partial open;
+import Stdlib.Trait.Foldable open using {
+  Foldable;
+  module Polymorphic;
+  fromPolymorphicFoldable;
+};
+
+--- 𝒪(1). Partial function that returns the first element of a ;List;.
+phead {A} {{Partial}} : List A -> A
+  | (x :: _) := x
+  | nil := fail "head: empty list";
+
+{-# specialize: true, inline: case #-}
+instance
+eqListI {A} {{Eq A}} : Eq (List A) :=
+  let
+    go : List A -> List A -> Bool
+      | nil nil := true
+      | nil _ := false
+      | _ nil := false
+      | (x :: xs) (y :: ys) :=
+        if 
+          | Eq.eq x y := go xs ys
+          | else := false;
+  in mkEq go;
+
+isMember {A} {{Eq A}} (elem : A) (list : List A) : Bool :=
+  isElement (Eq.eq) elem list;
+
+{-# specialize: true, inline: case #-}
+instance
+ordListI {A} {{Ord A}} : Ord (List A) :=
+  let
+    go : List A -> List A -> Ordering
+      | nil nil := Equal
+      | nil _ := LessThan
+      | _ nil := GreaterThan
+      | (x :: xs) (y :: ys) :=
+        case Ord.cmp x y of
+          | LessThan := LessThan
+          | GreaterThan := GreaterThan
+          | Equal := go xs ys;
+  in mkOrd go;
+
+instance
+showListI {A} {{Show A}} : Show (List A) :=
+  let
+    go : List A -> String
+      | nil := "nil"
+      | (x :: xs) := Show.show x ++str " :: " ++str go xs;
+  in mkShow@{
+       show (list : List A) : String :=
+         case list of
+           | nil := "nil"
+           | s := "(" ++str go s ++str ")";
+     };
+
+{-# specialize: true, inline: case #-}
+instance
+functorListI : Functor List :=
+  mkFunctor@{
+    map := listMap;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+monomorphicFunctorListI {A} : Monomorphic.Functor (List A) A :=
+  fromPolymorphicFunctor;
+
+{-# specialize: true, inline: case #-}
+instance
+polymorphicFoldableListI : Polymorphic.Foldable List :=
+  Polymorphic.mkFoldable@{
+    for := listFor;
+    rfor := listRfor;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+foldableListI {A} : Foldable (List A) A := fromPolymorphicFoldable;
+
+instance
+applicativeListI : Applicative List :=
+  mkApplicative@{
+    pure {A} (a : A) : List A := [a];
+    ap {A B} : (listOfFuns : List (A -> B)) -> (listOfAs : List A) -> List B
+      | [] _ := []
+      | (f :: fs) l := map f l ++ ap fs l;
+  };
+
+instance
+monadListI : Monad List :=
+  mkMonad@{
+    bind := flip concatMap;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/List.html b/pull-137/Stdlib/Data/List.html new file mode 100644 index 000000000..88bd703a6 --- /dev/null +++ b/pull-137/Stdlib/Data/List.html @@ -0,0 +1,11 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.List

Definitions

import Stdlib.Data.List.Base open public

phead {A} {{Partial}} : List A -> ASource#

𝒪(1). Partial function that returns the first element of a List.

instance +eqListI {A} {{Eq A}} : Eq (List A)Source#

isMember {A} {{Eq A}} (elem : A) (list : List A) : BoolSource#

instance +ordListI {A} {{Ord A}} : Ord (List A)Source#

instance +showListI {A} {{Show A}} : Show (List A)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/List/Base-src.html b/pull-137/Stdlib/Data/List/Base-src.html new file mode 100644 index 000000000..a2d20b2a8 --- /dev/null +++ b/pull-137/Stdlib/Data/List/Base-src.html @@ -0,0 +1,260 @@ + +
module Stdlib.Data.List.Base;
+
+import Juvix.Builtin.V1.List open public;
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Function open;
+import Stdlib.Data.Nat.Base open;
+import Stdlib.Data.Maybe.Base open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Data.Pair.Base open;
+
+--- 𝒪(𝓃). Returns ;true; if the given object elem is in the ;List;.
+{-# specialize: [1] #-}
+isElement {A} (eq : A -> A -> Bool) (elem : A) : (list : List A) -> Bool
+  | nil := false
+  | (x :: xs) := eq elem x || isElement eq elem xs;
+
+--- 𝒪(𝓃). Returns the leftmost element of the list satisfying the predicate or
+--- nothing if there is no such element.
+{-# specialize: [1] #-}
+find {A} (predicate : A -> Bool) : (list : List A) -> Maybe A
+  | nil := nothing
+  | (x :: xs) :=
+    if 
+      | predicate x := just x
+      | else := find predicate xs;
+
+syntax iterator listRfor {init := 1; range := 1};
+
+{-# specialize: [1] #-}
+listRfor {A B} (fun : B -> A -> B) (acc : B) : (list : List A) -> B
+  | nil := acc
+  | (x :: xs) := fun (listRfor fun acc xs) x;
+
+--- Right-associative fold.
+{-# specialize: [1] #-}
+liftFoldr {A B} (fun : A -> B -> B) (acc : B) (list : List A) : B :=
+  listRfor (flip fun) acc list;
+
+--- Left-associative and tail-recursive fold.
+{-# specialize: [1] #-}
+listFoldl {A B} (fun : B -> A -> B) (acc : B) : (list : List A) -> B
+  | nil := acc
+  | (h :: hs) := listFoldl fun (fun acc h) hs;
+
+syntax iterator listFor {init := 1; range := 1};
+
+{-# inline: 0, isabelle-function: {name: "foldl"} #-}
+listFor : {A B : Type} -> (B -> A -> B) -> B -> List A -> B := listFoldl;
+
+syntax iterator listMap {init := 0; range := 1};
+
+--- 𝒪(𝓃). Maps a function over each element of a ;List;.
+{-# specialize: [1] #-}
+listMap {A B} (fun : A -> B) : (list : List A) -> List B
+  | nil := nil
+  | (h :: hs) := fun h :: listMap fun hs;
+
+syntax iterator filter {init := 0; range := 1};
+
+--- 𝒪(𝓃). Filters a ;List; according to a given predicate, i.e.,
+--- keeps the elements for which the given predicate returns ;true;.
+{-# specialize: [1] #-}
+filter {A} (predicate : A -> Bool) : (list : List A) -> List A
+  | nil := nil
+  | (h :: hs) :=
+    if 
+      | predicate h := h :: filter predicate hs
+      | else := filter predicate hs;
+
+--- 𝒪(𝓃). Returns the length of the ;List;.
+length {A} (list : List A) : Nat :=
+  listFor (acc := zero) (_ in list) {
+    suc acc
+  };
+
+--- 𝒪(𝓃). Returns the given ;List; in reverse order.
+{-# isabelle-function: {name: "rev"} #-}
+reverse {A} (list : List A) : List A :=
+  listFor (acc := nil) (x in list) {
+    x :: acc
+  };
+
+--- Returns a ;List; of length resultLength where every element is the given value.
+replicate {A} : (resultLength : Nat) -> (value : A) -> List A
+  | zero _ := nil
+  | (suc n) x := x :: replicate n x;
+
+--- Takes the first elemsNum elements of a ;List;.
+take {A} : (elemsNum : Nat) -> (list : List A) -> List A
+  | (suc n) (x :: xs) := x :: take n xs
+  | _ _ := nil;
+
+--- Drops the first elemsNum elements of a ;List;.
+drop {A} : (elemsNum : Nat) -> (list : List A) -> List A
+  | (suc n) (x :: xs) := drop n xs
+  | _ xs := xs;
+
+--- 𝒪(𝓃). Returns a tuple where first element is the
+--- prefix of the given list of length prefixLength and second element is the
+--- remainder of the ;List;.
+splitAt {A} : (prefixLength : Nat) -> (list : List A) -> Pair (List A) (List A)
+  | _ nil := nil, nil
+  | zero xs := nil, xs
+  | (suc zero) (x :: xs) := x :: nil, xs
+  | (suc m) (x :: xs) := case splitAt m xs of l1, l2 := x :: l1, l2;
+
+--- 𝒪(𝓃 + 𝓂). Merges two lists according the given ordering.
+terminating
+merge {A} {{Ord A}} (list1 list2 : List A) : List A :=
+  case list1, list2 of
+    | xs@(x :: xs'), ys@(y :: ys') :=
+      if 
+        | x < y := x :: merge xs' ys
+        | else := y :: merge xs ys'
+    | nil, ys := ys
+    | xs, nil := xs;
+
+--- 𝒪(𝓃). Returns a tuple where the first component has the items that
+--- satisfy the predicate and the second component has the elements that don't.
+partition {A} (predicate : A  Bool) : (list : List A) -> Pair (List A) (List A)
+  | nil := nil, nil
+  | (x :: xs) :=
+    case partition predicate xs of
+      l1, l2 :=
+        if 
+          | predicate x := x :: l1, l2
+          | else := l1, x :: l2;
+
+syntax operator ++ cons;
+
+--- Concatenates two ;List;s.
+++ : {A : Type} -> (list1 : List A) -> (list2 : List A) -> List A
+  | nil ys := ys
+  | (x :: xs) ys := x :: xs ++ ys;
+
+--- 𝒪(𝓃). Append an element.
+snoc {A} (list : List A) (elem : A) : List A := list ++ elem :: nil;
+
+--- Concatenates a ;List; of ;List;s.
+{-# isabelle-function: {name: "concat"} #-}
+flatten {A} (listOfLists : List (List A)) : List A :=
+  listFoldl (++) nil listOfLists;
+
+--- 𝒪(𝓃). Inserts the given separator before every element in the given ;List;.
+prependToAll {A} (separator : A) : (list : List A) -> List A
+  | nil := nil
+  | (x :: xs) := separator :: x :: prependToAll separator xs;
+
+--- 𝒪(𝓃). Inserts the given separator inbetween every two elements in the given ;List;.
+intersperse {A} (separator : A) (list : List A) : List A :=
+  case list of
+    | nil := nil
+    | x :: xs := x :: prependToAll separator xs;
+
+--- 𝒪(1). Drops the first element of a ;List;.
+{-# isabelle-function: {name: "tl"} #-}
+tail {A} (list : List A) : List A :=
+  case list of
+    | _ :: xs := xs
+    | nil := nil;
+
+head {A} (defaultValue : A) (list : List A) : A :=
+  case list of
+    | x :: _ := x
+    | nil := defaultValue;
+
+syntax iterator any {init := 0; range := 1};
+
+--- 𝒪(𝓃). Returns ;true; if at least one element of the ;List; satisfies the predicate.
+{-# specialize: [1] #-}
+any {A} (predicate : A -> Bool) : (list : List A) -> Bool
+  | nil := false
+  | (x :: xs) :=
+    if 
+      | predicate x := true
+      | else := any predicate xs;
+
+syntax iterator all {init := 0; range := 1};
+
+--- 𝒪(𝓃). Returns ;true; if all elements of the ;List; satisfy the predicate.
+{-# specialize: [1] #-}
+all {A} (predicate : A -> Bool) : (list : List A) -> Bool
+  | nil := true
+  | (x :: xs) :=
+    if 
+      | predicate x := all predicate xs
+      | else := false;
+
+--- 𝒪(1). Returns ;true; if the ;List; is empty.
+isEmpty {A} (list : List A) : Bool :=
+  case list of
+    | nil := true
+    | _ := false;
+
+--- 𝒪(min(𝓂, 𝓃)). Returns a list containing the results of applying a function
+--- to each pair of elements from the input lists.
+{-# specialize: [1] #-}
+zipWith
+  {A B C} (fun : A -> B -> C) : (list1 : List A) -> (list2 : List B) -> List C
+  | nil _ := nil
+  | _ nil := nil
+  | (x :: xs) (y :: ys) := fun x y :: zipWith fun xs ys;
+
+--- 𝒪(min(𝓂, 𝓃)). Returns a list of pairs formed from the input lists.
+zip {A B} : (list1 : List A) -> (list2 : List B) -> List (Pair A B)
+  | nil _ := nil
+  | _ nil := nil
+  | (x :: xs) (y :: ys) := (x, y) :: zip xs ys;
+
+--- 𝒪(𝓃 log 𝓃). Sorts a list of elements in ascending order using the MergeSort
+--- algorithm.
+mergeSort {A} {{Ord A}} (list : List A) : List A :=
+  let
+    terminating
+    go : Nat -> List A -> List A
+      | zero _ := nil
+      | (suc zero) xs := xs
+      | len xs :=
+        let
+          len' : Nat := div len (suc (suc zero));
+          splitXs : Pair (List A) (List A) := splitAt len' xs;
+          left : List A := fst splitXs;
+          right : List A := snd splitXs;
+        in merge (go len' left) (go (sub len len') right);
+  in go (length list) list;
+
+--- On average 𝒪(𝓃 log 𝓃), worst case 𝒪(𝓃²). Sorts a list of elements in
+--- ascending order using the QuickSort algorithm.
+terminating
+quickSort {A} {{Ord A}} (list : List A) : List A :=
+  let
+    terminating
+    go : List A -> List A
+      | nil := nil
+      | xs@(_ :: nil) := xs
+      | (x :: xs) :=
+        case partition \{y := y < x} xs of l1, l2 := go l1 ++ x :: go l2;
+  in go list;
+
+--- 𝒪(𝓃) Filters out every ;nothing; from a ;List;.
+catMaybes {A} : (listOfMaybes : List (Maybe A)) -> List A
+  | nil := nil
+  | (just h :: hs) := h :: catMaybes hs
+  | (nothing :: hs) := catMaybes hs;
+
+syntax iterator concatMap {init := 0; range := 1};
+
+--- Applies a function to every item on a ;List; and concatenates the result.
+--- 𝒪(𝓃), where 𝓃 is the number of items in the resulting list.
+concatMap {A B} (fun : A -> List B) (list : List A) : List B :=
+  flatten (listMap fun list);
+
+--- 𝒪(𝓃 * 𝓂). Transposes a ;List; of ;List;s interpreted as a matrix.
+transpose {A} : (listOfLists : List (List A)) -> List (List A)
+  | nil := nil
+  | (xs :: nil) := listMap λ{x := x :: nil} xs
+  | (xs :: xss) := zipWith (::) xs (transpose xss);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/List/Base.html b/pull-137/Stdlib/Data/List/Base.html new file mode 100644 index 000000000..0d7c722b3 --- /dev/null +++ b/pull-137/Stdlib/Data/List/Base.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.List.Base

Definitions

import Juvix.Builtin.V1.List open public

isElement {A} (eq : A -> A -> Bool) (elem : A) : (list : List A) -> BoolSource#

𝒪(𝓃). Returns true if the given object elem is in the List.

find {A} (predicate : A -> Bool) : (list : List A) -> Maybe ASource#

𝒪(𝓃). Returns the leftmost element of the list satisfying the predicate or nothing if there is no such element.

listRfor {A B} (fun : B -> A -> B) (acc : B) : (list : List A) -> BSource#

liftFoldr {A B} (fun : A -> B -> B) (acc : B) (list : List A) : BSource#

Right-associative fold.

listFoldl {A B} (fun : B -> A -> B) (acc : B) : (list : List A) -> BSource#

Left-associative and tail-recursive fold.

listFor : {A B : Type} -> (B -> A -> B) -> B -> List A -> BSource#

listMap {A B} (fun : A -> B) : (list : List A) -> List BSource#

𝒪(𝓃). Maps a function over each element of a List.

filter {A} (predicate : A -> Bool) : (list : List A) -> List ASource#

𝒪(𝓃). Filters a List according to a given predicate, i.e., keeps the elements for which the given predicate returns true.

length {A} (list : List A) : NatSource#

𝒪(𝓃). Returns the length of the List.

reverse {A} (list : List A) : List ASource#

𝒪(𝓃). Returns the given List in reverse order.

replicate {A} : (resultLength : Nat) -> (value : A) -> List ASource#

Returns a List of length resultLength where every element is the given value.

take {A} : (elemsNum : Nat) -> (list : List A) -> List ASource#

Takes the first elemsNum elements of a List.

drop {A} : (elemsNum : Nat) -> (list : List A) -> List ASource#

Drops the first elemsNum elements of a List.

splitAt {A} : (prefixLength : Nat) -> (list : List A) -> Pair (List A) (List A)Source#

𝒪(𝓃). Returns a tuple where first element is the prefix of the given list of length prefixLength and second element is the remainder of the List.

terminating +merge {A} {{Ord A}} (list1 list2 : List A) : List ASource#

𝒪(𝓃 + 𝓂). Merges two lists according the given ordering.

partition {A} (predicate : A Bool) : (list : List A) -> Pair (List A) (List A)Source#

𝒪(𝓃). Returns a tuple where the first component has the items that satisfy the predicate and the second component has the elements that don't.

++ : {A : Type} -> (list1 : List A) -> (list2 : List A) -> List ASource#

Concatenates two Lists.

snoc {A} (list : List A) (elem : A) : List ASource#

𝒪(𝓃). Append an element.

flatten {A} (listOfLists : List (List A)) : List ASource#

Concatenates a List of Lists.

prependToAll {A} (separator : A) : (list : List A) -> List ASource#

𝒪(𝓃). Inserts the given separator before every element in the given List.

intersperse {A} (separator : A) (list : List A) : List ASource#

𝒪(𝓃). Inserts the given separator inbetween every two elements in the given List.

tail {A} (list : List A) : List ASource#

𝒪(1). Drops the first element of a List.

any {A} (predicate : A -> Bool) : (list : List A) -> BoolSource#

𝒪(𝓃). Returns true if at least one element of the List satisfies the predicate.

all {A} (predicate : A -> Bool) : (list : List A) -> BoolSource#

𝒪(𝓃). Returns true if all elements of the List satisfy the predicate.

isEmpty {A} (list : List A) : BoolSource#

𝒪(1). Returns true if the List is empty.

zipWith + {A B C} (fun : A -> B -> C) : (list1 : List A) -> (list2 : List B) -> List CSource#

𝒪(min(𝓂, 𝓃)). Returns a list containing the results of applying a function to each pair of elements from the input lists.

zip {A B} : (list1 : List A) -> (list2 : List B) -> List (Pair A B)Source#

𝒪(min(𝓂, 𝓃)). Returns a list of pairs formed from the input lists.

mergeSort {A} {{Ord A}} (list : List A) : List ASource#

𝒪(𝓃 log 𝓃). Sorts a list of elements in ascending order using the MergeSort algorithm.

terminating +quickSort {A} {{Ord A}} (list : List A) : List ASource#

On average 𝒪(𝓃 log 𝓃), worst case 𝒪(𝓃²). Sorts a list of elements in ascending order using the QuickSort algorithm.

catMaybes {A} : (listOfMaybes : List (Maybe A)) -> List ASource#

𝒪(𝓃) Filters out every nothing from a List.

concatMap {A B} (fun : A -> List B) (list : List A) : List BSource#

Applies a function to every item on a List and concatenates the result. 𝒪(𝓃), where 𝓃 is the number of items in the resulting list.

transpose {A} : (listOfLists : List (List A)) -> List (List A)Source#

𝒪(𝓃 * 𝓂). Transposes a List of Lists interpreted as a matrix.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Map-src.html b/pull-137/Stdlib/Data/Map-src.html new file mode 100644 index 000000000..0e20fb345 --- /dev/null +++ b/pull-137/Stdlib/Data/Map-src.html @@ -0,0 +1,377 @@ + +
module Stdlib.Data.Map;
+
+import Stdlib.Data.Pair open;
+import Stdlib.Data.Maybe open;
+import Stdlib.Data.Result open;
+import Stdlib.Data.List open;
+import Stdlib.Data.Nat open;
+import Stdlib.Data.Bool open;
+
+import Stdlib.Trait.Functor open using {Functor; mkFunctor; map as fmap};
+import Stdlib.Trait.Foldable open hiding {foldr; foldl};
+import Stdlib.Trait.Ord open;
+
+import Stdlib.Function open;
+
+import Stdlib.Data.Set as Set open using {Set};
+import Stdlib.Data.Set.AVL as AVL open using {AVLTree};
+
+import Stdlib.Data.BinaryTree as Tree;
+
+type Binding Key Value :=
+  mkBinding@{
+    key : Key;
+    value : Value;
+  };
+
+key {Key Value} (binding : Binding Key Value) : Key := Binding.key binding;
+
+value {Key Value} (binding : Binding Key Value) : Value :=
+  Binding.value binding;
+
+toPair {Key Value} (binding : Binding Key Value) : Pair Key Value :=
+  key binding, value binding;
+
+{-# specialize: true, inline: case #-}
+instance
+bindingKeyOrdering {Key Value} {{Ord Key}} : Ord (Binding Key Value) :=
+  mkOrd@{
+    {-# inline: true #-}
+    cmp (b1 b2 : Binding Key Value) : Ordering := Ord.cmp (key b1) (key b2);
+  };
+
+type Map Key Value := mkMap (AVLTree (Binding Key Value));
+
+empty {Key Value} : Map Key Value := mkMap AVL.empty;
+
+{-# specialize: [1, fun] #-}
+insertWith
+  {Key Value}
+  {{Ord Key}}
+  (fun : Value -> Value -> Value)
+  (key : Key)
+  (value : Value)
+  (map : Map Key Value)
+  : Map Key Value :=
+  case map of
+    mkMap tree :=
+      let
+        fun' (binding1 binding2 : Binding Key Value) : Binding Key Value :=
+          case binding1, binding2 of
+            mkBinding k b1, mkBinding _ b2 := mkBinding k (fun b1 b2);
+        binding := mkBinding key value;
+      in mkMap (Set.insertWith fun' binding tree);
+
+--- 𝒪(log 𝓃). Inserts a new `key` and `value` into `map`. If `key` is already
+--- present in `map`, the associated value is replaced with the supplied
+--- `value`.
+{-# inline: true #-}
+insert
+  {Key Value : Type}
+  {{Ord Key}}
+  (key : Key)
+  (elem : Value)
+  (map : Map Key Value)
+  : Map Key Value := insertWith (flip const) key elem map;
+
+--- 𝒪(log 𝓃). Queries whether a given `key` is in `map`.
+{-# specialize: [1] #-}
+lookup
+  {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : Maybe Value :=
+  case map of mkMap s := fmap value (Set.lookupWith Binding.key key s);
+
+--- 𝒪(log 𝓃). Queries whether a given `key` is in `map`.
+{-# specialize: [1] #-}
+isMember {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : Bool :=
+  isJust (lookup key map);
+
+{-# specialize: [1, fun] #-}
+fromListWithKey
+  {Key Value}
+  {{Ord Key}}
+  (fun : Key -> Value -> Value -> Value)
+  (list : List (Pair Key Value))
+  : Map Key Value :=
+  for (acc := empty) (k, v in list) {
+    insertWith (fun k) k v acc
+  };
+
+{-# inline: true #-}
+fromListWith
+  {Key Value}
+  {{Ord Key}}
+  (fun : Value -> Value -> Value)
+  (list : List (Pair Key Value))
+  : Map Key Value := fromListWithKey (const fun) list;
+
+{-# inline: true #-}
+fromList
+  {Key Value} {{Ord Key}} (list : List (Pair Key Value)) : Map Key Value :=
+  fromListWith (flip const) list;
+
+toList {Key Value} (map : Map Key Value) : List (Pair Key Value) :=
+  case map of
+    mkMap s :=
+      fmap (x in Set.toList s) {
+        toPair x
+      };
+
+{-# specialize: [1, fun] #-}
+fromSetWithFun
+  {Key Value}
+  {{Ord Key}}
+  (fun : Key -> Value)
+  (set : Set Key)
+  : Map Key Value :=
+  for (acc := empty) (k in set) {
+    insert k (fun k) acc
+  };
+
+{-# specialize: [1] #-}
+fromSet {Key Value} {{Ord Key}} (set : Set (Pair Key Value)) : Map Key Value :=
+  for (acc := empty) (k, v in set) {
+    insert k v acc
+  };
+
+{-# specialize: [1, 2] #-}
+toSet
+  {Key Value}
+  {{Ord Key}}
+  {{Ord Value}}
+  (map : Map Key Value)
+  : Set (Pair Key Value) :=
+  case map of
+    mkMap s :=
+      Set.map (x in s) {
+        toPair x
+      };
+
+--- 𝒪(1). Checks if a ;Map; is empty.
+{-# inline: true #-}
+isEmpty {Key Value} (map : Map Key Value) : Bool :=
+  case map of mkMap s := Set.isEmpty s;
+
+--- 𝒪(𝓃). Returns the number of elements of a ;Map;.
+{-# inline: true #-}
+size {Key Value} (map : Map Key Value) : Nat :=
+  case map of mkMap s := Set.size s;
+
+--- 𝒪(log 𝓃). Removes `key` assignment from `map`.
+{-# inline: true #-}
+delete
+  {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : Map Key Value :=
+  case map of mkMap s := mkMap (Set.deleteWith Binding.key key s);
+
+keys {Key Value} (map : Map Key Value) : List Key :=
+  case map of
+    mkMap s :=
+      fmap (x in Set.toList s) {
+        key x
+      };
+
+values {Key Value} (map : Map Key Value) : List Value :=
+  case map of
+    mkMap s :=
+      fmap (x in Set.toList s) {
+        value x
+      };
+
+keySet {Key Value} {{Ord Key}} (map : Map Key Value) : Set Key :=
+  case map of
+    mkMap s :=
+      Set.map (x in s) {
+        key x
+      };
+
+valueSet {Key Value} {{Ord Value}} (map : Map Key Value) : Set Value :=
+  case map of
+    mkMap s :=
+      Set.map (x in s) {
+        value x
+      };
+
+{-# specialize: [fun] #-}
+mapValuesWithKey
+  {Key Value1 Value2}
+  (fun : Key -> Value1 -> Value2)
+  (map : Map Key Value1)
+  : Map Key Value2 :=
+  case map of
+    mkMap s :=
+      mkMap
+        (Set.Internal.unsafeMap \{(mkBinding k v) := mkBinding k (fun k v)} s);
+
+{-# inline: true #-}
+mapValues
+  {Key Value1 Value2}
+  (fun : Value1 -> Value2)
+  (map : Map Key Value1)
+  : Map Key Value2 := mapValuesWithKey (const fun) map;
+
+{-# inline: true #-}
+singleton {Key Value} {{Ord Key}} (key : Key) (value : Value) : Map Key Value :=
+  insert key value empty;
+
+{-# inline: true #-}
+foldr
+  {Key Value Acc}
+  (fun : Key -> Value -> Acc -> Acc)
+  (acc : Acc)
+  (map : Map Key Value)
+  : Acc :=
+  case map of
+    mkMap s :=
+      rfor (acc := acc) (x in s) {
+        fun (key x) (value x) acc
+      };
+
+{-# inline: true #-}
+foldl
+  {Key Value Acc}
+  (fun : Acc -> Key -> Value -> Acc)
+  (acc : Acc)
+  (map : Map Key Value)
+  : Acc :=
+  case map of
+    mkMap s :=
+      for (acc := acc) (x in s) {
+        fun acc (key x) (value x)
+      };
+
+--- 𝒪(n log n). Intersection of two maps. Returns data in the first map for the
+--- keys existing in both maps.
+{-# inline: true #-}
+intersection
+  {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key Value :=
+  case map1, map2 of mkMap s1, mkMap s2 := mkMap (Set.intersection s1 s2);
+
+--- 𝒪(n log n). Return elements of `map1` with keys not existing in `map2`.
+{-# inline: true #-}
+difference
+  {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key Value :=
+  case map1, map2 of mkMap s1, mkMap s2 := mkMap (Set.difference s1 s2);
+
+--- 𝒪(n log n). Returns a ;Map; containing the elements that are in `map1` or
+--- `map2`. This is a left-biased union of `map1` and `map2` which prefers
+--- `map1` when duplicate keys are encountered.
+{-# inline: true #-}
+unionLeft {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key Value :=
+  case map1, map2 of mkMap s1, mkMap s2 := mkMap (Set.unionLeft s1 s2);
+
+--- 𝒪(n log n). Returns a ;Map; containing the elements that are in `map1` or `map2`.
+{-# inline: true #-}
+union {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key Value :=
+  case map1, map2 of mkMap s1, mkMap s2 := mkMap (Set.union s1 s2);
+
+{-# specialize: [1, 2] #-}
+unions
+  {Key Value Container}
+  {{Ord Key}}
+  {{Foldable Container (Map Key Value)}}
+  (maps : Container)
+  : Map Key Value :=
+  for (acc := empty) (map in maps) {
+    union acc map
+  };
+
+--- O(n log n). If `map1` and `map2` are disjoint (have no common keys), then
+--- returns `ok map` where `map` is the union of `map1` and `map2`. If `map1`
+--- and `map2` are not disjoint, then returns `error k` where `k` is a common
+--- key.
+{-# inline: true #-}
+disjointUnion
+  {Key Value}
+  {{Ord Key}}
+  (map1 map2 : Map Key Value)
+  : Result Key (Map Key Value) :=
+  case map1, map2 of
+    mkMap s1, mkMap s2 :=
+      case Set.disjointUnion s1 s2 of
+        | error x := error (key x)
+        | ok s := ok (mkMap s);
+
+syntax iterator all {init := 0; range := 1};
+--- 𝒪(𝓃). Returns ;true; if all key-value pairs in `map` satisfy `predicate`.
+{-# inline: true #-}
+all
+  {Key Value} (predicate : Key -> Value -> Bool) (map : Map Key Value) : Bool :=
+  case map of
+    mkMap s :=
+      Set.all (x in s) {
+        predicate (key x) (value x)
+      };
+
+syntax iterator any {init := 0; range := 1};
+--- 𝒪(𝓃). Returns ;true; if some key-value pair in `map` satisfies `predicate`.
+{-# inline: true #-}
+any
+  {Key Value} (predicate : Key -> Value -> Bool) (map : Map Key Value) : Bool :=
+  case map of
+    mkMap s :=
+      Set.any (x in s) {
+        predicate (key x) (value x)
+      };
+
+syntax iterator filter {init := 0; range := 1};
+--- 𝒪(n log n). Returns a ;Map; containing all key-value pairs of `map` that
+--- satisfy `predicate`.
+{-# inline: true #-}
+filter
+  {Key Value}
+  {{Ord Key}}
+  (predicate : Key -> Value -> Bool)
+  (map : Map Key Value)
+  : Map Key Value :=
+  case map of
+    mkMap s :=
+      mkMap
+        (Set.filter (x in s) {
+          predicate (key x) (value x)
+        });
+
+syntax iterator partition {init := 0; range := 1};
+{-# inline: true #-}
+partition
+  {Key Value}
+  {{Ord Key}}
+  (predicate : Key -> Value -> Bool)
+  (map : Map Key Value)
+  : Pair (Map Key Value) (Map Key Value) :=
+  case map of
+    mkMap s :=
+      case
+        Set.partition (x in s) {
+          predicate (key x) (value x)
+        }
+      of left, right := mkMap left, mkMap right;
+
+{-# specialize: true, inline: case #-}
+instance
+functorMapI {Key} : Functor (Map Key) :=
+  mkFunctor@{
+    map {A B} (fun : A -> B) (container : Map Key A) : Map Key B :=
+      mapValues fun container;
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+foldableMapI {Key Value} : Foldable (Map Key Value) (Pair Key Value) :=
+  mkFoldable@{
+    {-# inline: true #-}
+    for
+      {B} (f : B -> Pair Key Value -> B) (acc : B) (map : Map Key Value) : B :=
+      foldl \{a k v := f a (k, v)} acc map;
+
+    {-# inline: true #-}
+    rfor
+      {B} (f : B -> Pair Key Value -> B) (acc : B) (map : Map Key Value) : B :=
+      foldr \{k v a := f a (k, v)} acc map;
+  };
+
+instance
+eqMapI {A B} {{Eq A}} {{Eq B}} : Eq (Map A B) := mkEq (Eq.eq on toList);
+
+instance
+ordMapI {A B} {{Ord A}} {{Ord B}} : Ord (Map A B) := mkOrd (Ord.cmp on toList);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Map.html b/pull-137/Stdlib/Data/Map.html new file mode 100644 index 000000000..129820ad3 --- /dev/null +++ b/pull-137/Stdlib/Data/Map.html @@ -0,0 +1,76 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Map

Definitions

Constructors

mkBinding@{ + key : Key; + value : Value; +}

insertWith + {Key Value} + {{Ord Key}} + (fun : Value -> Value -> Value) + (key : Key) + (value : Value) + (map : Map Key Value) + : Map Key ValueSource#

insert + {Key Value : Type} + {{Ord Key}} + (key : Key) + (elem : Value) + (map : Map Key Value) + : Map Key ValueSource#

𝒪(log 𝓃). Inserts a new `key` and `value` into `map`. If `key` is already present in `map`, the associated value is replaced with the supplied `value`.

lookup {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : Maybe ValueSource#

𝒪(log 𝓃). Queries whether a given `key` is in `map`.

isMember {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : BoolSource#

𝒪(log 𝓃). Queries whether a given `key` is in `map`.

isEmpty {Key Value} (map : Map Key Value) : BoolSource#

𝒪(1). Checks if a Map is empty.

size {Key Value} (map : Map Key Value) : NatSource#

𝒪(𝓃). Returns the number of elements of a Map.

delete {Key Value} {{Ord Key}} (key : Key) (map : Map Key Value) : Map Key ValueSource#

𝒪(log 𝓃). Removes `key` assignment from `map`.

foldr + {Key Value Acc} + (fun : Key -> Value -> Acc -> Acc) + (acc : Acc) + (map : Map Key Value) + : AccSource#

foldl + {Key Value Acc} + (fun : Acc -> Key -> Value -> Acc) + (acc : Acc) + (map : Map Key Value) + : AccSource#

intersection {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key ValueSource#

𝒪(n log n). Intersection of two maps. Returns data in the first map for the keys existing in both maps.

difference {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key ValueSource#

𝒪(n log n). Return elements of `map1` with keys not existing in `map2`.

unionLeft {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key ValueSource#

𝒪(n log n). Returns a Map containing the elements that are in `map1` or `map2`. This is a left-biased union of `map1` and `map2` which prefers `map1` when duplicate keys are encountered.

union {Key Value} {{Ord Key}} (map1 map2 : Map Key Value) : Map Key ValueSource#

𝒪(n log n). Returns a Map containing the elements that are in `map1` or `map2`.

disjointUnion + {Key Value} + {{Ord Key}} + (map1 map2 : Map Key Value) + : Result Key (Map Key Value)Source#

O(n log n). If `map1` and `map2` are disjoint (have no common keys), then returns `ok map` where `map` is the union of `map1` and `map2`. If `map1` and `map2` are not disjoint, then returns `error k` where `k` is a common key.

all {Key Value} (predicate : Key -> Value -> Bool) (map : Map Key Value) : BoolSource#

𝒪(𝓃). Returns true if all key-value pairs in `map` satisfy `predicate`.

any {Key Value} (predicate : Key -> Value -> Bool) (map : Map Key Value) : BoolSource#

𝒪(𝓃). Returns true if some key-value pair in `map` satisfies `predicate`.

filter + {Key Value} + {{Ord Key}} + (predicate : Key -> Value -> Bool) + (map : Map Key Value) + : Map Key ValueSource#

𝒪(n log n). Returns a Map containing all key-value pairs of `map` that satisfy `predicate`.

instance +eqMapI {A B} {{Eq A}} {{Eq B}} : Eq (Map A B)Source#

instance +ordMapI {A B} {{Ord A}} {{Ord B}} : Ord (Map A B)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Maybe-src.html b/pull-137/Stdlib/Data/Maybe-src.html new file mode 100644 index 000000000..f4cfcc70b --- /dev/null +++ b/pull-137/Stdlib/Data/Maybe-src.html @@ -0,0 +1,66 @@ + +
module Stdlib.Data.Maybe;
+
+import Stdlib.Data.Maybe.Base open public;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait.Functor open;
+import Stdlib.Trait.Applicative open;
+import Stdlib.Trait.Monad open;
+
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.String.Base open;
+import Stdlib.Data.Pair.Base open;
+
+{-# specialize: true, inline: case #-}
+deriving instance
+eqMaybeI {A} {{Eq A}} : Eq (Maybe A);
+
+instance
+showMaybeI {A} {{Show A}} : Show (Maybe A) :=
+  mkShow@{
+    show (m : Maybe A) : String :=
+      case m of
+        | nothing := "nothing"
+        | just a := "just " ++str Show.show a;
+  };
+
+{-# specialize: true, inline: case #-}
+deriving instance
+ordMaybeI {A} {{Ord A}} : Ord (Maybe A);
+
+{-# specialize: true, inline: case #-}
+instance
+functorMaybeI : Functor Maybe :=
+  mkFunctor@{
+    map {A B} (f : A -> B) : Maybe A -> Maybe B
+      | nothing := nothing
+      | (just a) := just (f a);
+  };
+
+{-# specizalize: true, inline: true #-}
+instance
+monomorphicFunctorMaybeI {A} : Monomorphic.Functor (Maybe A) A :=
+  fromPolymorphicFunctor;
+
+instance
+applicativeMaybeI : Applicative Maybe :=
+  mkApplicative@{
+    pure := just;
+    ap {A B} (listOfFuns : Maybe (A -> B)) (list : Maybe A) : Maybe B :=
+      case listOfFuns, list of
+        | just f, just x := just (f x)
+        | _, _ := nothing;
+  };
+
+instance
+monadMaybeI : Monad Maybe :=
+  mkMonad@{
+    bind {A B} (maybe : Maybe A) (fun : A -> Maybe B) : Maybe B :=
+      case maybe of
+        | nothing := nothing
+        | just a := fun a;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Maybe.html b/pull-137/Stdlib/Data/Maybe.html new file mode 100644 index 000000000..676aa50b2 --- /dev/null +++ b/pull-137/Stdlib/Data/Maybe.html @@ -0,0 +1,11 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Maybe

Definitions

import Stdlib.Data.Maybe.Base open public

{-# specialize: true, inline: case #-} +deriving instance +eqMaybeI {A} {{Eq A}} : Eq (Maybe A)Source#

instance +showMaybeI {A} {{Show A}} : Show (Maybe A)Source#

{-# specialize: true, inline: case #-} +deriving instance +ordMaybeI {A} {{Ord A}} : Ord (Maybe A)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Maybe/Base-src.html b/pull-137/Stdlib/Data/Maybe/Base-src.html new file mode 100644 index 000000000..5f35e187e --- /dev/null +++ b/pull-137/Stdlib/Data/Maybe/Base-src.html @@ -0,0 +1,26 @@ + +
module Stdlib.Data.Maybe.Base;
+
+import Juvix.Builtin.V1.Maybe open public;
+import Juvix.Builtin.V1.Bool open;
+
+--- Extracts the value from a ;Maybe; if present, else returns the given value.
+{-# inline: true #-}
+fromMaybe {A} (defaultValue : A) (maybeValue : Maybe A) : A :=
+  case maybeValue of
+    | nothing := defaultValue
+    | just a := a;
+
+--- Applies a function to the value from a ;Maybe; if present, else returns the
+--- given value.
+{-# inline: true, isabelle-function: {name: "case_option"} #-}
+maybe {A B} (defaultValue : B) (fun : A -> B) (maybeValue : Maybe A) : B :=
+  case maybeValue of
+    | nothing := defaultValue
+    | just a := fun a;
+
+isJust {A} (maybeValue : Maybe A) : Bool :=
+  case maybeValue of
+    | nothing := false
+    | just _ := true;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Maybe/Base.html b/pull-137/Stdlib/Data/Maybe/Base.html new file mode 100644 index 000000000..80c82a6e6 --- /dev/null +++ b/pull-137/Stdlib/Data/Maybe/Base.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Maybe.Base

Definitions

import Juvix.Builtin.V1.Maybe open public

fromMaybe {A} (defaultValue : A) (maybeValue : Maybe A) : ASource#

Extracts the value from a Maybe if present, else returns the given value.

maybe {A B} (defaultValue : B) (fun : A -> B) (maybeValue : Maybe A) : BSource#

Applies a function to the value from a Maybe if present, else returns the given value.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat-src.html b/pull-137/Stdlib/Data/Nat-src.html new file mode 100644 index 000000000..4df974ec7 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat-src.html @@ -0,0 +1,49 @@ + +
module Stdlib.Data.Nat;
+
+import Juvix.Builtin.V1.Nat open hiding {module Nat} public;
+import Stdlib.Data.Nat.Base open hiding {module Nat; +; *; div; mod} public;
+
+module Nat;
+  open Stdlib.Data.Nat.Base.Nat public;
+
+  import Stdlib.Data.Nat.Base open public;
+  import Stdlib.Data.Nat.Ord open public;
+end;
+
+import Stdlib.Data.String.Base open;
+
+import Stdlib.Trait.Eq open public;
+import Stdlib.Trait.Ord open public;
+import Stdlib.Trait.Show open public;
+import Stdlib.Trait.Natural open public;
+import Stdlib.Trait.FromNatural open public;
+import Stdlib.Trait.DivMod open public;
+
+--- Converts a ;Nat; into a ;String;.
+builtin nat-to-string
+axiom natToString : Nat -> String;
+
+--- Partial function that converts a ;String; into a ;Nat;.
+builtin string-to-nat
+axiom stringToNat : String -> Nat;
+
+{-# specialize: true, inline: case #-}
+instance
+eqNatI : Eq Nat := mkEq (Nat.==);
+
+{-# specialize: true, inline: case #-}
+instance
+ordNatI : Ord Nat := mkOrd Nat.compare;
+
+instance
+showNatI : Show Nat := mkShow natToString;
+
+{-# specialize: true, inline: case #-}
+instance
+divModNatI : DivMod Nat :=
+  mkDivMod@{
+    div := Nat.div;
+    mod := Nat.mod;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat.html b/pull-137/Stdlib/Data/Nat.html new file mode 100644 index 000000000..4f2f27d97 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat.html @@ -0,0 +1,8 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Nat

Definitions

import Juvix.Builtin.V1.Nat open hiding {module Nat} public

import Stdlib.Data.Nat.Base open hiding {module Nat; +; *; div; mod} public

module NatSource#

open Stdlib.Data.Nat.Base.Nat public

import Stdlib.Data.Nat.Base open public

import Stdlib.Data.Nat.Ord open public

import Stdlib.Trait.Eq open public

import Stdlib.Trait.Ord open public

import Stdlib.Trait.Show open public

import Stdlib.Trait.Natural open public

import Stdlib.Trait.FromNatural open public

import Stdlib.Trait.DivMod open public

builtin nat-to-string +axiom natToString : Nat -> StringSource#

Converts a Nat into a String.

builtin string-to-nat +axiom stringToNat : String -> NatSource#

Partial function that converts a String into a Nat.

instance +eqNatI : Eq NatSource#

instance +ordNatI : Ord NatSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat/Base-src.html b/pull-137/Stdlib/Data/Nat/Base-src.html new file mode 100644 index 000000000..e5bd287e0 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat/Base-src.html @@ -0,0 +1,5 @@ + +
module Stdlib.Data.Nat.Base;
+
+import Juvix.Builtin.V1.Nat.Base open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat/Base.html b/pull-137/Stdlib/Data/Nat/Base.html new file mode 100644 index 000000000..5bb43de12 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat/Base.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Nat.Base

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat/Ord-src.html b/pull-137/Stdlib/Data/Nat/Ord-src.html new file mode 100644 index 000000000..91cac24a5 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat/Ord-src.html @@ -0,0 +1,69 @@ + +
module Stdlib.Data.Nat.Ord;
+
+import Stdlib.Data.Fixity open;
+
+import Stdlib.Data.Nat.Base open;
+import Stdlib.Trait.Ord open using {Equal; LessThan; GreaterThan; Ordering};
+import Stdlib.Data.Bool.Base open;
+
+syntax operator == comparison;
+
+--- Tests for equality.
+builtin nat-eq
+== : Nat -> Nat -> Bool
+  | zero zero := true
+  | zero _ := false
+  | _ zero := false
+  | (suc n) (suc m) := n == m;
+
+syntax operator /= comparison;
+
+--- Tests for inequality.
+/= (x y : Nat) : Bool := not (x == y);
+
+syntax operator <= comparison;
+
+--- Returns ;true; iff the first element is less than or equal to the second.
+builtin nat-le
+<= : Nat -> Nat -> Bool
+  | zero _ := true
+  | _ zero := false
+  | (suc n) (suc m) := n <= m;
+
+syntax operator < comparison;
+
+--- Returns ;true; iff the first element is less than the second.
+builtin nat-lt
+< (n m : Nat) : Bool := suc n <= m;
+
+syntax operator > comparison;
+
+--- Returns ;true; iff the first element is greater than the second.
+> (n m : Nat) : Bool := m < n;
+
+syntax operator >= comparison;
+
+--- Returns ;true; iff the first element is greater than or equal to the second.
+>= (n m : Nat) : Bool := m <= n;
+
+--- Tests for ;Ordering;.
+{-# inline: true #-}
+compare (n m : Nat) : Ordering :=
+  if 
+    | n == m := Equal
+    | n < m := LessThan
+    | else := GreaterThan;
+
+--- Returns the smaller ;Nat;.
+min (x y : Nat) : Nat :=
+  if 
+    | x < y := x
+    | else := y;
+
+--- Returns the larger ;Nat;.
+max (x y : Nat) : Nat :=
+  if 
+    | x > y := x
+    | else := y;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Nat/Ord.html b/pull-137/Stdlib/Data/Nat/Ord.html new file mode 100644 index 000000000..127102f49 --- /dev/null +++ b/pull-137/Stdlib/Data/Nat/Ord.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Nat.Ord

Definitions

builtin nat-eq +== : Nat -> Nat -> BoolSource#

Tests for equality.

/= (x y : Nat) : BoolSource#

Tests for inequality.

builtin nat-le +<= : Nat -> Nat -> BoolSource#

Returns true iff the first element is less than or equal to the second.

builtin nat-lt +< (n m : Nat) : BoolSource#

Returns true iff the first element is less than the second.

> (n m : Nat) : BoolSource#

Returns true iff the first element is greater than the second.

>= (n m : Nat) : BoolSource#

Returns true iff the first element is greater than or equal to the second.

min (x y : Nat) : NatSource#

Returns the smaller Nat.

max (x y : Nat) : NatSource#

Returns the larger Nat.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Ordering-src.html b/pull-137/Stdlib/Data/Ordering-src.html new file mode 100644 index 000000000..41e05f2ce --- /dev/null +++ b/pull-137/Stdlib/Data/Ordering-src.html @@ -0,0 +1,40 @@ + +
module Stdlib.Data.Ordering;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Trait.Show open;
+
+builtin ordering
+type Ordering :=
+  | LessThan
+  | Equal
+  | GreaterThan;
+
+isLessThan (ordering : Ordering) : Bool :=
+  case ordering of
+    | LessThan := true
+    | _ := false;
+
+isEqual (ordering : Ordering) : Bool :=
+  case ordering of
+    | Equal := true
+    | _ := false;
+
+isGreaterThan (ordering : Ordering) : Bool :=
+  case ordering of
+    | GreaterThan := true
+    | _ := false;
+
+deriving instance
+orderingEqI : Eq Ordering;
+
+instance
+orderingShowI : Show Ordering :=
+  mkShow@{
+    show : Ordering -> String
+      | Equal := "Equal"
+      | LessThan := "LessThan"
+      | GreaterThan := "GreaterThan";
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Ordering.html b/pull-137/Stdlib/Data/Ordering.html new file mode 100644 index 000000000..2764f52c8 --- /dev/null +++ b/pull-137/Stdlib/Data/Ordering.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Ordering

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Pair-src.html b/pull-137/Stdlib/Data/Pair-src.html new file mode 100644 index 000000000..54c4a8a24 --- /dev/null +++ b/pull-137/Stdlib/Data/Pair-src.html @@ -0,0 +1,27 @@ + +
module Stdlib.Data.Pair;
+
+import Stdlib.Data.Pair.Base open public;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.String.Base open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+
+{-# specialize: true, inline: case #-}
+deriving instance
+eqProductI {A B} {{Eq A}} {{Eq B}} : Eq (Pair A B);
+
+{-# specialize: true, inline: case #-}
+deriving instance
+ordProductI {A B} : {{Ord A}} -> {{Ord B}} -> Ord (Pair A B);
+
+instance
+showProductI {A B} : {{Show A}} -> {{Show B}} -> Show (Pair A B)
+  | {{mkShow showA}} {{mkShow showB}} :=
+    mkShow@{
+      show (p : Pair A B) : String :=
+        case p of a, b := "(" ++str showA a ++str " , " ++str showB b ++str ")";
+    };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Pair.html b/pull-137/Stdlib/Data/Pair.html new file mode 100644 index 000000000..20d76298a --- /dev/null +++ b/pull-137/Stdlib/Data/Pair.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Pair

Definitions

import Stdlib.Data.Pair.Base open public

{-# specialize: true, inline: case #-} +deriving instance +eqProductI {A B} {{Eq A}} {{Eq B}} : Eq (Pair A B)Source#

{-# specialize: true, inline: case #-} +deriving instance +ordProductI {A B} : {{Ord A}} -> {{Ord B}} -> Ord (Pair A B)Source#

instance +showProductI {A B} : {{Show A}} -> {{Show B}} -> Show (Pair A B)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Pair/Base-src.html b/pull-137/Stdlib/Data/Pair/Base-src.html new file mode 100644 index 000000000..48e029f66 --- /dev/null +++ b/pull-137/Stdlib/Data/Pair/Base-src.html @@ -0,0 +1,39 @@ + +
module Stdlib.Data.Pair.Base;
+
+import Stdlib.Data.Fixity open;
+
+syntax operator , pair;
+
+--- Inductive pair. I.e. a tuple with two components.
+builtin pair
+type Pair (A B : Type) := , : A  B  Pair A B;
+
+--- Converts a function f of two arguments to a function with a product argument.
+uncurry {A B C} (fun : A -> B -> C) (pair : Pair A B) : C :=
+  case pair of a, b := fun a b;
+
+--- Converts a function f with a product argument to a function of two arguments.
+curry {A B C} (fun : Pair A B -> C) (a : A) (b : B) : C := fun (a, b);
+
+--- Projects the first component of a tuple.
+fst {A B} (pair : Pair A B) : A := case pair of a, _ := a;
+
+--- Projects the second component of a tuple.
+snd {A B} (pair : Pair A B) : B := case pair of _, b := b;
+
+--- Swaps the components of a tuple.
+swap {A B} (pair : Pair A B) : Pair B A := case pair of a, b := b, a;
+
+--- Applies a function f to the first component.
+first {A B A'} (fun : A -> A') (pair : Pair A B) : Pair A' B :=
+  case pair of a, b := fun a, b;
+
+--- Applies a function f to the second component.
+second {A B B'} (fun : B -> B') (pair : Pair A B) : Pair A B' :=
+  case pair of a, b := a, fun b;
+
+--- Applies a function f to both components.
+both {A B} (fun : A -> B) (pair : Pair A A) : Pair B B :=
+  case pair of a, b := fun a, fun b;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Pair/Base.html b/pull-137/Stdlib/Data/Pair/Base.html new file mode 100644 index 000000000..9580f342a --- /dev/null +++ b/pull-137/Stdlib/Data/Pair/Base.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Pair.Base

Definitions

builtin pair +type Pair (A B : Type)Source#

Inductive pair. I.e. a tuple with two components.

Constructors

, : A B Pair A B

uncurry {A B C} (fun : A -> B -> C) (pair : Pair A B) : CSource#

Converts a function f of two arguments to a function with a product argument.

curry {A B C} (fun : Pair A B -> C) (a : A) (b : B) : CSource#

Converts a function f with a product argument to a function of two arguments.

fst {A B} (pair : Pair A B) : ASource#

Projects the first component of a tuple.

snd {A B} (pair : Pair A B) : BSource#

Projects the second component of a tuple.

swap {A B} (pair : Pair A B) : Pair B ASource#

Swaps the components of a tuple.

first {A B A'} (fun : A -> A') (pair : Pair A B) : Pair A' BSource#

Applies a function f to the first component.

second {A B B'} (fun : B -> B') (pair : Pair A B) : Pair A B'Source#

Applies a function f to the second component.

both {A B} (fun : A -> B) (pair : Pair A A) : Pair B BSource#

Applies a function f to both components.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Range-src.html b/pull-137/Stdlib/Data/Range-src.html new file mode 100644 index 000000000..a4136e6cb --- /dev/null +++ b/pull-137/Stdlib/Data/Range-src.html @@ -0,0 +1,94 @@ + +
module Stdlib.Data.Range;
+
+import Stdlib.Data.Fixity open;
+
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Trait.Natural open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Foldable open;
+import Stdlib.Data.Nat open;
+
+--- An inclusive range of naturals
+type Range N :=
+  mkRange@{
+    low : N;
+    high : N;
+  };
+
+type StepRange N :=
+  mkStepRange@{
+    range : Range N;
+    step : N;
+  };
+
+syntax operator to range;
+
+--- `x to y` is the range [x..y]
+{-# inline: always #-}
+to {N} {{Natural N}} (low high : N) : Range N := mkRange low high;
+
+syntax operator step step;
+
+--- `x to y step s` is the range [x, x + s, ..., y]
+{-# inline: always #-}
+step {N} (range : Range N) (step : N) : StepRange N := mkStepRange range step;
+
+-- This instance assumes that `low <= high`.
+{-# specialize: true, inline: case #-}
+instance
+foldableRangeI {N} {{Eq N}} {{Natural N}} : Foldable (Range N) N :=
+  mkFoldable@{
+    {-# specialize: [1, 3] #-}
+    for {B : Type} (fun : B -> N -> B) (initialValue : B) : Range N -> B
+      | (mkRange low high) :=
+        let
+          {-# specialize-by: [fun, high] #-}
+          terminating
+          go (acc : B) (next : N) : B :=
+            if 
+              | next == high := fun acc next
+              | else := go (fun acc next) (next + 1);
+        in go initialValue low;
+    {-# specialize: [1, 3] #-}
+    rfor {B : Type} (fun : B -> N -> B) (initialValue : B) : Range N -> B
+      | (mkRange low high) :=
+        let
+          {-# specialize-by: [fun, high] #-}
+          terminating
+          go (next : N) : B :=
+            if 
+              | next == high := fun initialValue next
+              | else := fun (go (next + 1)) next;
+        in go low;
+  };
+
+-- This instance assumes that (low + step*k > high) for some k.
+{-# specialize: true, inline: case #-}
+instance
+foldableStepRangeI {N} {{Ord N}} {{Natural N}} : Foldable (StepRange N) N :=
+  mkFoldable@{
+    {-# specialize: [1, 3] #-}
+    for {B : Type} (fun : B -> N -> B) (initialValue : B) : StepRange N -> B
+      | (mkStepRange (mkRange low high) step) :=
+        let
+          {-# specialize-by: [fun, high, step] #-}
+          terminating
+          go (acc : B) (next : N) : B :=
+            if 
+              | next > high := acc
+              | else := go (fun acc next) (next + step);
+        in go initialValue low;
+    {-# specialize: [1, 3] #-}
+    rfor {B : Type} (fun : B -> N -> B) (initialValue : B) : StepRange N -> B
+      | (mkStepRange (mkRange low high) step) :=
+        let
+          {-# specialize-by: [fun, high, step] #-}
+          terminating
+          go (next : N) : B :=
+            if 
+              | next <= high := fun (go (next + step)) next
+              | else := initialValue;
+        in go low;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Range.html b/pull-137/Stdlib/Data/Range.html new file mode 100644 index 000000000..e1ed890f6 --- /dev/null +++ b/pull-137/Stdlib/Data/Range.html @@ -0,0 +1,10 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Range

Definitions

type Range NSource#

An inclusive range of naturals

Constructors

mkRange@{ + low : N; + high : N; +}

Constructors

mkStepRange@{ + range : Range N; + step : N; +}

to {N} {{Natural N}} (low high : N) : Range NSource#

`x to y` is the range [x..y]

step {N} (range : Range N) (step : N) : StepRange NSource#

`x to y step s` is the range [x, x + s, ..., y]

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Result-src.html b/pull-137/Stdlib/Data/Result-src.html new file mode 100644 index 000000000..8a2b30fad --- /dev/null +++ b/pull-137/Stdlib/Data/Result-src.html @@ -0,0 +1,71 @@ + +
module Stdlib.Data.Result;
+
+import Stdlib.Data.Result.Base open public;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.String.Base open;
+import Stdlib.Data.Pair.Base open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait open;
+
+{-# specialize: true, inline: case #-}
+deriving instance
+ordResultI {Error Value} {{Ord Error}} {{Ord Value}} : Ord (Result Error Value);
+
+{-# specialize: true, inline: case #-}
+deriving instance
+eqResultI {Error Value} {{Eq Error}} {{Eq Value}} : Eq (Result Error Value);
+
+instance
+showResultI
+  {Error Value} {{Show Error}} {{Show Value}} : Show (Result Error Value) :=
+  mkShow@{
+    show : Result Error Value -> String
+      | (error x) := "Error (" ++str Show.show x ++str ")"
+      | (ok x) := "Ok (" ++str Show.show x ++str ")";
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+functorResultI {Error} : Functor (Result Error) :=
+  mkFunctor@{
+    map := mapOk;
+  };
+
+{-# specialize: true, inline: true #-}
+instance
+monomorphicFunctorResultI
+  {Error Value} : Monomorphic.Functor (Result Error Value) Value :=
+  fromPolymorphicFunctor;
+
+instance
+applicativeResultI {Error} : Applicative (Result Error) :=
+  mkApplicative@{
+    pure := ok;
+    ap
+      {A B}
+      (resultFun : Result Error (A -> B))
+      (result : Result Error A)
+      : Result Error B :=
+      case resultFun, result of
+        | ok f, ok x := ok (f x)
+        | ok _, error e := error e
+        | error e, _ := error e;
+  };
+
+instance
+monadResultI {Error} : Monad (Result Error) :=
+  mkMonad@{
+    bind
+      {A B}
+      (result : Result Error A)
+      (fun : A -> Result Error B)
+      : Result Error B :=
+      case result of
+        | error e := error e
+        | ok a := fun a;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Result.html b/pull-137/Stdlib/Data/Result.html new file mode 100644 index 000000000..66547de23 --- /dev/null +++ b/pull-137/Stdlib/Data/Result.html @@ -0,0 +1,13 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Result

Definitions

import Stdlib.Data.Result.Base open public

{-# specialize: true, inline: case #-} +deriving instance +ordResultI {Error Value} {{Ord Error}} {{Ord Value}} : Ord (Result Error Value)Source#

{-# specialize: true, inline: case #-} +deriving instance +eqResultI {Error Value} {{Eq Error}} {{Eq Value}} : Eq (Result Error Value)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Result/Base-src.html b/pull-137/Stdlib/Data/Result/Base-src.html new file mode 100644 index 000000000..746999855 --- /dev/null +++ b/pull-137/Stdlib/Data/Result/Base-src.html @@ -0,0 +1,80 @@ + +
module Stdlib.Data.Result.Base;
+
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.Maybe.Base open;
+import Stdlib.Function open;
+
+--- The Result type represents either a success with a value of `ok` or an error
+--- with value `error`.
+type Result Error Value :=
+  | error Error
+  | ok Value;
+
+--- Apply the onError function if the value is ;error; or apply the
+--- onOk function if the value is ;ok;.
+{-# inline: true #-}
+handleResult
+  {Error Value1 Value2}
+  (onError : Error -> Value2)
+  (onOk : Value1 -> Value2)
+  (result : Result Error Value1)
+  : Value2 :=
+  case result of
+    | error a := onError a
+    | ok a := onOk a;
+
+--- Apply a function f to the ;error; value of a Result.
+mapError
+  {Value Error1 Error2}
+  (fun : Error1 -> Error2)
+  (result : Result Error1 Value)
+  : Result Error2 Value := handleResult (fun >> error) ok result;
+
+--- Apply a function f to the ;ok; value of a Result.
+mapOk
+  {Error Value1 Value2}
+  (fun : Value1 -> Value2)
+  (result : Result Error Value1)
+  : Result Error Value2 := handleResult error (fun >> ok) result;
+
+--- Return ;true; if the value is an ;error;, otherwise ;false;.
+isError {Error Value} (result : Result Error Value) : Bool :=
+  case result of
+    | error _ := true
+    | ok _ := false;
+
+--- Return ;true; if the value is ;ok;, otherwise ;false;.
+isOk {Error Value} (result : Result Error Value) : Bool :=
+  case result of
+    | error _ := false
+    | ok _ := true;
+
+--- Return the contents of an ;error; value, otherwise return defaultError.
+fromError
+  {Error Value} (defaultError : Error) (result : Result Error Value) : Error :=
+  case result of
+    | error a := a
+    | ok _ := defaultError;
+
+--- Return the contents of an ;ok; value, otherwise return defaultValue.
+fromOk
+  {Error Value} (defaultValue : Value) (result : Result Error Value) : Value :=
+  case result of
+    | error _ := defaultValue
+    | ok b := b;
+
+--- Convert a Result to a Maybe. An ;error; value becomes `nothing`.
+resultToMaybe {Error Value} (result : Result Error Value) : Maybe Value :=
+  handleResult (const nothing) just result;
+
+--- Convert a Maybe to a Result. A ;nothing; value becomes `error defaultError`.
+maybeToResult
+  {Error Value}
+  (defaultError : Error)
+  (maybeValue : Maybe Value)
+  : Result Error Value :=
+  case maybeValue of
+    | nothing := error defaultError
+    | just x := ok x;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Result/Base.html b/pull-137/Stdlib/Data/Result/Base.html new file mode 100644 index 000000000..87d7aca4c --- /dev/null +++ b/pull-137/Stdlib/Data/Result/Base.html @@ -0,0 +1,21 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Result.Base

Definitions

type Result Error ValueSource#

The Result type represents either a success with a value of `ok` or an error with value `error`.

Constructors

| error Error
| ok Value

handleResult + {Error Value1 Value2} + (onError : Error -> Value2) + (onOk : Value1 -> Value2) + (result : Result Error Value1) + : Value2Source#

Apply the onError function if the value is error or apply the onOk function if the value is ok.

mapError + {Value Error1 Error2} + (fun : Error1 -> Error2) + (result : Result Error1 Value) + : Result Error2 ValueSource#

Apply a function f to the error value of a Result.

mapOk + {Error Value1 Value2} + (fun : Value1 -> Value2) + (result : Result Error Value1) + : Result Error Value2Source#

Apply a function f to the ok value of a Result.

isError {Error Value} (result : Result Error Value) : BoolSource#

Return true if the value is an error, otherwise false.

isOk {Error Value} (result : Result Error Value) : BoolSource#

Return true if the value is ok, otherwise false.

fromError + {Error Value} (defaultError : Error) (result : Result Error Value) : ErrorSource#

Return the contents of an error value, otherwise return defaultError.

fromOk + {Error Value} (defaultValue : Value) (result : Result Error Value) : ValueSource#

Return the contents of an ok value, otherwise return defaultValue.

resultToMaybe {Error Value} (result : Result Error Value) : Maybe ValueSource#

Convert a Result to a Maybe. An error value becomes `nothing`.

maybeToResult + {Error Value} + (defaultError : Error) + (maybeValue : Maybe Value) + : Result Error ValueSource#

Convert a Maybe to a Result. A nothing value becomes `error defaultError`.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Set-src.html b/pull-137/Stdlib/Data/Set-src.html new file mode 100644 index 000000000..a0300294f --- /dev/null +++ b/pull-137/Stdlib/Data/Set-src.html @@ -0,0 +1,13 @@ + +
module Stdlib.Data.Set;
+
+import Stdlib.Data.Set.AVL open public;
+import Stdlib.Trait.Eq as Eq open using {Eq};
+import Stdlib.Trait.Ord as Ord open using {Ord};
+
+syntax alias Set := AVLTree;
+
+eqSetI {A} {{Eq A}} : Eq (Set A) := eqAVLTreeI;
+
+ordSetI {A} {{Ord A}} : Ord (Set A) := ordAVLTreeI;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Set.html b/pull-137/Stdlib/Data/Set.html new file mode 100644 index 000000000..09f8fc99b --- /dev/null +++ b/pull-137/Stdlib/Data/Set.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Set

Definitions

import Stdlib.Data.Set.AVL open public

syntax alias Set := AVLTreeSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Set/AVL-src.html b/pull-137/Stdlib/Data/Set/AVL-src.html new file mode 100644 index 000000000..beb4253fe --- /dev/null +++ b/pull-137/Stdlib/Data/Set/AVL-src.html @@ -0,0 +1,485 @@ + +
--- AVL trees are a type of self-balancing binary search tree, where the heights
+--- of the left and right subtrees of every node differ by at most 1. This
+--- ensures that the height of the tree is logarithmic in the number of nodes,
+--- which guarantees efficient insertion, deletion, and search operations (all
+--- are guaranteed to run in 𝒪(log 𝓃) time).
+---
+--- This module defines an AVL tree data type and provides functions for
+--- constructing, modifying, and querying AVL trees.
+module Stdlib.Data.Set.AVL;
+
+import Stdlib.Data.Tree as Tree open using {Tree; Forest};
+import Stdlib.Data.Maybe open;
+import Stdlib.Data.Result open;
+import Stdlib.Data.Nat open;
+import Stdlib.Data.Int open;
+import Stdlib.Data.Bool open;
+import Stdlib.Data.Pair open;
+import Stdlib.Data.List open using {List; nil; ::; filter; ++; catMaybes};
+import Stdlib.Data.String open;
+import Stdlib.Trait.Foldable open hiding {foldr; foldl};
+import Stdlib.Function open;
+
+--- A self-balancing binary search tree.
+type AVLTree (A : Type) :=
+  | --- An empty AVL tree.
+    empty
+  | --- A node of an AVL tree.
+    node@{
+      element : A;
+      height : Nat;
+      left : AVLTree A;
+      right : AVLTree A;
+    };
+
+module Internal;
+  --- 𝒪(1) Retrieves the height of an ;AVLTree;. The height is the distance from
+  --- the root to the deepest child.
+  height {A} (set : AVLTree A) : Nat :=
+    case set of
+      | empty := 0
+      | node@{height} := height;
+
+  --- 𝒪(n). Maps a function over an ;AVLTree;. Does not check if
+  --- after mapping the order of the elements is preserved. It is the
+  --- responsibility of the caller to ensure that `f` preserves the ordering.
+  unsafeMap {A B} (f : A -> B) (set : AVLTree A) : AVLTree B :=
+    let
+      go : AVLTree A -> AVLTree B
+        | empty := empty
+        | node@{element; height; left; right} :=
+          -- TODO: use record creation syntax here once recursive definition
+            -- parsing is fixed (https://github.com/anoma/juvix/issues/2968,
+            -- https://github.com/anoma/juvix/issues/3112)
+            node
+            (f element)
+            height
+            (go left)
+            (go right);
+    in go set;
+
+  type BalanceFactor :=
+    | --- Left child is higher.
+      LeanLeft
+    | --- Equal heights of children.
+      LeanNone
+    | --- Right child is higher.
+      LeanRight;
+  
+  diffFactor {A} (set : AVLTree A) : Int :=
+    case set of
+      | empty := 0
+      | node@{left; right} := intSubNat (height right) (height left);
+
+  {-# inline: true #-}
+  balanceFactor' {A} (left right : AVLTree A) : BalanceFactor :=
+    let
+      h1 := height left;
+      h2 := height right;
+    in if 
+      | h1 < h2 := LeanRight
+      | h2 < h1 := LeanLeft
+      | else := LeanNone;
+
+  --- 𝒪(1). Computes the balance factor, i.e., the height of the right subtree
+  --- minus the height of the left subtree.
+  balanceFactor {A} (set : AVLTree A) : BalanceFactor :=
+    -- We avoid `diffFactor` here for efficiency.
+    case set of
+      | empty := LeanNone
+      | node@{left; right} := balanceFactor' left right;
+
+  --- 𝒪(1). Helper function for creating a node.
+  mkNode {A} (value : A) (left : AVLTree A) (right : AVLTree A) : AVLTree A :=
+    node value (1 + max (height left) (height right)) left right;
+
+  --- 𝒪(1). Left rotation.
+  rotateLeft {A} (set : AVLTree A) : AVLTree A :=
+    case set of
+      | node x _ a (node z _ b c) := mkNode z (mkNode x a b) c
+      | n := n;
+
+  --- 𝒪(1). Right rotation.
+  rotateRight {A} (set : AVLTree A) : AVLTree A :=
+    case set of
+      | node z _ (node y _ x t3) t4 := mkNode y x (mkNode z t3 t4)
+      | n := n;
+
+  --- 𝒪(1). Applies local rotations if needed.
+  balance {A} (set : AVLTree A) : AVLTree A :=
+    case set of
+      | empty := empty
+      | node@{element; height; left; right} :=
+        case balanceFactor' left right of
+          | LeanRight :=
+            case balanceFactor right of {
+              | LeanLeft := rotateLeft (mkNode element left (rotateRight right))
+              | _ := rotateLeft set
+            }
+          | LeanLeft :=
+            case balanceFactor left of {
+              | LeanRight :=
+                rotateRight (mkNode element (rotateLeft left) right)
+              | _ := rotateRight set
+            }
+          | LeanNone := set;
+
+  --- 𝒪(𝓃). Checks the ;AVLTree; height invariant. I.e. that
+  --- every two children do not differ on height by more than 1.
+  isBalanced {A} : (set : AVLTree A) -> Bool
+    | empty := true
+    | set@node@{left; right} :=
+      isBalanced left && isBalanced right && abs (diffFactor set) <= 1;
+end;
+
+open Internal;
+
+--- 𝒪(log 𝓃). Lookup a member from the set using a projection function.
+--- Ord A, Ord K and fun must be compatible. i.e cmp_k (fun a1) (fun a2) == cmp_a a1 a2
+{-# specialize: [1, 2] #-}
+lookupWith
+  {A K}
+  {{order : Ord K}}
+  (fun : A -> K)
+  (elem : K)
+  (set : AVLTree A)
+  : Maybe A :=
+  let
+    {-# specialize-by: [order, fun] #-}
+    go : AVLTree A -> Maybe A
+      | empty := nothing
+      | node@{element; left; right} :=
+        case Ord.cmp elem (fun element) of
+          | LessThan := go left
+          | GreaterThan := go right
+          | Equal := just element;
+  in go set;
+
+--- 𝒪(log 𝓃). Queries whether `elem` is in `set`.
+{-# specialize: [1] #-}
+lookup {A} {{Ord A}} (elem : A) (set : AVLTree A) : Maybe A :=
+  lookupWith id elem set;
+
+--- 𝒪(log 𝓃). Queries whether `elem` is in `set`.
+{-# specialize: [1] #-}
+isMember {A} {{Ord A}} (elem : A) (set : AVLTree A) : Bool :=
+  isJust (lookupWith id elem set);
+
+--- 𝒪(log 𝓃). Inserts an element `elem` into `set` using a function to
+--- deduplicate entries.
+---
+--- Assumption: If a1 == a2 then fun a1 a2 == a1 == a2
+--- where == comes from Ord a.
+{-# specialize: [1, 2] #-}
+insertWith
+  {A}
+  {{order : Ord A}}
+  (fun : A -> A -> A)
+  (elem : A)
+  (set : AVLTree A)
+  : AVLTree A :=
+  let
+    {-# specialize-by: [order, fun] #-}
+    go : AVLTree A -> AVLTree A
+      | empty := mkNode elem empty empty
+      | node@{element; height; left; right} :=
+        case Ord.cmp elem element of
+          | LessThan := balance (mkNode element (go left) right)
+          | GreaterThan := balance (mkNode element left (go right))
+          | Equal := node (fun element elem) height left right;
+  in go set;
+
+--- 𝒪(log 𝓃). Inserts `elem` into `set`.
+{-# specialize: [1] #-}
+insert {A} {{Ord A}} (elem : A) (set : AVLTree A) : AVLTree A :=
+  insertWith (flip const) elem set;
+
+--- 𝒪(log 𝓃). Removes the minimum element from `set`.
+{-# specialize: [1] #-}
+deleteMin {A} {{Ord A}} : (set : AVLTree A) -> Maybe (Pair A (AVLTree A))
+  | empty := nothing
+  | node@{element; left; right} :=
+    case deleteMin left of
+      | nothing := just (element, right)
+      | just (element', left') := just (element', mkNode element left' right);
+
+--- 𝒪(log 𝓃). Removes an element `elem` from `set` based on a projected comparison value.
+---
+--- Assumption Ord A and Ord B are compatible: Given a1 a2, A then (fun a1 == fun a2) == (a1 == a2)
+{-# specialize: [1, 2, 3] #-}
+deleteWith
+  {A B}
+  {{orderA : Ord A}}
+  {{orderB : Ord B}}
+  (fun : A -> B)
+  (elem : B)
+  (set : AVLTree A)
+  : AVLTree A :=
+  let
+    {-# specialize-by: [orderA, orderB, fun] #-}
+    go : AVLTree A -> AVLTree A
+      | empty := empty
+      | node@{element; left; right} :=
+        case Ord.cmp elem (fun element) of
+          | LessThan := balance (mkNode element (go left) right)
+          | GreaterThan := balance (mkNode element left (go right))
+          | Equal :=
+            case left of
+              | empty := right
+              | _ :=
+                case deleteMin right of
+                  | nothing := left
+                  | just (minRight, right') :=
+                    balance (mkNode minRight left right');
+  in go set;
+
+--- 𝒪(log 𝓃). Removes `elem` from `set`.
+{-# specialize: [1] #-}
+delete {A} {{Ord A}} (elem : A) (set : AVLTree A) : AVLTree A :=
+  deleteWith id elem set;
+
+--- 𝒪(log 𝓃). Returns the minimum element of `set`.
+lookupMin {A} : (set : AVLTree A) -> Maybe A
+  | empty := nothing
+  | (node y _ empty empty) := just y
+  | (node _ _ empty r) := lookupMin r
+  | (node _ _ l _) := lookupMin l;
+
+--- 𝒪(log 𝓃). Returns the maximum element of `set`.
+lookupMax {A} : (set : AVLTree A) -> Maybe A
+  | empty := nothing
+  | (node y _ empty empty) := just y
+  | (node _ _ l empty) := lookupMax l
+  | (node _ _ _ r) := lookupMax r;
+
+--- 𝒪(𝒹 log 𝓃). Deletes elements from `set`.
+{-# specialize: [1] #-}
+deleteMany {A} {{Ord A}} (toDelete : List A) (set : AVLTree A) : AVLTree A :=
+  deleteManyWith id toDelete set;
+
+--- 𝒪(𝒹 log 𝓃). Deletes elements from `set` based on a projected comparison value.
+---
+--- Assumption: Ord A and Ord B are compatible, i.e., for a1 a2 in A, we have (fun a1 == fun a2) == (a1 == a2)
+{-# specialize: [1, 2] #-}
+deleteManyWith
+  {A B}
+  {{Ord A}}
+  {{Ord B}}
+  (fun : A -> B)
+  (toDelete : List B)
+  (set : AVLTree A)
+  : AVLTree A :=
+  for (acc := set) (x in toDelete) {
+    deleteWith fun x acc
+  };
+
+--- 𝒪(𝓃 log 𝓃). Create a set from an unsorted ;List;.
+{-# specialize: [1] #-}
+fromList {A} {{Ord A}} (list : List A) : AVLTree A :=
+  for (acc := empty) (x in list) {
+    insert x acc
+  };
+
+--- 𝒪(1). Checks if `set` is empty.
+{-# inline: true #-}
+isEmpty {A} (set : AVLTree A) : Bool :=
+  case set of
+    | empty := true
+    | node@{} := false;
+
+--- 𝒪(𝓃). Returns the number of elements of `set`.
+size {A} : (set : AVLTree A) -> Nat
+  | empty := 0
+  | node@{left; right} := 1 + size left + size right;
+
+{-# specialize: [1] #-}
+foldr {A B} (fun : A -> B -> B) (acc : B) : (set : AVLTree A) -> B
+  | empty := acc
+  | node@{element; left; right} :=
+    foldr fun (fun element (foldr fun acc right)) left;
+
+{-# specialize: [1] #-}
+foldl {A B} (fun : B -> A -> B) (acc : B) : (set : AVLTree A) -> B
+  | empty := acc
+  | node@{element; left; right} :=
+    foldl fun (fun (foldl fun acc left) element) right;
+
+{-# specialize: true, inline: case #-}
+instance
+polymorphicFoldableAVLTreeI : Polymorphic.Foldable AVLTree :=
+  Polymorphic.mkFoldable@{
+    {-# inline: true #-}
+    for {A B} (f : B -> A -> B) (acc : B) (set : AVLTree A) : B :=
+      foldl f acc set;
+    {-# inline: true #-}
+    rfor {A B} (f : B -> A -> B) (acc : B) (set : AVLTree A) : B :=
+      foldr (flip f) acc set;
+  };
+
+{-# specialize: true, inline: true #-}
+instance
+foldableAVLTreeI {A} : Foldable (AVLTree A) A := fromPolymorphicFoldable;
+
+--- 𝒪(n). Returns the elements of `set` in ascending order.
+toList {A} (set : AVLTree A) : List A :=
+  rfor (acc := nil) (x in set) {
+    x :: acc
+  };
+
+--- 𝒪(n log n). Returns a set containing the elements that are members of `set1` and `set2`.
+{-# specialize: [1] #-}
+intersection {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree A :=
+  for (acc := empty) (x in set1) {
+    if 
+      | isMember x set2 := insert x acc
+      | else := acc
+  };
+
+--- 𝒪(n log n). Returns a set containing the elements that are members of `set1` but not of `set2`.
+{-# specialize: [1] #-}
+difference {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree A :=
+  for (acc := empty) (x in set1) {
+    if 
+      | isMember x set2 := acc
+      | else := insert x acc
+  };
+
+--- 𝒪(n log (m + n)). Returns a set containing the elements that are members of
+--- `set1` or `set2`. This is a left-biased union of `set1` and `set2` which
+--- prefers `set1` when duplicate elements are encountered.
+{-# specialize: [1] #-}
+unionLeft {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree A :=
+  for (acc := set2) (x in set1) {
+    insert x acc
+  };
+
+--- 𝒪(min(n,m) log min(n, m)). Returns a set containing the elements that are members of `set1` or `set2`.
+{-# specialize: [1] #-}
+union {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree A :=
+  if 
+    | height set1 < height set2 := unionLeft set1 set2
+    | else := unionLeft set2 set1;
+
+--- O(n log n). Returns a set containing the elements that are members of some set in `sets`.
+{-# specialize: [1, 2] #-}
+unions
+  {Container Elem}
+  {{Ord Elem}}
+  {{Foldable Container (AVLTree Elem)}}
+  (sets : Container)
+  : AVLTree Elem :=
+  for (acc := empty) (set in sets) {
+    union acc set
+  };
+
+--- O(n log n). If `set1` and `set2` are disjoint, then returns `ok set` where
+--- `set` is the union of `set1` and `set2`. If `set1` and `set2` are not
+--- disjoint, then returns `error x` where `x` is a common element.
+{-# specialize: [1] #-}
+disjointUnion {A} {{Ord A}} (set1 set2 : AVLTree A) : Result A (AVLTree A) :=
+  let
+    goUnion (set1 set2 : AVLTree A) : Result A (AVLTree A) :=
+      for (acc := ok set2) (x in set1) {
+        case acc of
+          | error _ := acc
+          | ok set :=
+            if 
+              | isMember x set2 := error x
+              | else := ok (insert x set)
+      };
+  in if 
+    | height set1 < height set2 := goUnion set1 set2
+    | else := goUnion set2 set1;
+
+syntax iterator all {init := 0; range := 1};
+--- 𝒪(𝓃). Returns ;true; if all elements of `set` satisfy `predicate`.
+{-# specialize: [1] #-}
+all {A} (predicate : A -> Bool) (set : AVLTree A) : Bool :=
+  let
+    go : AVLTree A -> Bool
+      | empty := true
+      | node@{element; left; right} := predicate element && go left && go right;
+  in go set;
+
+syntax iterator any {init := 0; range := 1};
+--- 𝒪(𝓃). Returns ;true; if some element of `set` satisfies `predicate`.
+{-# specialize: [1] #-}
+any {A} (predicate : A -> Bool) (set : AVLTree A) : Bool :=
+  let
+    go : AVLTree A -> Bool
+      | empty := true
+      | node@{element; left; right} := predicate element || go left || go right;
+  in go set;
+
+syntax iterator filter {init := 0; range := 1};
+--- 𝒪(n log n). Returns a set containing all elements of `set` that satisfy `predicate`.
+{-# specialize: [1] #-}
+filter {A} {{Ord A}} (predicate : A -> Bool) (set : AVLTree A) : AVLTree A :=
+  for (acc := empty) (x in set) {
+    if 
+      | predicate x := insert x acc
+      | else := acc
+  };
+
+syntax iterator partition {init := 0; range := 1};
+partition
+  {A}
+  {{Ord A}}
+  (predicate : A -> Bool)
+  (set : AVLTree A)
+  : Pair (AVLTree A) (AVLTree A) :=
+  for (trueSet, falseSet := empty, empty) (x in set) {
+    if 
+      | predicate x := insert x trueSet, falseSet
+      | else := trueSet, insert x falseSet
+  };
+
+--- 𝒪(1). Creates a set with a single element `elem`.
+singleton {A} (elem : A) : AVLTree A := mkNode elem empty empty;
+
+--- 𝒪(n log n). Checks if all elements of `set1` are in `set2`.
+isSubset {A} {{Ord A}} (set1 set2 : AVLTree A) : Bool :=
+  all (x in set1) {
+    isMember x set2
+  };
+
+syntax iterator map {init := 0; range := 1};
+map {A B} {{Ord B}} (fun : A -> B) (set : AVLTree A) : AVLTree B :=
+  for (acc := empty) (x in set) {
+    insert (fun x) acc
+  };
+
+--- Formats the set in a debug friendly format.
+prettyDebug {A} {{Show A}} (set : AVLTree A) : String :=
+  let
+    go : AVLTree A -> String
+      | empty := "_"
+      | set@node@{element; left; right} :=
+        "("
+          ++str go left
+          ++str " h"
+          ++str Show.show (diffFactor set)
+          ++str " "
+          ++str Show.show element
+          ++str " "
+          ++str go right
+          ++str ")";
+  in go set;
+
+--- 𝒪(𝓃).
+toTree {A} : (set : AVLTree A) -> Maybe (Tree A)
+  | empty := nothing
+  | node@{element; left; right} :=
+    just (Tree.node element (catMaybes (toTree left :: toTree right :: nil)));
+
+--- Returns the textual representation of an ;AVLTree;.
+pretty {A} {{Show A}} (set : AVLTree A) : String :=
+  maybe "empty" Tree.treeToString (toTree set);
+
+instance
+eqAVLTreeI {A} {{Eq A}} : Eq (AVLTree A) := mkEq (Eq.eq on toList);
+
+instance
+ordAVLTreeI {A} {{Ord A}} : Ord (AVLTree A) := mkOrd (Ord.cmp on toList);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Set/AVL.html b/pull-137/Stdlib/Data/Set/AVL.html new file mode 100644 index 000000000..9540b0c34 --- /dev/null +++ b/pull-137/Stdlib/Data/Set/AVL.html @@ -0,0 +1,42 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Set.AVL

Description

AVL trees are a type of self-balancing binary search tree, where the heights of the left and right subtrees of every node differ by at most 1. This ensures that the height of the tree is logarithmic in the number of nodes, which guarantees efficient insertion, deletion, and search operations (all are guaranteed to run in 𝒪(log 𝓃) time). This module defines an AVL tree data type and provides functions for constructing, modifying, and querying AVL trees.

Definitions

type AVLTree (A : Type)Source#

A self-balancing binary search tree.

Constructors

| empty

An empty AVL tree.

| node@{ + element : A; + height : Nat; + left : AVLTree A; + right : AVLTree A; + }

A node of an AVL tree.

height {A} (set : AVLTree A) : NatSource#

𝒪(1) Retrieves the height of an AVLTree. The height is the distance from the root to the deepest child.

unsafeMap {A B} (f : A -> B) (set : AVLTree A) : AVLTree BSource#

𝒪(n). Maps a function over an AVLTree. Does not check if after mapping the order of the elements is preserved. It is the responsibility of the caller to ensure that `f` preserves the ordering.

Constructors

| LeanLeft

Left child is higher.

| LeanNone

Equal heights of children.

| LeanRight

Right child is higher.

balanceFactor {A} (set : AVLTree A) : BalanceFactorSource#

𝒪(1). Computes the balance factor, i.e., the height of the right subtree minus the height of the left subtree.

mkNode {A} (value : A) (left : AVLTree A) (right : AVLTree A) : AVLTree ASource#

𝒪(1). Helper function for creating a node.

rotateLeft {A} (set : AVLTree A) : AVLTree ASource#

𝒪(1). Left rotation.

rotateRight {A} (set : AVLTree A) : AVLTree ASource#

𝒪(1). Right rotation.

balance {A} (set : AVLTree A) : AVLTree ASource#

𝒪(1). Applies local rotations if needed.

isBalanced {A} : (set : AVLTree A) -> BoolSource#

𝒪(𝓃). Checks the AVLTree height invariant. I.e. that every two children do not differ on height by more than 1.

lookupWith + {A K} {{order : Ord K}} (fun : A -> K) (elem : K) (set : AVLTree A) : Maybe ASource#

𝒪(log 𝓃). Lookup a member from the set using a projection function. Ord A, Ord K and fun must be compatible. i.e cmp_k (fun a1) (fun a2) == cmp_a a1 a2

lookup {A} {{Ord A}} (elem : A) (set : AVLTree A) : Maybe ASource#

𝒪(log 𝓃). Queries whether `elem` is in `set`.

isMember {A} {{Ord A}} (elem : A) (set : AVLTree A) : BoolSource#

𝒪(log 𝓃). Queries whether `elem` is in `set`.

insertWith + {A} + {{order : Ord A}} + (fun : A -> A -> A) + (elem : A) + (set : AVLTree A) + : AVLTree ASource#

𝒪(log 𝓃). Inserts an element `elem` into `set` using a function to deduplicate entries. Assumption: If a1 == a2 then fun a1 a2 == a1 == a2 where == comes from Ord a.

insert {A} {{Ord A}} (elem : A) (set : AVLTree A) : AVLTree ASource#

𝒪(log 𝓃). Inserts `elem` into `set`.

deleteMin {A} {{Ord A}} : (set : AVLTree A) -> Maybe (Pair A (AVLTree A))Source#

𝒪(log 𝓃). Removes the minimum element from `set`.

deleteWith + {A B} + {{orderA : Ord A}} + {{orderB : Ord B}} + (fun : A -> B) + (elem : B) + (set : AVLTree A) + : AVLTree ASource#

𝒪(log 𝓃). Removes an element `elem` from `set` based on a projected comparison value. Assumption Ord A and Ord B are compatible: Given a1 a2, A then (fun a1 == fun a2) == (a1 == a2)

delete {A} {{Ord A}} (elem : A) (set : AVLTree A) : AVLTree ASource#

𝒪(log 𝓃). Removes `elem` from `set`.

lookupMin {A} : (set : AVLTree A) -> Maybe ASource#

𝒪(log 𝓃). Returns the minimum element of `set`.

lookupMax {A} : (set : AVLTree A) -> Maybe ASource#

𝒪(log 𝓃). Returns the maximum element of `set`.

deleteMany {A} {{Ord A}} (toDelete : List A) (set : AVLTree A) : AVLTree ASource#

𝒪(𝒹 log 𝓃). Deletes elements from `set`.

deleteManyWith + {A B} + {{Ord A}} + {{Ord B}} + (fun : A -> B) + (toDelete : List B) + (set : AVLTree A) + : AVLTree ASource#

𝒪(𝒹 log 𝓃). Deletes elements from `set` based on a projected comparison value. Assumption: Ord A and Ord B are compatible, i.e., for a1 a2 in A, we have (fun a1 == fun a2) == (a1 == a2)

fromList {A} {{Ord A}} (list : List A) : AVLTree ASource#

𝒪(𝓃 log 𝓃). Create a set from an unsorted List.

isEmpty {A} (set : AVLTree A) : BoolSource#

𝒪(1). Checks if `set` is empty.

size {A} : (set : AVLTree A) -> NatSource#

𝒪(𝓃). Returns the number of elements of `set`.

foldr {A B} (fun : A -> B -> B) (acc : B) : (set : AVLTree A) -> BSource#

foldl {A B} (fun : B -> A -> B) (acc : B) : (set : AVLTree A) -> BSource#

toList {A} (set : AVLTree A) : List ASource#

𝒪(n). Returns the elements of `set` in ascending order.

intersection {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree ASource#

𝒪(n log n). Returns a set containing the elements that are members of `set1` and `set2`.

difference {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree ASource#

𝒪(n log n). Returns a set containing the elements that are members of `set1` but not of `set2`.

unionLeft {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree ASource#

𝒪(n log (m + n)). Returns a set containing the elements that are members of `set1` or `set2`. This is a left-biased union of `set1` and `set2` which prefers `set1` when duplicate elements are encountered.

union {A} {{Ord A}} (set1 set2 : AVLTree A) : AVLTree ASource#

𝒪(min(n,m) log min(n, m)). Returns a set containing the elements that are members of `set1` or `set2`.

unions + {Container Elem} + {{Ord Elem}} + {{Foldable Container (AVLTree Elem)}} + (sets : Container) + : AVLTree ElemSource#

O(n log n). Returns a set containing the elements that are members of some set in `sets`.

disjointUnion {A} {{Ord A}} (set1 set2 : AVLTree A) : Result A (AVLTree A)Source#

O(n log n). If `set1` and `set2` are disjoint, then returns `ok set` where `set` is the union of `set1` and `set2`. If `set1` and `set2` are not disjoint, then returns `error x` where `x` is a common element.

all {A} (predicate : A -> Bool) (set : AVLTree A) : BoolSource#

𝒪(𝓃). Returns true if all elements of `set` satisfy `predicate`.

any {A} (predicate : A -> Bool) (set : AVLTree A) : BoolSource#

𝒪(𝓃). Returns true if some element of `set` satisfies `predicate`.

filter {A} {{Ord A}} (predicate : A -> Bool) (set : AVLTree A) : AVLTree ASource#

𝒪(n log n). Returns a set containing all elements of `set` that satisfy `predicate`.

singleton {A} (elem : A) : AVLTree ASource#

𝒪(1). Creates a set with a single element `elem`.

isSubset {A} {{Ord A}} (set1 set2 : AVLTree A) : BoolSource#

𝒪(n log n). Checks if all elements of `set1` are in `set2`.

map {A B} {{Ord B}} (fun : A -> B) (set : AVLTree A) : AVLTree BSource#

prettyDebug {A} {{Show A}} (set : AVLTree A) : StringSource#

Formats the set in a debug friendly format.

toTree {A} : (set : AVLTree A) -> Maybe (Tree A)Source#

𝒪(𝓃).

pretty {A} {{Show A}} (set : AVLTree A) : StringSource#

Returns the textual representation of an AVLTree.

instance +eqAVLTreeI {A} {{Eq A}} : Eq (AVLTree A)Source#

instance +ordAVLTreeI {A} {{Ord A}} : Ord (AVLTree A)Source#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String-src.html b/pull-137/Stdlib/Data/String-src.html new file mode 100644 index 000000000..b23d54d18 --- /dev/null +++ b/pull-137/Stdlib/Data/String-src.html @@ -0,0 +1,19 @@ + +
module Stdlib.Data.String;
+
+import Stdlib.Data.String.Base open public;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Show open;
+
+import Stdlib.Data.String.Ord as String;
+
+instance
+eqStringI : Eq String := mkEq (String.==);
+
+instance
+showStringI : Show String :=
+  let
+    go (s : String) : String := "\"" ++str s ++str "\"";
+  in mkShow go;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String.html b/pull-137/Stdlib/Data/String.html new file mode 100644 index 000000000..bb3aec752 --- /dev/null +++ b/pull-137/Stdlib/Data/String.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.String

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String/Base-src.html b/pull-137/Stdlib/Data/String/Base-src.html new file mode 100644 index 000000000..ab0543126 --- /dev/null +++ b/pull-137/Stdlib/Data/String/Base-src.html @@ -0,0 +1,14 @@ + +
module Stdlib.Data.String.Base;
+
+import Juvix.Builtin.V1.String open public;
+import Stdlib.Data.List.Base open;
+import Stdlib.Function open;
+import Stdlib.Data.Fixity open;
+
+--- Concatenates a ;List; of ;String;s.
+concatStr (string : List String) : String := listFoldl (++str) "" string;
+
+--- Joins a ;List; of ;String;s with "\n".
+unlines (list : List String) : String := concatStr (intersperse "\n" list);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String/Base.html b/pull-137/Stdlib/Data/String/Base.html new file mode 100644 index 000000000..29d7b596b --- /dev/null +++ b/pull-137/Stdlib/Data/String/Base.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.String.Base

Definitions

import Juvix.Builtin.V1.String open public

unlines (list : List String) : StringSource#

Joins a List of Strings with "\n".

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String/Ord-src.html b/pull-137/Stdlib/Data/String/Ord-src.html new file mode 100644 index 000000000..15981f4ba --- /dev/null +++ b/pull-137/Stdlib/Data/String/Ord-src.html @@ -0,0 +1,13 @@ + +
module Stdlib.Data.String.Ord;
+
+import Stdlib.Data.Fixity open;
+
+import Stdlib.Data.String.Base open;
+import Stdlib.Data.Bool open;
+
+syntax operator == comparison;
+--- Equality for ;String;s.
+builtin string-eq
+axiom == : String -> String -> Bool;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/String/Ord.html b/pull-137/Stdlib/Data/String/Ord.html new file mode 100644 index 000000000..9c77f4ff6 --- /dev/null +++ b/pull-137/Stdlib/Data/String/Ord.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.String.Ord

Definitions

builtin string-eq +axiom == : String -> String -> BoolSource#

Equality for Strings.

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Tree-src.html b/pull-137/Stdlib/Data/Tree-src.html new file mode 100644 index 000000000..f2e3435ae --- /dev/null +++ b/pull-137/Stdlib/Data/Tree-src.html @@ -0,0 +1,38 @@ + +
--- N-Ary trees with pretty printing.
+module Stdlib.Data.Tree;
+
+import Stdlib.Data.List open;
+import Stdlib.Data.String open;
+import Stdlib.Trait.Show open;
+import Stdlib.Function open;
+
+--- A ;List; of trees.
+Forest (A : Type) : Type := List (Tree A);
+
+--- N-Ary tree.
+type Tree (A : Type) :=
+  node@{
+    element : A;
+    children : List (Tree A);
+  };
+
+terminating
+draw {A} {{Show A}} (tree : Tree A) : List String :=
+  Show.show (Tree.element tree) :: drawForest (Tree.children tree);
+
+terminating
+drawForest {A} {{Show A}} (forest : Forest A) : List String :=
+  let
+    shift (first other : String) (xs : List String) : List String :=
+      zipWith (++str) (first :: replicate (length xs) other) xs;
+  in case forest of
+       | [] := []
+       | [h] := "|" :: shift "`- " "   " (draw h)
+       | h :: hs := "|" :: shift "+- " "|  " (draw h) ++ drawForest hs;
+
+treeToString {A} {{Show A}} (tree : Tree A) : String := unlines (draw tree);
+
+forestToString {A} {{Show A}} (forest : Forest A) : String :=
+  unlines (drawForest forest);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Tree.html b/pull-137/Stdlib/Data/Tree.html new file mode 100644 index 000000000..559b6625a --- /dev/null +++ b/pull-137/Stdlib/Data/Tree.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Tree

Description

N-Ary trees with pretty printing.

Definitions

Forest (A : Type) : TypeSource#

A List of trees.

type Tree (A : Type)Source#

N-Ary tree.

Constructors

node@{ + element : A; + children : List (Tree A); +}

terminating +draw {A} {{Show A}} (tree : Tree A) : List StringSource#

terminating +drawForest {A} {{Show A}} (forest : Forest A) : List StringSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Unit-src.html b/pull-137/Stdlib/Data/Unit-src.html new file mode 100644 index 000000000..a6fb1b18a --- /dev/null +++ b/pull-137/Stdlib/Data/Unit-src.html @@ -0,0 +1,45 @@ + +
--- The unit type.
+module Stdlib.Data.Unit;
+
+import Stdlib.Data.Unit.Base open public;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.String.Base open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait.Foldable open;
+
+deriving instance
+eqUnitI : Eq Unit;
+
+deriving instance
+ordUnitI : Ord Unit;
+
+instance
+showUnitI : Show Unit :=
+  mkShow@{
+    show (_ : Unit) : String := "unit";
+  };
+
+{-# specialize: true, inline: case #-}
+instance
+foldableUnitI : Foldable Unit Unit :=
+  mkFoldable@{
+    {-# inline: true #-}
+    rfor
+      {Acc : Type}
+      (fun : Acc -> Unit -> Acc)
+      (initialValue : Acc)
+      (_ : Unit)
+      : Acc := fun initialValue unit;
+    {-# inline: true #-}
+    for
+      {Acc : Type}
+      (fun : Acc -> Unit -> Acc)
+      (initialValue : Acc)
+      (_ : Unit)
+      : Acc := fun initialValue unit;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Unit.html b/pull-137/Stdlib/Data/Unit.html new file mode 100644 index 000000000..fd3d7ab6b --- /dev/null +++ b/pull-137/Stdlib/Data/Unit.html @@ -0,0 +1,6 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Unit

Description

The unit type.

Definitions

import Stdlib.Data.Unit.Base open public

deriving instance +eqUnitI : Eq UnitSource#

deriving instance +ordUnitI : Ord UnitSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Unit/Base-src.html b/pull-137/Stdlib/Data/Unit/Base-src.html new file mode 100644 index 000000000..4f50e0521 --- /dev/null +++ b/pull-137/Stdlib/Data/Unit/Base-src.html @@ -0,0 +1,15 @@ + +
--- The unit type.
+module Stdlib.Data.Unit.Base;
+
+import Stdlib.Data.Bool.Base open;
+
+import Stdlib.Trait.Eq open;
+import Stdlib.Trait.Ord open;
+import Stdlib.Trait.Show open;
+import Stdlib.Trait.Foldable open;
+
+type Unit :=
+  --- The only constructor of ;Unit;.
+  unit;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Data/Unit/Base.html b/pull-137/Stdlib/Data/Unit/Base.html new file mode 100644 index 000000000..ee178db8a --- /dev/null +++ b/pull-137/Stdlib/Data/Unit/Base.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Data.Unit.Base

Description

The unit type.

Definitions

Constructors

unit

The only constructor of Unit.

\ No newline at end of file diff --git a/pull-137/Stdlib/Debug/Fail-src.html b/pull-137/Stdlib/Debug/Fail-src.html new file mode 100644 index 000000000..c31b7d6da --- /dev/null +++ b/pull-137/Stdlib/Debug/Fail-src.html @@ -0,0 +1,9 @@ + +
module Stdlib.Debug.Fail;
+
+import Stdlib.Data.String.Base open;
+
+--- Exit the program with an error message.
+builtin fail
+axiom failwith : {A : Type} -> (message : String) -> A;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Debug/Fail.html b/pull-137/Stdlib/Debug/Fail.html new file mode 100644 index 000000000..e9f88ae65 --- /dev/null +++ b/pull-137/Stdlib/Debug/Fail.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Debug.Fail

Definitions

builtin fail +axiom failwith : {A : Type} -> (message : String) -> ASource#

Exit the program with an error message.

\ No newline at end of file diff --git a/pull-137/Stdlib/Debug/Trace-src.html b/pull-137/Stdlib/Debug/Trace-src.html new file mode 100644 index 000000000..1b6f27de7 --- /dev/null +++ b/pull-137/Stdlib/Debug/Trace-src.html @@ -0,0 +1,7 @@ + +
module Stdlib.Debug.Trace;
+
+--- Primitive that prints the given element and returns it.
+builtin trace
+axiom trace : {A : Type} -> A -> A;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Debug/Trace.html b/pull-137/Stdlib/Debug/Trace.html new file mode 100644 index 000000000..b83bf24eb --- /dev/null +++ b/pull-137/Stdlib/Debug/Trace.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Debug.Trace

Definitions

builtin trace +axiom trace : {A : Type} -> A -> ASource#

Primitive that prints the given element and returns it.

\ No newline at end of file diff --git a/pull-137/Stdlib/Function-src.html b/pull-137/Stdlib/Function-src.html new file mode 100644 index 000000000..8c31fc8b2 --- /dev/null +++ b/pull-137/Stdlib/Function-src.html @@ -0,0 +1,59 @@ + +
module Stdlib.Function;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Nat.Base open;
+import Stdlib.Data.Pair.Base open;
+
+syntax operator << composition;
+
+--- Function composition, passing results from the second function `g` to the first function `f`.
+{-# inline: 2 #-}
+<< {A B C} (f : B -> C) (g : A -> B) (x : A) : C := f (g x);
+
+syntax operator >> lcomposition;
+
+--- Function composition, passing results from the first function `f` to the second function `g`.
+{-# inline: 2 #-}
+>> {A B C} (f : A -> B) (g : B -> C) (x : A) : C := g (f x);
+
+--- Always returns the first argument `a`.
+{-# inline: 1 #-}
+const {A B} (a : A) (_ : B) : A := a;
+
+--- The identity function.
+id {A} (a : A) : A := a;
+
+--- Swaps the order of the arguments of the given function `f`.
+{-# inline: 1 #-}
+flip {A B C} (f : A -> B -> C) (b : B) (a : A) : C := f a b;
+
+syntax operator <| rapp;
+
+--- Application operator with right associativity. Usually used as a syntactical
+--- facility.
+<| {A B} (f : A -> B) (x : A) : B := f x;
+
+syntax operator |> lapp;
+
+--- Application operator with left associativity. Usually used as a syntactical
+--- facility.
+|> {A B} (x : A) (f : A -> B) : B := f x;
+
+--- Applies a function n times.
+iterate {A} : (n : Nat) -> (fun : A -> A) -> (elem : A) -> A
+  | zero _ a := a
+  | (suc n) f a := iterate n f (f a);
+
+syntax operator on lapp;
+
+--- `(f on g) a b` is equivalent to `f (g a) (g b)`.
+{-# inline: 2 #-}
+on {A B C} (f : B -> B -> C) (g : A -> B) (a b : A) : C := f (g a) (g b);
+
+syntax operator >-> seq;
+
+builtin seq
+>-> : {A B : Type} -> A -> B -> B
+  | x y := y;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Function.html b/pull-137/Stdlib/Function.html new file mode 100644 index 000000000..060266b36 --- /dev/null +++ b/pull-137/Stdlib/Function.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Function

Definitions

<< {A B C} (f : B -> C) (g : A -> B) (x : A) : CSource#

Function composition, passing results from the second function `g` to the first function `f`.

>> {A B C} (f : A -> B) (g : B -> C) (x : A) : CSource#

Function composition, passing results from the first function `f` to the second function `g`.

const {A B} (a : A) (_ : B) : ASource#

Always returns the first argument `a`.

id {A} (a : A) : ASource#

The identity function.

flip {A B C} (f : A -> B -> C) (b : B) (a : A) : CSource#

Swaps the order of the arguments of the given function `f`.

<| {A B} (f : A -> B) (x : A) : BSource#

Application operator with right associativity. Usually used as a syntactical facility.

|> {A B} (x : A) (f : A -> B) : BSource#

Application operator with left associativity. Usually used as a syntactical facility.

iterate {A} : (n : Nat) -> (fun : A -> A) -> (elem : A) -> ASource#

Applies a function n times.

on {A B C} (f : B -> B -> C) (g : A -> B) (a b : A) : CSource#

`(f on g) a b` is equivalent to `f (g a) (g b)`.

builtin seq +>-> : {A B : Type} -> A -> B -> BSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Prelude-src.html b/pull-137/Stdlib/Prelude-src.html new file mode 100644 index 000000000..64223c762 --- /dev/null +++ b/pull-137/Stdlib/Prelude-src.html @@ -0,0 +1,23 @@ + +
--- This module reexports most of the standard library.
+module Stdlib.Prelude;
+
+import Stdlib.Data.Fixity open public;
+
+import Stdlib.Data.Bool open public;
+import Stdlib.Data.Byte open public;
+import Stdlib.Data.Unit open public;
+import Stdlib.Data.List open public;
+import Stdlib.Data.Maybe open public;
+import Stdlib.Data.Nat open public;
+import Stdlib.Data.Int open public;
+import Stdlib.Data.Field open public;
+import Stdlib.Data.Pair open public;
+import Stdlib.Data.String open public;
+import Stdlib.Data.Result open public;
+import Stdlib.Data.Range open public;
+import Stdlib.Function open public;
+import Stdlib.System.IO open public;
+
+import Stdlib.Trait open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Prelude.html b/pull-137/Stdlib/Prelude.html new file mode 100644 index 000000000..c5ed41af0 --- /dev/null +++ b/pull-137/Stdlib/Prelude.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Prelude

Description

This module reexports most of the standard library.

Definitions

import Stdlib.Data.Fixity open public

import Stdlib.Data.Bool open public

import Stdlib.Data.Byte open public

import Stdlib.Data.Unit open public

import Stdlib.Data.List open public

import Stdlib.Data.Maybe open public

import Stdlib.Data.Nat open public

import Stdlib.Data.Int open public

import Stdlib.Data.Field open public

import Stdlib.Data.Pair open public

import Stdlib.Data.String open public

import Stdlib.Data.Result open public

import Stdlib.Data.Range open public

import Stdlib.Function open public

import Stdlib.System.IO open public

import Stdlib.Trait open public

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO-src.html b/pull-137/Stdlib/System/IO-src.html new file mode 100644 index 000000000..0216bf7c9 --- /dev/null +++ b/pull-137/Stdlib/System/IO-src.html @@ -0,0 +1,15 @@ + +
module Stdlib.System.IO;
+
+import Stdlib.System.IO.Base open public;
+import Stdlib.System.IO.Bool open public;
+import Stdlib.System.IO.Nat open public;
+import Stdlib.System.IO.Int open public;
+import Stdlib.System.IO.String open public;
+
+import Stdlib.Trait.Show open;
+
+print {A} {{Show A}} (a : A) : IO := printString (Show.show a);
+
+printLn {A} {{Show A}} (a : A) : IO := printStringLn (Show.show a);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO.html b/pull-137/Stdlib/System/IO.html new file mode 100644 index 000000000..547bbb2cd --- /dev/null +++ b/pull-137/Stdlib/System/IO.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO

Definitions

import Stdlib.System.IO.Base open public

import Stdlib.System.IO.Bool open public

import Stdlib.System.IO.Nat open public

import Stdlib.System.IO.Int open public

import Stdlib.System.IO.String open public

print {A} {{Show A}} (a : A) : IOSource#

printLn {A} {{Show A}} (a : A) : IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Base-src.html b/pull-137/Stdlib/System/IO/Base-src.html new file mode 100644 index 000000000..d00f0de95 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Base-src.html @@ -0,0 +1,12 @@ + +
module Stdlib.System.IO.Base;
+
+import Stdlib.Data.Fixity open;
+
+builtin IO
+axiom IO : Type;
+
+syntax operator >>> seq;
+builtin IO-sequence
+axiom >>> : IO -> IO -> IO;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Base.html b/pull-137/Stdlib/System/IO/Base.html new file mode 100644 index 000000000..103560c57 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Base.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO.Base

Definitions

builtin IO +axiom IO : TypeSource#

builtin IO-sequence +axiom >>> : IO -> IO -> IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Bool-src.html b/pull-137/Stdlib/System/IO/Bool-src.html new file mode 100644 index 000000000..82b1ee1d6 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Bool-src.html @@ -0,0 +1,12 @@ + +
module Stdlib.System.IO.Bool;
+
+import Stdlib.System.IO.Base open;
+import Stdlib.Data.Bool open;
+import Stdlib.System.IO.String open;
+
+builtin bool-print
+axiom printBool : Bool -> IO;
+
+printBoolLn (b : Bool) : IO := printBool b >>> printString "\n";
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Bool.html b/pull-137/Stdlib/System/IO/Bool.html new file mode 100644 index 000000000..4bc5c00d3 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Bool.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO.Bool

Definitions

builtin bool-print +axiom printBool : Bool -> IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Int-src.html b/pull-137/Stdlib/System/IO/Int-src.html new file mode 100644 index 000000000..a75689ac7 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Int-src.html @@ -0,0 +1,12 @@ + +
module Stdlib.System.IO.Int;
+
+import Stdlib.System.IO.Base open;
+import Stdlib.Data.Int open using {Int};
+import Stdlib.System.IO.String open;
+
+builtin int-print
+axiom printInt : Int -> IO;
+
+printIntLn (i : Int) : IO := printInt i >>> printString "\n";
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Int.html b/pull-137/Stdlib/System/IO/Int.html new file mode 100644 index 000000000..fe68bf9a4 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Int.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO.Int

Definitions

builtin int-print +axiom printInt : Int -> IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Nat-src.html b/pull-137/Stdlib/System/IO/Nat-src.html new file mode 100644 index 000000000..b4df5bfa4 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Nat-src.html @@ -0,0 +1,12 @@ + +
module Stdlib.System.IO.Nat;
+
+import Stdlib.System.IO.Base open;
+import Stdlib.Data.Nat open;
+import Stdlib.System.IO.String open;
+
+builtin nat-print
+axiom printNat : Nat -> IO;
+
+printNatLn (n : Nat) : IO := printNat n >>> printString "\n";
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/Nat.html b/pull-137/Stdlib/System/IO/Nat.html new file mode 100644 index 000000000..26e78e0c2 --- /dev/null +++ b/pull-137/Stdlib/System/IO/Nat.html @@ -0,0 +1,3 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO.Nat

Definitions

builtin nat-print +axiom printNat : Nat -> IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/String-src.html b/pull-137/Stdlib/System/IO/String-src.html new file mode 100644 index 000000000..d4147716a --- /dev/null +++ b/pull-137/Stdlib/System/IO/String-src.html @@ -0,0 +1,14 @@ + +
module Stdlib.System.IO.String;
+
+import Stdlib.System.IO.Base open;
+import Stdlib.Data.String open;
+
+builtin string-print
+axiom printString : String -> IO;
+
+builtin IO-readline
+axiom readLn : (String -> IO) -> IO;
+
+printStringLn (s : String) : IO := printString s >>> printString "\n";
+
\ No newline at end of file diff --git a/pull-137/Stdlib/System/IO/String.html b/pull-137/Stdlib/System/IO/String.html new file mode 100644 index 000000000..74ae29f1c --- /dev/null +++ b/pull-137/Stdlib/System/IO/String.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.System.IO.String

Definitions

builtin string-print +axiom printString : String -> IOSource#

builtin IO-readline +axiom readLn : (String -> IO) -> IOSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait-src.html b/pull-137/Stdlib/Trait-src.html new file mode 100644 index 000000000..08a492910 --- /dev/null +++ b/pull-137/Stdlib/Trait-src.html @@ -0,0 +1,17 @@ + +
module Stdlib.Trait;
+
+import Stdlib.Trait.Eq as Eq open using {Eq; module Eq} public;
+import Stdlib.Trait.Show as Show open using {Show; module Show} public;
+import Stdlib.Trait.Ord as Ord open using {Ord; module Ord} public;
+import Stdlib.Trait.Functor open public;
+import Stdlib.Trait.Applicative open public;
+import Stdlib.Trait.Monad open public;
+import Stdlib.Trait.Foldable open public;
+import Stdlib.Trait.Partial open public;
+import Stdlib.Trait.Natural open public;
+import Stdlib.Trait.FromNatural open public;
+import Stdlib.Trait.Integral open public;
+import Stdlib.Trait.Numeric open public;
+import Stdlib.Trait.DivMod open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait.html b/pull-137/Stdlib/Trait.html new file mode 100644 index 000000000..50a7c7c02 --- /dev/null +++ b/pull-137/Stdlib/Trait.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait

Definitions

import Stdlib.Trait.Eq as Eq open using {Eq; module Eq} public

import Stdlib.Trait.Show as Show open using {Show; module Show} public

import Stdlib.Trait.Ord as Ord open using {Ord; module Ord} public

import Stdlib.Trait.Functor open public

import Stdlib.Trait.Applicative open public

import Stdlib.Trait.Monad open public

import Stdlib.Trait.Foldable open public

import Stdlib.Trait.Partial open public

import Stdlib.Trait.Natural open public

import Stdlib.Trait.FromNatural open public

import Stdlib.Trait.Integral open public

import Stdlib.Trait.Numeric open public

import Stdlib.Trait.DivMod open public

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Applicative-src.html b/pull-137/Stdlib/Trait/Applicative-src.html new file mode 100644 index 000000000..9e6db0ead --- /dev/null +++ b/pull-137/Stdlib/Trait/Applicative-src.html @@ -0,0 +1,63 @@ + +
module Stdlib.Trait.Applicative;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Function open;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.Nat.Base open;
+import Stdlib.Data.List.Base open;
+import Stdlib.Data.Unit.Base open;
+import Stdlib.Trait.Functor open;
+import Stdlib.Trait.Foldable.Polymorphic open;
+import Stdlib.Data.Unit.Base open;
+
+trait
+type Applicative (F : Type -> Type) :=
+  mkApplicative@{
+    {{functor}} : Functor F;
+    pure : {A : Type} -> A -> F A;
+    ap : {A B : Type} -> F (A -> B) -> F A -> F B;
+  };
+
+open Applicative public;
+
+--- Sequences computations.
+--- Note that this function will be renamed to >>> once IO becomses a polymorphic type and can be given an Applicative instance.
+applicativeSeq
+  {F : Type -> Type}
+  {{Applicative F}}
+  {A B : Type}
+  (fa : F A)
+  (fb : F B)
+  : F B := ap (map λ{_ b := b} fa) fb;
+
+--- lifts a binary function to ;Applicative;
+liftA2
+  {F : Type -> Type}
+  {{Applicative F}}
+  {A B C}
+  (fun : A -> B -> C)
+  : F A -> F B -> F C := map fun >> ap;
+
+syntax iterator mapA_ {init := 0; range := 1};
+mapA_
+  {t : Type -> Type}
+  {f : Type -> Type}
+  {A B}
+  {{Foldable t}}
+  {{Applicative f}}
+  (fun : A -> f B)
+  (l : t A)
+  : f Unit :=
+  rfor (acc := pure unit) (x in l) {
+    applicativeSeq (fun x) acc
+  };
+
+replicateA {F : Type -> Type} {A} {{Applicative F}} : Nat -> F A -> F (List A)
+  | zero _ := pure []
+  | (suc n) x := liftA2 (::) x (replicateA n x);
+
+when {F : Type -> Type} {{Applicative F}} : Bool -> F Unit -> F Unit
+  | false _ := pure unit
+  | true a := a;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Applicative.html b/pull-137/Stdlib/Trait/Applicative.html new file mode 100644 index 000000000..ecc4f68a9 --- /dev/null +++ b/pull-137/Stdlib/Trait/Applicative.html @@ -0,0 +1,21 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Applicative

Definitions

trait +type Applicative (F : Type -> Type)Source#

Constructors

mkApplicative@{ + {{functor}} : Functor F; + pure : {A : Type} -> A -> F A; + ap : {A B : Type} -> F (A -> B) -> F A -> F B; +}

open Applicative public

applicativeSeq + {F : Type -> Type} {{Applicative F}} {A B : Type} (fa : F A) (fb : F B) : F BSource#

Sequences computations. Note that this function will be renamed to >>> once IO becomses a polymorphic type and can be given an Applicative instance.

liftA2 + {F : Type -> Type} + {{Applicative F}} + {A B C} + (fun : A -> B -> C) + : F A -> F B -> F CSource#

lifts a binary function to Applicative

mapA_ + {t : Type -> Type} + {f : Type -> Type} + {A B} + {{Foldable t}} + {{Applicative f}} + (fun : A -> f B) + (l : t A) + : f UnitSource#

replicateA {F : Type -> Type} {A} {{Applicative F}} : Nat -> F A -> F (List A)Source#

when {F : Type -> Type} {{Applicative F}} : Bool -> F Unit -> F UnitSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/DivMod-src.html b/pull-137/Stdlib/Trait/DivMod-src.html new file mode 100644 index 000000000..1fbb5451c --- /dev/null +++ b/pull-137/Stdlib/Trait/DivMod-src.html @@ -0,0 +1,14 @@ + +
module Stdlib.Trait.DivMod;
+
+trait
+type DivMod A :=
+  mkDivMod@{
+    {-# isabelle-operator: {name: "div", prec: 70, assoc: left} #-}
+    div : A -> A -> A;
+    {-# isabelle-operator: {name: "mod", prec: 70, assoc: left} #-}
+    mod : A -> A -> A;
+  };
+
+open DivMod public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/DivMod.html b/pull-137/Stdlib/Trait/DivMod.html new file mode 100644 index 000000000..0f602b731 --- /dev/null +++ b/pull-137/Stdlib/Trait/DivMod.html @@ -0,0 +1,8 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.DivMod

Definitions

trait +type DivMod ASource#

Constructors

mkDivMod@{ + {-# isabelle-operator: {name: "div", prec: 70, assoc: left} #-} + div : A -> A -> A; + {-# isabelle-operator: {name: "mod", prec: 70, assoc: left} #-} + mod : A -> A -> A; +}

open DivMod public

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Eq-src.html b/pull-137/Stdlib/Trait/Eq-src.html new file mode 100644 index 000000000..2fc3c976f --- /dev/null +++ b/pull-137/Stdlib/Trait/Eq-src.html @@ -0,0 +1,25 @@ + +
module Stdlib.Trait.Eq;
+
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Data.Fixity open;
+
+--- A trait defining equality
+builtin eq
+trait
+type Eq A :=
+  mkEq@{
+    builtin isEqual
+    eq : A -> A -> Bool;
+  };
+
+syntax operator == comparison;
+syntax operator /= comparison;
+
+{-# inline: always, isabelle-operator: {name: "=", prec: 50, assoc: none} #-}
+== {A} {{Eq A}} : A -> A -> Bool := Eq.eq;
+
+--- Test for inequality.
+{-# inline: always, isabelle-operator: {name: "\\<noteq>", prec: 50, assoc: none} #-}
+/= {A} {{Eq A}} (x y : A) : Bool := not (x == y);
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Eq.html b/pull-137/Stdlib/Trait/Eq.html new file mode 100644 index 000000000..03474907e --- /dev/null +++ b/pull-137/Stdlib/Trait/Eq.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Eq

Definitions

builtin eq +trait +type Eq ASource#

A trait defining equality

Constructors

mkEq@{ + builtin isEqual + eq : A -> A -> Bool; +}

== {A} {{Eq A}} : A -> A -> BoolSource#

/= {A} {{Eq A}} (x y : A) : BoolSource#

Test for inequality.

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable-src.html b/pull-137/Stdlib/Trait/Foldable-src.html new file mode 100644 index 000000000..6ab415442 --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable-src.html @@ -0,0 +1,6 @@ + +
module Stdlib.Trait.Foldable;
+
+import Stdlib.Trait.Foldable.Polymorphic as Polymorphic public;
+import Stdlib.Trait.Foldable.Monomorphic open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable.html b/pull-137/Stdlib/Trait/Foldable.html new file mode 100644 index 000000000..d0dea3bd2 --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Foldable

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable/Monomorphic-src.html b/pull-137/Stdlib/Trait/Foldable/Monomorphic-src.html new file mode 100644 index 000000000..95fc6f8f8 --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable/Monomorphic-src.html @@ -0,0 +1,57 @@ + +
module Stdlib.Trait.Foldable.Monomorphic;
+
+import Stdlib.Function open;
+import Stdlib.Trait.Foldable.Polymorphic as Poly;
+
+--- A trait for combining elements into a single result, processing one element at a time.
+{-# specialize: true #-}
+trait
+type Foldable (Container Elem : Type) :=
+  mkFoldable@{
+    syntax iterator for {init := 1; range := 1};
+    for : {B : Type} -> (B -> Elem -> B) -> B -> Container -> B;
+
+    syntax iterator rfor {init := 1; range := 1};
+    rfor : {B : Type} -> (B -> Elem -> B) -> B -> Container -> B;
+  };
+
+open Foldable public;
+
+--- Make a monomorphic ;Foldable; instance from a polymorphic one.
+--- All polymorphic types that are an instance of ;Poly.Foldable; should use this function to create their monomorphic ;Foldable; instance.
+{-# inline: always #-}
+fromPolymorphicFoldable
+  {F : Type -> Type}
+  {{foldable : Poly.Foldable F}}
+  {Elem}
+  : Foldable (F Elem) Elem :=
+  mkFoldable@{
+    for := Poly.for;
+    rfor := Poly.rfor;
+  };
+
+{-# inline: true #-}
+foldl
+  {Container Elem}
+  {{Foldable Container Elem}}
+  {Acc : Type}
+  (fun : Acc -> Elem -> Acc)
+  (initialValue : Acc)
+  (container : Container)
+  : Acc :=
+  for (acc := initialValue) (x in container) {
+    fun acc x
+  };
+
+--- Combine the elements of the type using the provided function starting with the element in the right-most position.
+{-# inline: 2 #-}
+foldr
+  {Container Elem : Type}
+  {{Foldable Container Elem}}
+  {Acc : Type}
+  (fun : Elem -> Acc -> Acc)
+  (initialValue : Acc)
+  (container : Container)
+  : Acc := foldl (flip fun) initialValue container;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable/Monomorphic.html b/pull-137/Stdlib/Trait/Foldable/Monomorphic.html new file mode 100644 index 000000000..d27f71e6f --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable/Monomorphic.html @@ -0,0 +1,26 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Foldable.Monomorphic

Definitions

trait +type Foldable (Container Elem : Type)Source#

A trait for combining elements into a single result, processing one element at a time.

Constructors

mkFoldable@{ + syntax iterator for {init := 1; range := 1}; + for : {B : Type} -> (B -> Elem -> B) -> B -> Container -> B; + syntax iterator rfor {init := 1; range := 1}; + rfor : {B : Type} -> (B -> Elem -> B) -> B -> Container -> B; +}

open Foldable public

fromPolymorphicFoldable + {F : Type -> Type} + {{foldable : Poly.Foldable F}} + {Elem} + : Foldable (F Elem) ElemSource#

Make a monomorphic Foldable instance from a polymorphic one. All polymorphic types that are an instance of Poly.Foldable should use this function to create their monomorphic Foldable instance.

foldr + {Container Elem : Type} + {{Foldable Container Elem}} + {Acc : Type} + (fun : Elem -> Acc -> Acc) + (initialValue : Acc) + (container : Container) + : AccSource#

Combine the elements of the type using the provided function starting with the element in the right-most position.

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable/Polymorphic-src.html b/pull-137/Stdlib/Trait/Foldable/Polymorphic-src.html new file mode 100644 index 000000000..87515e82e --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable/Polymorphic-src.html @@ -0,0 +1,46 @@ + +
module Stdlib.Trait.Foldable.Polymorphic;
+
+import Stdlib.Function open;
+
+--- A trait for combining elements into a single result, processing one element at a time.
+trait
+type Foldable (F : Type -> Type) :=
+  mkFoldable@{
+    syntax iterator for {init := 1; range := 1};
+    for : {A B : Type} -> (B -> A -> B) -> B -> F A -> B;
+
+    syntax iterator rfor {init := 1; range := 1};
+    rfor : {A B : Type} -> (B -> A -> B) -> B -> F A -> B;
+  };
+
+open Foldable public;
+
+--- Combine the elements of the type using the provided function starting with the element in the left-most position.
+{-# inline: true #-}
+foldl
+  {F : Type -> Type}
+  {{Foldable F}}
+  {Elem Acc : Type}
+  (fun : Acc -> Elem -> Acc)
+  (initialValue : Acc)
+  (container : F Elem)
+  : Acc :=
+  for (acc := initialValue) (x in container) {
+    fun acc x
+  };
+
+--- Combine the elements of the type using the provided function starting with the element in the right-most position.
+{-# inline: true #-}
+foldr
+  {F : Type -> Type}
+  {{Foldable F}}
+  {Elem Acc : Type}
+  (fun : Elem -> Acc -> Acc)
+  (initialValue : Acc)
+  (container : F Elem)
+  : Acc :=
+  rfor (acc := initialValue) (x in container) {
+    fun x acc
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Foldable/Polymorphic.html b/pull-137/Stdlib/Trait/Foldable/Polymorphic.html new file mode 100644 index 000000000..d450780db --- /dev/null +++ b/pull-137/Stdlib/Trait/Foldable/Polymorphic.html @@ -0,0 +1,22 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Foldable.Polymorphic

Definitions

trait +type Foldable (F : Type -> Type)Source#

A trait for combining elements into a single result, processing one element at a time.

Constructors

mkFoldable@{ + syntax iterator for {init := 1; range := 1}; + for : {A B : Type} -> (B -> A -> B) -> B -> F A -> B; + syntax iterator rfor {init := 1; range := 1}; + rfor : {A B : Type} -> (B -> A -> B) -> B -> F A -> B; +}

open Foldable public

foldl + {F : Type -> Type} + {{Foldable F}} + {Elem Acc : Type} + (fun : Acc -> Elem -> Acc) + (initialValue : Acc) + (container : F Elem) + : AccSource#

Combine the elements of the type using the provided function starting with the element in the left-most position.

foldr + {F : Type -> Type} + {{Foldable F}} + {Elem Acc : Type} + (fun : Elem -> Acc -> Acc) + (initialValue : Acc) + (container : F Elem) + : AccSource#

Combine the elements of the type using the provided function starting with the element in the right-most position.

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/FromNatural-src.html b/pull-137/Stdlib/Trait/FromNatural-src.html new file mode 100644 index 000000000..8583c8ee8 --- /dev/null +++ b/pull-137/Stdlib/Trait/FromNatural-src.html @@ -0,0 +1,5 @@ + +
module Stdlib.Trait.FromNatural;
+
+import Juvix.Builtin.V1.Trait.FromNatural open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/FromNatural.html b/pull-137/Stdlib/Trait/FromNatural.html new file mode 100644 index 000000000..7aa98e824 --- /dev/null +++ b/pull-137/Stdlib/Trait/FromNatural.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.FromNatural

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor-src.html b/pull-137/Stdlib/Trait/Functor-src.html new file mode 100644 index 000000000..d39981976 --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor-src.html @@ -0,0 +1,9 @@ + +
module Stdlib.Trait.Functor;
+
+import Stdlib.Trait.Functor.Polymorphic open public;
+import Stdlib.Trait.Functor.Monomorphic as Monomorphic public;
+import Stdlib.Trait.Functor.Monomorphic open using {
+  fromPolymorphicFunctor;
+} public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor.html b/pull-137/Stdlib/Trait/Functor.html new file mode 100644 index 000000000..2d41d00b6 --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor.html @@ -0,0 +1,4 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Functor

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor/Monomorphic-src.html b/pull-137/Stdlib/Trait/Functor/Monomorphic-src.html new file mode 100644 index 000000000..5630e339e --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor/Monomorphic-src.html @@ -0,0 +1,43 @@ + +
module Stdlib.Trait.Functor.Monomorphic;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Unit open;
+import Stdlib.Trait.Functor.Polymorphic as Poly;
+
+{-# specialize: true #-}
+trait
+type Functor (Container Elem : Type) :=
+  mkFunctor@{
+    syntax iterator map {init := 0; range := 1};
+    {-# specialize: [1] #-}
+    map : (Elem -> Elem) -> Container -> Container;
+  };
+
+open Functor public;
+
+{-# inline: always #-}
+fromPolymorphicFunctor
+  {F : Type -> Type} {{Poly.Functor F}} {Elem} : Functor (F Elem) Elem :=
+  mkFunctor@{
+    map := Poly.map;
+  };
+
+syntax operator <$> lapp;
+{-# inline: true #-}
+<$>
+  {Container Elem}
+  {{Functor Container Elem}}
+  (fun : Elem -> Elem)
+  (container : Container)
+  : Container := map fun container;
+
+syntax operator $> lapp;
+{-# inline: true #-}
+$>
+  {Container Elem : Type}
+  {{Functor Container Elem}}
+  (container : Container)
+  (element : Elem)
+  : Container := \{_ := element} <$> container;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor/Monomorphic.html b/pull-137/Stdlib/Trait/Functor/Monomorphic.html new file mode 100644 index 000000000..957a67841 --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor/Monomorphic.html @@ -0,0 +1,18 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Functor.Monomorphic

Definitions

trait +type Functor (Container Elem : Type)Source#

Constructors

mkFunctor@{ + syntax iterator map {init := 0; range := 1}; + {-# specialize: [1] #-} + map : (Elem -> Elem) -> Container -> Container; +}

open Functor public

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor/Polymorphic-src.html b/pull-137/Stdlib/Trait/Functor/Polymorphic-src.html new file mode 100644 index 000000000..8eb6054fb --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor/Polymorphic-src.html @@ -0,0 +1,31 @@ + +
module Stdlib.Trait.Functor.Polymorphic;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Unit open;
+
+{-# specialize: true #-}
+trait
+type Functor (F : Type -> Type) :=
+  mkFunctor@{
+    syntax iterator map {init := 0; range := 1};
+    {-# specialize: [1] #-}
+    map : {A B : Type} -> (A -> B) -> F A -> F B;
+  };
+
+open Functor public;
+
+syntax operator <$> lapp;
+{-# inline: true #-}
+<$> {F : Type -> Type} {{Functor F}} {A B} (fun : A -> B) (fa : F A) : F B :=
+  map fun fa;
+
+syntax operator $> lapp;
+{-# inline: true #-}
+$> {F : Type  Type} {A B : Type} {{Functor F}} (fa : F A) (b : B) : F B :=
+  λ{_ := b} <$> fa;
+
+{-# inline: true #-}
+void {F : Type  Type} {A : Type} {{Functor F}} (fa : F A) : F Unit :=
+  fa $> unit;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Functor/Polymorphic.html b/pull-137/Stdlib/Trait/Functor/Polymorphic.html new file mode 100644 index 000000000..bb1562ffc --- /dev/null +++ b/pull-137/Stdlib/Trait/Functor/Polymorphic.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Functor.Polymorphic

Definitions

trait +type Functor (F : Type -> Type)Source#

Constructors

mkFunctor@{ + syntax iterator map {init := 0; range := 1}; + {-# specialize: [1] #-} + map : {A B : Type} -> (A -> B) -> F A -> F B; +}

open Functor public

<$> {F : Type -> Type} {{Functor F}} {A B} (fun : A -> B) (fa : F A) : F BSource#

$> {F : Type Type} {A B : Type} {{Functor F}} (fa : F A) (b : B) : F BSource#

void {F : Type Type} {A : Type} {{Functor F}} (fa : F A) : F UnitSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Integral-src.html b/pull-137/Stdlib/Trait/Integral-src.html new file mode 100644 index 000000000..eb8b60f79 --- /dev/null +++ b/pull-137/Stdlib/Trait/Integral-src.html @@ -0,0 +1,20 @@ + +
module Stdlib.Trait.Integral;
+
+import Stdlib.Data.Int.Base open using {Int};
+import Stdlib.Data.Fixity open;
+import Stdlib.Trait.Natural open;
+
+trait
+type Integral A :=
+  mkIntegral@{
+    naturalI : Natural A;
+    syntax operator - additive;
+    {-# isabelle-operator: {name: "-", prec: 65, assoc: left} #-}
+    - : A -> A -> A;
+    builtin from-int
+    fromInt : Int -> A;
+  };
+
+open Integral using {fromInt; -} public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Integral.html b/pull-137/Stdlib/Trait/Integral.html new file mode 100644 index 000000000..4c604cb13 --- /dev/null +++ b/pull-137/Stdlib/Trait/Integral.html @@ -0,0 +1,10 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Integral

Definitions

trait +type Integral ASource#

Constructors

mkIntegral@{ + naturalI : Natural A; + syntax operator - additive; + {-# isabelle-operator: {name: "-", prec: 65, assoc: left} #-} + - : A -> A -> A; + builtin from-int + fromInt : Int -> A; +}

open Integral using {fromInt; -} public

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Monad-src.html b/pull-137/Stdlib/Trait/Monad-src.html new file mode 100644 index 000000000..c112adc6a --- /dev/null +++ b/pull-137/Stdlib/Trait/Monad-src.html @@ -0,0 +1,30 @@ + +
module Stdlib.Trait.Monad;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Trait.Applicative open;
+
+trait
+type Monad (M : Type -> Type) :=
+  mkMonad@{
+    {{applicative}} : Applicative M;
+    builtin monad-bind
+    bind : {A B : Type} -> M A -> (A -> M B) -> M B;
+  };
+
+open Monad public;
+
+syntax operator >>= seq;
+>>= {A B} {F : Type -> Type} {{Monad F}} (x : F A) (g : A -> F B) : F B :=
+  bind x g;
+
+syntax operator >=> seq;
+>=>
+  {A B C}
+  {F : Type -> Type}
+  {{Monad F}}
+  (h : A -> F B)
+  (g : B -> F C)
+  (a : A)
+  : F C := h a >>= g;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Monad.html b/pull-137/Stdlib/Trait/Monad.html new file mode 100644 index 000000000..519c234bf --- /dev/null +++ b/pull-137/Stdlib/Trait/Monad.html @@ -0,0 +1,14 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Monad

Definitions

trait +type Monad (M : Type -> Type)Source#

Constructors

mkMonad@{ + {{applicative}} : Applicative M; + builtin monad-bind + bind : {A B : Type} -> M A -> (A -> M B) -> M B; +}

open Monad public

>>= {A B} {F : Type -> Type} {{Monad F}} (x : F A) (g : A -> F B) : F BSource#

>=> + {A B C} + {F : Type -> Type} + {{Monad F}} + (h : A -> F B) + (g : B -> F C) + (a : A) + : F CSource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Natural-src.html b/pull-137/Stdlib/Trait/Natural-src.html new file mode 100644 index 000000000..9e289cc1e --- /dev/null +++ b/pull-137/Stdlib/Trait/Natural-src.html @@ -0,0 +1,5 @@ + +
module Stdlib.Trait.Natural;
+
+import Juvix.Builtin.V1.Trait.Natural open public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Natural.html b/pull-137/Stdlib/Trait/Natural.html new file mode 100644 index 000000000..cf4795d65 --- /dev/null +++ b/pull-137/Stdlib/Trait/Natural.html @@ -0,0 +1,2 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Natural

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Numeric-src.html b/pull-137/Stdlib/Trait/Numeric-src.html new file mode 100644 index 000000000..8d8997956 --- /dev/null +++ b/pull-137/Stdlib/Trait/Numeric-src.html @@ -0,0 +1,16 @@ + +
module Stdlib.Trait.Numeric;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Trait.Integral open;
+
+trait
+type Numeric A :=
+  mkNumeric@{
+    integralI : Integral A;
+    syntax operator / multiplicative;
+    / : A -> A -> A;
+  };
+
+open Numeric using {/} public;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Numeric.html b/pull-137/Stdlib/Trait/Numeric.html new file mode 100644 index 000000000..9fd673b0c --- /dev/null +++ b/pull-137/Stdlib/Trait/Numeric.html @@ -0,0 +1,7 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Numeric

Definitions

trait +type Numeric ASource#

Constructors

mkNumeric@{ + integralI : Integral A; + syntax operator / multiplicative; + / : A -> A -> A; +}

open Numeric using {/} public

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Ord-src.html b/pull-137/Stdlib/Trait/Ord-src.html new file mode 100644 index 000000000..640d19d60 --- /dev/null +++ b/pull-137/Stdlib/Trait/Ord-src.html @@ -0,0 +1,66 @@ + +
module Stdlib.Trait.Ord;
+
+import Stdlib.Data.Fixity open;
+import Stdlib.Data.Bool.Base open;
+import Stdlib.Trait.Eq open;
+import Stdlib.Data.Ordering open public;
+
+--- A trait for defining a total order
+builtin ord
+trait
+type Ord A :=
+  mkOrd@{
+    builtin compare
+    cmp : A -> A -> Ordering;
+  };
+
+deriving instance
+orderingOrdI : Ord Ordering;
+
+syntax operator <= comparison;
+
+--- Returns ;true; iff the first element is less than or equal to the second.
+{-# inline: always, isabelle-operator: {name: "\\<le>", prec: 50, assoc: none} #-}
+<= {A} {{Ord A}} (x y : A) : Bool :=
+  case Ord.cmp x y of
+    | Equal := true
+    | LessThan := true
+    | GreaterThan := false;
+
+syntax operator < comparison;
+
+--- Returns ;true; iff the first element is less than the second.
+{-# inline: always, isabelle-operator: {name: "<", prec: 50, assoc: none} #-}
+< {A} {{Ord A}} (x y : A) : Bool :=
+  case Ord.cmp x y of
+    | Equal := false
+    | LessThan := true
+    | GreaterThan := false;
+
+syntax operator > comparison;
+
+--- Returns ;true; iff the first element is greater than the second.
+{-# inline: always, isabelle-operator: {name: ">", prec: 50, assoc: none} #-}
+> {A} {{Ord A}} (x y : A) : Bool := y < x;
+
+syntax operator >= comparison;
+
+--- Returns ;true; iff the first element is greater than or equal to the second.
+{-# inline: always, isabelle-operator: {name: "\\<ge>", prec: 50, assoc: none} #-}
+>= {A} {{Ord A}} (x y : A) : Bool := y <= x;
+
+--- Returns the smaller element.
+{-# inline: always #-}
+min {A} {{Ord A}} (x y : A) : A :=
+  if 
+    | x < y := x
+    | else := y;
+
+--- Returns the larger element.
+{-# inline: always #-}
+max {A} {{Ord A}} (x y : A) : A :=
+  if 
+    | x > y := x
+    | else := y;
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Ord.html b/pull-137/Stdlib/Trait/Ord.html new file mode 100644 index 000000000..9f0b5e3eb --- /dev/null +++ b/pull-137/Stdlib/Trait/Ord.html @@ -0,0 +1,8 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Ord

Definitions

import Stdlib.Data.Ordering open public

builtin ord +trait +type Ord ASource#

A trait for defining a total order

Constructors

mkOrd@{ + builtin compare + cmp : A -> A -> Ordering; +}

deriving instance +orderingOrdI : Ord OrderingSource#

<= {A} {{Ord A}} (x y : A) : BoolSource#

Returns true iff the first element is less than or equal to the second.

< {A} {{Ord A}} (x y : A) : BoolSource#

Returns true iff the first element is less than the second.

> {A} {{Ord A}} (x y : A) : BoolSource#

Returns true iff the first element is greater than the second.

>= {A} {{Ord A}} (x y : A) : BoolSource#

Returns true iff the first element is greater than or equal to the second.

min {A} {{Ord A}} (x y : A) : ASource#

Returns the smaller element.

max {A} {{Ord A}} (x y : A) : ASource#

Returns the larger element.

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Partial-src.html b/pull-137/Stdlib/Trait/Partial-src.html new file mode 100644 index 000000000..9fa079751 --- /dev/null +++ b/pull-137/Stdlib/Trait/Partial-src.html @@ -0,0 +1,16 @@ + +
module Stdlib.Trait.Partial;
+
+import Stdlib.Data.String.Base open;
+import Stdlib.Debug.Fail as Debug;
+
+trait
+type Partial :=
+  mkPartial@{
+    fail : {A : Type} -> String -> A;
+  };
+
+open Partial public;
+
+runPartial {A} (f : {{Partial}} -> A) : A := f {{mkPartial Debug.failwith}};
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Partial.html b/pull-137/Stdlib/Trait/Partial.html new file mode 100644 index 000000000..5f19178f3 --- /dev/null +++ b/pull-137/Stdlib/Trait/Partial.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Partial

Definitions

trait +type PartialSource#

Constructors

mkPartial@{ + fail : {A : Type} -> String -> A; +}

open Partial public

runPartial {A} (f : {{Partial}} -> A) : ASource#

\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Show-src.html b/pull-137/Stdlib/Trait/Show-src.html new file mode 100644 index 000000000..159f40e95 --- /dev/null +++ b/pull-137/Stdlib/Trait/Show-src.html @@ -0,0 +1,11 @@ + +
module Stdlib.Trait.Show;
+
+import Juvix.Builtin.V1.String open public;
+
+trait
+type Show A :=
+  mkShow@{
+    show : A -> String;
+  };
+
\ No newline at end of file diff --git a/pull-137/Stdlib/Trait/Show.html b/pull-137/Stdlib/Trait/Show.html new file mode 100644 index 000000000..cfcdb061f --- /dev/null +++ b/pull-137/Stdlib/Trait/Show.html @@ -0,0 +1,5 @@ + +Juvix Documentation
juvix-docs - 0.0.0

Stdlib.Trait.Show

Definitions

import Juvix.Builtin.V1.String open public

trait +type Show ASource#

Constructors

mkShow@{ + show : A -> String; +}
\ No newline at end of file diff --git a/pull-137/assets/css/extra.css b/pull-137/assets/css/extra.css new file mode 100644 index 000000000..2dfe42e47 --- /dev/null +++ b/pull-137/assets/css/extra.css @@ -0,0 +1,142 @@ +@keyframes heart { + 0%, + 40%, + 80%, + 100% { + transform: scale(1); + } + 20%, + 60% { + transform: scale(1.15); + } +} +.heart { + animation: heart 1000ms infinite; +} + +:root { + --md-juvix-inductive: #a6da95; + --md-juvix-constructor: #c6a0f6; + --md-juvix-function: #eed49f; + --md-juvix-axiom: #ed8796; + --md-juvix-string: #ee99a0; + --md-juvix-keyword: #7dc4e4; + --md-juvix-delimiter: #939ab7; + --md-juvix-var: #cad3f5; + --md-juvix-fixity: #f5a97f; + --md-juvix-comment: #a5adcb; + --md-juvix-judoc: #8bd5ca; + --md-juvix-number: #b8c0e0; + --md-juvix-hover: #4c566a; +} + +[data-md-color-scheme="juvix-light"] { + --md-hue: 225deg; + --md-default-fg-color: #000000de; + --md-default-fg-color--light: #0000008a; + --md-default-fg-color--lighter√√: #00000052; + --md-default-fg-color--lightest: #00000012; + --md-default-bg-color: #fff; + --md-default-bg-color--light: #ffffffb3; + --md-default-bg-color--lighter: #ffffff4d; + --md-default-bg-color--lightest: #ffffff1f; + --md-code-fg-color: #36464e; + --md-code-bg-color: #f5f5f5; + --md-code-bg-color--light: #f5f5f5b3; + --md-code-bg-color--lighter: #f5f5f54d; + --md-code-hl-color: #4287ff; + --md-code-hl-color--light: #4287ff1a; + --md-code-hl-number-color: #d52a2a; + --md-code-hl-special-color: #db1457; + --md-code-hl-function-color: #a846b9; + --md-code-hl-constant-color: #6e59d9; + --md-code-hl-keyword-color: #3f6ec6; + --md-code-hl-string-color: #1c7d4d; + --md-code-hl-name-color: var(--md-code-fg-color); + --md-code-hl-operator-color: var(--md-default-fg-color--light); + --md-code-hl-punctuation-color: var(--md-default-fg-color--light); + --md-code-hl-comment-color: var(--md-default-fg-color--light); + --md-code-hl-generic-color: var(--md-default-fg-color--light); + --md-code-hl-variable-color: var(--md-default-fg-color--light); + --md-typeset-color: var(--md-default-fg-color); + --md-typeset-a-color: var(--md-primary-fg-color); + --md-typeset-del-color: #f5503d26; + --md-typeset-ins-color: #0bd57026; + --md-typeset-kbd-color: #fafafa; + --md-typeset-kbd-accent-color: #fff; + --md-typeset-kbd-border-color: #b8b8b8; + --md-typeset-mark-color: #ffff0080; + --md-typeset-table-color: #0000001f; + --md-typeset-table-color--light: rgba(0, 0, 0, 0.035); + --md-admonition-fg-color: var(--md-default-fg-color); + --md-admonition-bg-color: var(--md-default-bg-color); + --md-warning-fg-color: #000000de; + --md-warning-bg-color: #ff9; + --md-footer-fg-color: #fff; + --md-footer-fg-color--light: #ffffffb3; + --md-footer-fg-color--lighter: #ffffff73; + --md-footer-bg-color: #000000de; + --md-footer-bg-color--dark: #00000052; + --md-shadow-z1: 0 0.2rem 0.5rem #0000000d, 0 0 0.05rem #0000001a; + --md-shadow-z2: 0 0.2rem 0.5rem #0000001a, 0 0 0.05rem #00000040; + --md-shadow-z3: 0 0.2rem 0.5rem #0003, 0 0 0.05rem #00000059; + color-scheme: light; + --md-juvix-inductive: #40a02b; + --md-juvix-constructor: #8839ef; + --md-juvix-function: #fe640b; + --md-juvix-axiom: #d20f39; + --md-juvix-string: #e64553; + --md-juvix-keyword: #04a5e5; + --md-juvix-delimiter: #5c5f77; + --md-juvix-var: #179299; + --md-juvix-fixity: #f5a97f; + --md-juvix-comment: #6c6f85; + --md-juvix-judoc: #209fb5; + --md-juvix-number: #7287fd; + --md-juvix-hover: #cdcdcdbe; +} + +[data-md-color-scheme="juvix-dark"] { + --md-default-fg-color: hsla(var(--md-hue), 15%, 90%, 0.82); + --md-default-fg-color--light: hsla(var(--md-hue), 15%, 90%, 0.56); + --md-default-fg-color--lighter: hsla(var(--md-hue), 15%, 90%, 0.32); + --md-default-fg-color--lightest: hsla(var(--md-hue), 15%, 90%, 0.12); + --md-default-bg-color: hsla(var(--md-hue), 15%, 14%, 1); + --md-default-bg-color--light: hsla(var(--md-hue), 15%, 14%, 0.54); + --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 14%, 0.26); + --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 14%, 0.07); + --md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 0.82); + --md-code-bg-color: hsla(var(--md-hue), 15%, 18%, 1); + --md-code-bg-color--light: hsla(var(--md-hue), 15%, 18%, 0.9); + --md-code-bg-color--lighter: hsla(var(--md-hue), 15%, 18%, 0.54); + --md-code-hl-color: #2977ff; + --md-code-hl-color--light: #2977ff1a; + --md-code-hl-number-color: #e6695b; + --md-code-hl-special-color: #f06090; + --md-code-hl-function-color: #c973d9; + --md-code-hl-constant-color: #9383e2; + --md-code-hl-keyword-color: #6791e0; + --md-code-hl-string-color: #2fb170; + --md-code-hl-name-color: var(--md-code-fg-color); + --md-code-hl-operator-color: var(--md-default-fg-color--light); + --md-code-hl-punctuation-color: var(--md-default-fg-color--light); + --md-code-hl-comment-color: var(--md-default-fg-color--light); + --md-code-hl-generic-color: var(--md-default-fg-color--light); + --md-code-hl-variable-color: var(--md-default-fg-color--light); + --md-typeset-color: var(--md-default-fg-color); + --md-typeset-a-color: var(--md-primary-fg-color); + --md-typeset-kbd-color: hsla(var(--md-hue), 15%, 90%, 0.12); + --md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 90%, 0.2); + --md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1); + --md-typeset-mark-color: #4287ff4d; + --md-typeset-table-color: hsla(var(--md-hue), 15%, 95%, 0.12); + --md-typeset-table-color--light: hsla(var(--md-hue), 15%, 95%, 0.035); + --md-admonition-fg-color: var(--md-default-fg-color); + --md-admonition-bg-color: var(--md-default-bg-color); + --md-footer-bg-color: hsla(var(--md-hue), 15%, 10%, 0.87); + --md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 8%, 1); + --md-shadow-z1: 0 0.2rem 0.5rem #0000000d, 0 0 0.05rem #0000001a; + --md-shadow-z2: 0 0.2rem 0.5rem #00000040, 0 0 0.05rem #00000040; + --md-shadow-z3: 0 0.2rem 0.5rem #0006, 0 0 0.05rem #00000059; + color-scheme: dark; +} diff --git a/pull-137/assets/css/juvix-highlighting.css b/pull-137/assets/css/juvix-highlighting.css new file mode 100644 index 000000000..f5b1e3b32 --- /dev/null +++ b/pull-137/assets/css/juvix-highlighting.css @@ -0,0 +1,67 @@ +/* Color palette based on https://github.com/ayu-theme/ayu-colors */ + +.src-content { + background-color: var(--md-juvix-background); +} + +.ju-inductive { + color: var(--md-juvix-inductive); +} + +.ju-constructor { + color: var(--md-juvix-constructor); +} + +.ju-function { + color: var(--md-juvix-function); +} + +.ju-axiom { + color: var(--md-juvix-axiom); +} + +.ju-string { + color: var(--md-juvix-string); +} + +.ju-keyword { + color: var(--md-juvix-keyword); +} + +.ju-delimiter { + color: var(--md-juvix-delimiter); +} + +.ju-var { + color: var(--md-juvix-var); +} + +.ju-fixity { + color: var(--md-juvix-fixity); +} + +.ju-comment { + color: var(--md-juvix-comment); +} + +.ju-judoc { + color: var(--md-juvix-judoc); +} + +.ju-number { + color: var√(--md-juvix-number); +} + +.ju-define { + font-weight: bold; +} + +.src-content a:hover, +.src-content a.hover-highlight { + background-color: var(--md-juvix-hover); +} + +.src-content a:link, +.src-content a:visited { + text-decoration: none; +} diff --git a/pull-137/assets/css/juvix_codeblock_footer.css b/pull-137/assets/css/juvix_codeblock_footer.css new file mode 100644 index 000000000..bd468dd77 --- /dev/null +++ b/pull-137/assets/css/juvix_codeblock_footer.css @@ -0,0 +1,8 @@ +/* This file is used to style the Juvix codeblock footer. */ +code.juvix::after { + font-family: var(--md-code-font-family); + content: "Juvix v0.6.6"; + font-size: 11px; + color: var(--md-juvix-codeblock-footer); + float: right; +} \ No newline at end of file diff --git a/pull-137/assets/css/linuwial.css b/pull-137/assets/css/linuwial.css new file mode 100644 index 000000000..3264ecd04 --- /dev/null +++ b/pull-137/assets/css/linuwial.css @@ -0,0 +1,1016 @@ +/* @group Fundamentals */ + +* { + margin: 0; + padding: 0; +} + +/* Is this portable? */ +html { + background-color: white; + width: 100%; + height: 100%; +} + +body { + background: #fefefe; + color: #111; + text-align: left; + min-height: 100vh; + position: relative; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1, "liga" 0; + -moz-font-feature-settings: "kern" 1, "liga" 0; + -o-font-feature-settings: "kern" 1, "liga" 0; + font-feature-settings: "kern" 1, "liga" 0; + letter-spacing: 0.0015rem; +} + +#content a { + overflow-wrap: break-word; +} + +p { + margin: 0.8em 0; +} + +ul, +ol { + margin: 0.8em 0 0.8em 2em; +} + +dl { + margin: 0.8em 0; +} + +dt { + font-weight: bold; +} +dd { + margin-left: 2em; +} + +a { + text-decoration: none; +} +a[href]:link { + color: #d54e54; +} +a[href]:visited { + color: #802e31; +} +a[href]:hover { + text-decoration: underline; +} + +a[href].def:link, +a[href].def:visited { + color: rgba(69, 59, 97, 0.8); +} +a[href].def:hover { + color: rgb(78, 98, 114); +} + +/* @end */ + +/* @group Show and hide with JS */ + +body.js-enabled .hide-when-js-enabled { + display: none; +} + +/* @end */ + +/* @group responsive */ + +#package-header .caption { + margin: 0px 1em 0 2em; +} + +@media only screen and (min-width: 1280px) { + #content { + width: 63vw; + max-width: 1450px; + } + + #table-of-contents { + position: fixed; + max-width: 10vw; + top: 10.2em; + left: 2em; + bottom: 1em; + overflow-y: auto; + } + + #synopsis { + display: block; + position: fixed; + float: left; + top: 5em; + bottom: 1em; + right: 0; + max-width: 65vw; + overflow-y: auto; + /* Ensure that synopsis covers everything (including MathJAX markup) */ + z-index: 1; + } + + #synopsis .show { + border: 1px solid #5e5184; + padding: 0.7em; + max-height: 65vh; + } +} + +@media only screen and (max-width: 1279px) { + #content { + width: 80vw; + } + + #synopsis { + display: block; + padding: 0; + position: relative; + margin: 0; + width: 100%; + } +} + +@media only screen and (max-width: 999px) { + #content { + width: 93vw; + } +} + +/* menu for wider screens + + Display the package name at the left and the menu links at the right, + inline with each other: + The package name Source . Contents . Index +*/ +@media only screen and (min-width: 1000px) { + #package-header { + text-align: left; + white-space: nowrap; + height: 40px; + padding: 4px 1.5em 0px 1.5em; + overflow: visible; + + display: flex; + justify-content: space-between; + align-items: center; + } + + #package-header .caption { + display: inline-block; + margin: 0; + } + + #package-header ul.links { + margin: 0; + display: inline-table; + } + + #package-header .caption + ul.links { + margin-left: 1em; + } +} + +/* menu for smaller screens + +Display the package name on top of the menu links and center both elements: + The package name + Source . Contents . Index +*/ +@media only screen and (max-width: 999px) { + #package-header { + text-align: center; + padding: 6px 0 4px 0; + overflow: hidden; + } + + #package-header ul.links { + display: block; + text-align: center; + margin: 0; + + /* Hide scrollbar but allow scrolling menu links horizontally */ + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; + margin-bottom: -17px; + height: 50px; + } + + #package-header .caption { + display: block; + margin: 4px 0; + text-align: center; + } + + #package-header ul.links::-webkit-scrollbar { + display: none; + } + + #package-header ul.links li:first-of-type { + padding-left: 1em; + } + + #package-header ul.links li:last-of-type { + /* + The last link of the menu should offer the same distance to the right + as the #package-header enforces at the left. + */ + padding-right: 1em; + } + + #package-header .caption + ul.links { + padding-top: 9px; + } + + #module-header table.info { + float: none; + top: 0; + margin: 0 auto; + overflow: hidden; + max-width: 80vw; + } +} + +/* @end */ + +/* @group Fonts & Sizes */ + +/* Basic technique & IE workarounds from YUI 3 + For reasons, see: + http://yui.yahooapis.com/3.1.1/build/cssfonts/fonts.css + */ + +body, +button { + font: 400 14px/1.4 "PT Sans", /* Fallback Font Stack */ -apple-system, + BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, + "Helvetica Neue", sans-serif; + *font-size: medium; /* for IE */ + *font: x-small; /* for IE in quirks mode */ +} + +h1 { + font-size: 146.5%; /* 19pt */ +} +h2 { + font-size: 131%; /* 17pt */ +} +h3 { + font-size: 116%; /* 15pt */ +} +h4 { + font-size: 100%; /* 13pt */ +} +h5 { + font-size: 100%; /* 13pt */ +} + +table { + font-size: inherit; + font: 100%; +} + +pre, +code, +kbd, +samp, +tt, +.src { + font-family: monospace; +} + +.links, +.link { + font-size: 85%; /* 11pt */ +} + +#module-header .caption { + font-size: 182%; /* 24pt */ +} + +#module-header .caption sup { + font-size: 80%; + font-weight: normal; +} + +#package-header #page-menu a:link, +#package-header #page-menu a:visited { + color: white; +} + +.info { + font-size: 90%; +} + +/* @end */ + +/* @group Common */ + +.caption, +h1, +h2, +h3, +h4, +h5, +h6, +summary { + font-weight: bold; + color: #d84e53; + margin: 1.5em 0 1em 0; +} + +* + h1, +* + h2, +* + h3, +* + h4, +* + h5, +* + h6 { + margin-top: 2em; +} + +h1 + h2, +h2 + h3, +h3 + h4, +h4 + h5, +h5 + h6 { + margin-top: inherit; +} + +ul li + li { + margin-top: 0.2rem; +} + +ul + p { + margin-top: 0.93em; +} + +p + ul { + margin-top: 0.5em; +} + +p { + margin-top: 0.7rem; +} + +ul, +ol { + margin: 0.8em 0 0.8em 2em; +} + +ul.links { + list-style: none; + text-align: left; + font-size: 0.95em; +} + +#package-header ul.links, +#package-header ul.links button { + font-size: 1rem; +} + +ul.links li { + display: inline; + white-space: nowrap; + padding: 0; +} + +ul.links > li + li:before { + content: "\00B7"; +} + +ul.links li a { + padding: 0.2em 0.5em; +} + +.hide { + display: none; +} +.show { + display: inherit; +} +.clear { + clear: both; +} + +.collapser:before, +.expander:before, +.noexpander:before { + font-size: 1.2em; + color: #9c5791; + display: inline-block; + padding-right: 7px; +} + +.collapser:before { + content: "▿"; +} +.expander:before { + content: "▹"; +} +.noexpander:before { + content: "▿"; + visibility: hidden; +} + +.collapser, +.expander { + cursor: pointer; +} + +.instance.collapser, +.instance.expander { + margin-left: 0px; + background-position: left center; + min-width: 9px; + min-height: 9px; +} + +summary { + cursor: pointer; + outline: none; +} + +pre { + padding: 0.5rem 1rem; + margin: 1em 0 0 0; + background-color: #f7f7f7; + overflow: auto; + border: 1px solid #ddd; + border-radius: 0.3em; +} + +pre + p { + margin-top: 1em; +} + +pre + pre { + margin-top: 0.5em; +} + +blockquote { + border-left: 3px solid #c7a5d3; + background-color: #eee4f1; + margin: 0.5em; + padding: 0.0005em 0.3em 0.5em 0.5em; +} + +.src { + background: #f2f2f2; + padding: 0.2em 0.5em; +} + +.keyword { + font-weight: normal; +} +.def { + font-weight: bold; +} + +@media print { + #footer { + display: none; + } +} + +/* @end */ + +/* @group Page Structure */ + +#content { + margin: 3em auto 6em auto; + padding: 0; +} + +#package-header { + background: #803353; + border-bottom: 5px solid rgba(69, 59, 97, 0.5); + color: #ddd; + position: relative; + font-size: 1.2em; + text-align: left; + margin: 0 auto; +} + +#package-header .caption { + color: white; + font-style: normal; + font-size: 1rem; + font-weight: bold; +} + +#module-header .caption { + font-weight: bold; + border-bottom: 1px solid #ddd; +} + +table.info { + float: right; + padding: 0.5em 1em; + border: 1px solid #ddd; + color: rgb(78, 98, 114); + background-color: #fff; + max-width: 60%; + border-spacing: 0; + position: relative; + top: -0.78em; + margin: 0 0 0 2em; +} + +.info th { + padding: 0 1em 0 0; + text-align: right; +} + +#style-menu li { + display: block; + border-style: none; + list-style-type: none; +} + +#footer { + background: #ededed; + border-top: 1px solid #aaa; + padding: 0.5em 0; + color: #222; + text-align: center; + width: 100%; + height: 7em; + margin-top: 3em; + position: relative; + clear: both; +} + +#footer #tara { + width: 4em; +} + +/* @end */ + +/* @group Front Matter */ + +#synopsis .caption, +#contents-list .caption { + font-size: 1rem; +} + +#synopsis, +#table-of-contents { + font-size: 16px; +} + +#contents-list { + background: #f4f4f4; + padding: 1em; + margin: 0; +} + +#contents-list .caption { + text-align: left; + margin: 0; +} + +#contents-list ul { + list-style: none; + margin: 0; + margin-top: 10px; + font-size: 14px; +} + +#contents-list ul ul { + margin-left: 1.5em; +} + +#description .caption { + display: none; +} + +#synopsis summary { + display: block; + float: right; + width: 29px; + color: rgba(255, 255, 255, 0); + height: 110px; + margin: 0; + font-size: 1px; + padding: 0; + background: url(synopsis.png) no-repeat 0px -8px; +} + +#synopsis details[open] > summary { + background: url(synopsis.png) no-repeat -75px -8px; +} + +#synopsis ul { + height: 100%; + overflow: auto; + padding: 0.5em; + margin: 0; +} + +#synopsis ul ul { + overflow: hidden; +} + +#synopsis ul, +#synopsis ul li.src { + background-color: rgb(250, 247, 224); + white-space: nowrap; + list-style: none; + margin-left: 0; +} + +#interface td.src { + white-space: nowrap; +} + +/* @end */ + +/* @group Main Content */ + +#interface div.top + div.top { + margin-top: 1.5em; +} + +#interface p + div.top, +#interface h1 + div.top, +#interface h2 + div.top, +#interface h3 + div.top, +#interface h4 + div.top, +#interface h5 + div.top { + margin-top: 1em; +} +#interface .src .selflink, +#interface .src .link { + float: right; + color: #888; + padding: 0 7px; + -moz-user-select: none; + font-weight: bold; + line-height: 30px; +} +#interface .src .selflink { + margin: 0 -0.5em 0 0.5em; +} + +#interface span.fixity { + color: #919191; + border-left: 1px solid #919191; + padding: 0.2em 0.5em 0.2em 0.5em; + margin: 0 -1em 0 1em; +} + +#interface span.rightedge { + border-left: 1px solid #919191; + padding: 0.2em 0 0.2em 0; + margin: 0 0 0 1em; +} + +#interface table { + border-spacing: 2px; +} +#interface td { + vertical-align: top; + padding-left: 0.5em; +} + +#interface td.doc p { + margin: 0; +} +#interface td.doc p + p { + margin-top: 0.8em; +} + +.doc table { + border-collapse: collapse; + border-spacing: 0px; +} + +.doc th, +.doc td { + padding: 5px; + border: 1px solid #ddd; +} + +.doc th { + background-color: #f0f0f0; +} + +.clearfix:after { + clear: both; + content: " "; + display: block; + height: 0; + visibility: hidden; +} + +.subs, +.top > .doc, +.subs > .doc { + padding-left: 1em; + border-left: 1px solid gainsboro; + margin-bottom: 1em; +} + +.top .subs { + margin-bottom: 0.6em; +} + +.subs.fields ul { + list-style: none; + display: table; + margin: 0; +} + +.subs.fields ul li { + display: table-row; +} + +.subs ul li dfn { + display: table-cell; + font-style: normal; + font-weight: bold; + margin: 1px 0; + white-space: nowrap; +} + +.subs ul li > .doc { + display: table-cell; + padding-left: 0.5em; + margin-bottom: 0.5em; +} + +.subs ul li > .doc p { + margin: 0; +} + +.subs .subs p.src { + border: none; + background-color: #f8f8f8; +} + +.subs .subs .caption { + margin-top: 1em; + margin-bottom: 0px; +} + +.subs p.caption { + margin-top: 0; +} + +.subs .subs .caption + .src { + margin: 0px; + margin-top: 8px; +} + +.subs .subs .src + .src { + margin: 7px 0 0 0; +} + +/* Render short-style data instances */ +.inst ul { + height: 100%; + padding: 0.5em; + margin: 0; +} + +.inst, +.inst li { + list-style: none; + margin-left: 1em; +} + +/* Workaround for bug in Firefox (issue #384) */ +.inst-left { + float: left; +} + +.top p.src { + border-bottom: 3px solid #e5e5e5; + line-height: 2rem; + margin-bottom: 1em; +} + +.warning { + color: red; +} + +.arguments { + margin-top: -0.4em; +} +.arguments .caption { + display: none; +} + +.fields { + padding-left: 1em; +} + +.fields .caption { + display: none; +} + +.fields p { + margin: 0 0; +} + +/* this seems bulky to me +.methods, .constructors { + background: #f8f8f8; + border: 1px solid #eee; +} +*/ + +/* @end */ + +/* @group Auxiliary Pages */ + +.extension-list { + list-style-type: none; + margin-left: 0; +} + +#mini { + margin: 0 auto; + padding: 0 1em 1em; +} + +#mini > * { + font-size: 93%; /* 12pt */ +} + +#mini #module-list .caption, +#mini #module-header .caption { + font-size: 125%; /* 15pt */ +} + +#mini #interface h1, +#mini #interface h2, +#mini #interface h3, +#mini #interface h4 { + font-size: 109%; /* 13pt */ + margin: 1em 0 0; +} + +#mini #interface .top, +#mini #interface .src { + margin: 0; +} + +#mini #module-list ul { + list-style: none; + margin: 0; +} + +#alphabet ul { + list-style: none; + padding: 0; + margin: 0.5em 0 0; + text-align: center; +} + +#alphabet li { + display: inline; + margin: 0 0.25em; +} + +#alphabet a { + font-weight: bold; +} + +#index .caption, +#module-list .caption { + font-size: 131%; /* 17pt */ +} + +#index table { + margin-left: 2em; +} + +#index .src { + font-weight: bold; +} +#index .alt { + font-size: 77%; /* 10pt */ + font-style: italic; + padding-left: 2em; +} + +#index td + td { + padding-left: 1em; +} + +p.directory { + font-style: italic; +} + +#module-list ul { + list-style: none; + margin: 0 0 0 2em; +} + +#module-list li { + clear: right; +} + +#module-list span.collapser, +#module-list span.expander { + background-position: 0 0.3em; +} + +#module-list .package { + float: right; +} + +:target { + background: -webkit-linear-gradient( + top, + transparent 0%, + transparent 65%, + #fbf36d 60%, + #fbf36d 100% + ); + background: -moz-linear-gradient( + top, + transparent 0%, + transparent 65%, + #fbf36d 60%, + #fbf36d 100% + ); + background: -o-linear-gradient( + top, + transparent 0%, + transparent 65%, + #fbf36d 60%, + #fbf36d 100% + ); + background: -ms-linear-gradient( + top, + transparent 0%, + transparent 65%, + #fbf36d 60%, + #fbf36d 100% + ); + background: linear-gradient( + to bottom, + transparent 0%, + transparent 65%, + #fbf36d 60%, + #fbf36d 100% + ); +} + +:target:hover { + background: -webkit-linear-gradient( + top, + transparent 0%, + transparent 0%, + #fbf36d 0%, + #fbf36d 100% + ); + background: -moz-linear-gradient( + top, + transparent 0%, + transparent 0%, + #fbf36d 0%, + #fbf36d 100% + ); + background: -o-linear-gradient( + top, + transparent 0%, + transparent 0%, + #fbf36d 0%, + #fbf36d 100% + ); + background: -ms-linear-gradient( + top, + transparent 0%, + transparent 0%, + #fbf36d 0%, + #fbf36d 100% + ); + background: linear-gradient( + to bottom, + transparent 0%, + transparent 0%, + #fbf36d 0%, + #fbf36d 100% + ); +} + +/* @end */ + +/* @group Dropdown menus */ + +#preferences-menu, +#style-menu { + width: 25em; + overflow-y: auto; +} + +/* @end */ diff --git a/pull-137/assets/css/source-ayu-light.css b/pull-137/assets/css/source-ayu-light.css new file mode 100644 index 000000000..4a0ea3473 --- /dev/null +++ b/pull-137/assets/css/source-ayu-light.css @@ -0,0 +1,64 @@ +/* Color palette based on https://github.com/ayu-theme/ayu-colors */ +body { + background-color: #f8f9fa; +} + +.ju-inductive { + color: #86b300; +} + +.ju-constructor { + color: #a37acc; +} + +.ju-function { + color: #f2ae49; +} + +.ju-axiom { + color: #f07171; +} + +.ju-string { + color: #f07171; +} + +.ju-keyword { + color: #399ee6; +} + +.ju-delimiter { + color: #787b80; +} + +.ju-var { + color: #5c6166; +} + +.ju-number { + color: #000000; +} + +.ju-define { + font-weight: bold; +} + +a:hover, +a.hover-highlight { + background-color: #dadbdc; +} + +a:link, +a:visited { + text-decoration: none; +} + +footer { + color: gray; +} + +footer a { + color: gray; + font-size: small; + font-weight: bold; +} diff --git a/pull-137/assets/css/source-macchiato.css b/pull-137/assets/css/source-macchiato.css new file mode 100644 index 000000000..9f5f67a8b --- /dev/null +++ b/pull-137/assets/css/source-macchiato.css @@ -0,0 +1,76 @@ +/* Color palette based on https://github.com/catppuccin/catppuccin#-palette */ +body { + background-color: #24273a; +} + +.ju-inductive { + color: #a6da95; +} + +.ju-constructor { + color: #c6a0f6; +} + +.ju-function { + color: #eed49f; +} + +.ju-axiom { + color: #ed8796; +} + +.ju-string { + color: #ee99a0; +} + +.ju-keyword { + color: #7dc4e4; +} + +.ju-delimiter { + color: #939ab7; +} + +.ju-var { + color: #cad3f5; +} + +.ju-fixity { + color: #f5a97f; +} + +.ju-comment { + color: #a5adcb; +} + +.ju-judoc { + color: #8bd5ca; +} + +.ju-number { + color: #b8c0e0; +} + +.ju-define { + font-weight: bold; +} + +a:link, +a:visited { + text-decoration: none; +} + +a:hover, +a.hover-highlight { + background-color: #4c566a; +} + +footer { + color: gray; +} + +footer a { + color: gray; + font-size: small; + font-weight: bold; +} diff --git a/pull-137/assets/css/source-nord.css b/pull-137/assets/css/source-nord.css new file mode 100644 index 000000000..1a506e3e9 --- /dev/null +++ b/pull-137/assets/css/source-nord.css @@ -0,0 +1,64 @@ +/* Color palette based on https://www.nordtheme.com/ */ +body { + background-color: #2e3440; +} + +.ju-inductive { + color: #a3be8c; +} + +.ju-constructor { + color: #b48ead; +} + +.ju-function { + color: #ebcb8b; +} + +.ju-axiom { + color: #bf616a; +} + +.ju-string { + color: #bf616a; +} + +.ju-keyword { + color: #81a1c1; +} + +.ju-delimiter { + color: #5e81ac; +} + +.ju-var { + color: #d8dee9; +} + +.ju-number { + color: #d8dee9; +} + +.ju-defined { + font-weight: bold; +} + +a:link, +a:visited { + text-decoration: none; +} + +a:hover, +a.hover-highlight { + background-color: #4c566a; +} + +footer { + color: gray; +} + +footer a { + color: gray; + font-size: small; + font-weight: bold; +} diff --git a/pull-137/assets/images/favicon.png b/pull-137/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/pull-137/assets/images/favicon/android-chrome-192x192.png b/pull-137/assets/images/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..811a4177a4d85577bb2dbc160f80b38783dfcfab GIT binary patch literal 15302 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 literal 0 HcmV?d00001 diff --git a/pull-137/assets/images/favicon/browserconfig.xml b/pull-137/assets/images/favicon/browserconfig.xml new file mode 100644 index 000000000..b3930d0f0 --- /dev/null +++ b/pull-137/assets/images/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/pull-137/assets/images/favicon/favicon-16x16.png b/pull-137/assets/images/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5c6360253c44b2413c076011e958fe96d1b118 GIT binary patch literal 1109 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 literal 0 HcmV?d00001 diff --git a/pull-137/assets/images/favicon/mstile-150x150.png b/pull-137/assets/images/favicon/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf2d00b6e8672cfd8a5bb4fde3b14aba89a910f GIT binary patch literal 9950 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 + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/pull-137/assets/images/favicon/site.webmanifest b/pull-137/assets/images/favicon/site.webmanifest new file mode 100644 index 000000000..b20abb7cb --- /dev/null +++ b/pull-137/assets/images/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/pull-137/assets/images/social/CHANGELOG.png b/pull-137/assets/images/social/CHANGELOG.png new file mode 100644 index 0000000000000000000000000000000000000000..4785df613a31c6486ad7e057cc52bde10c6eaf61 GIT binary patch literal 32912 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