aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Julian2022-04-04 22:47:56 -0400
committerEduardo Julian2022-04-04 22:47:56 -0400
commit14f18c100c2f8c3ec9c60c14330d926cd2d6f639 (patch)
treea033abb73d7d6ca51878df76df7732e977dfabe3
parent8eb86ed366b2305751f2e831c7a081ffcca82c89 (diff)
Properly handling variance for arrays to avoid invalid subtyping.
-rw-r--r--.github/workflows/setup_aedifex/action.yml5
-rw-r--r--.github/workflows/test.yml2
-rw-r--r--documentation/bookmark/arithmetic.md12
-rw-r--r--documentation/bookmark/back_end/c++.md5
-rw-r--r--documentation/bookmark/bloat.md4
-rw-r--r--documentation/bookmark/business/management.md1
-rw-r--r--documentation/bookmark/business/model.md4
-rw-r--r--documentation/bookmark/business/negotiation.md1
-rw-r--r--documentation/bookmark/community/onboarding.md4
-rw-r--r--documentation/bookmark/composition/mixin.md (renamed from documentation/bookmark/mixin.md)0
-rw-r--r--documentation/bookmark/composition/recursion_schemes.md (renamed from documentation/bookmark/recursion_schemes.md)0
-rw-r--r--documentation/bookmark/concurrency/disruptor.md4
-rw-r--r--documentation/bookmark/concurrency/engine.md (renamed from documentation/bookmark/concurrency/Engine.md)0
-rw-r--r--documentation/bookmark/concurrency/lock_free_programming.md1
-rw-r--r--documentation/bookmark/foreign_function_interface.md1
-rw-r--r--documentation/bookmark/graphic/3d.md (renamed from documentation/bookmark/graphic/3D.md)0
-rw-r--r--documentation/bookmark/graphic/svg.md4
-rw-r--r--documentation/bookmark/math/arithmetic.md12
-rw-r--r--documentation/bookmark/music/language.md4
-rw-r--r--documentation/bookmark/resource_management.md5
-rw-r--r--documentation/bookmark/text/unicode.md4
-rw-r--r--documentation/bookmark/text/utf8.md9
-rw-r--r--documentation/bookmark/type_theory/unit.md5
-rw-r--r--documentation/bookmark/unicode.md4
-rw-r--r--documentation/bookmark/utf8.md9
-rw-r--r--lux-bootstrapper/src/lux/analyser/proc/jvm.clj21
-rw-r--r--lux-bootstrapper/src/lux/compiler/jvm/proc/host.clj22
-rw-r--r--lux-bootstrapper/src/lux/host.clj13
-rw-r--r--lux-bootstrapper/src/lux/type.clj25
-rw-r--r--lux-bootstrapper/src/lux/type/host.clj16
-rw-r--r--stdlib/source/library/lux/data/collection/array.lux85
-rw-r--r--stdlib/source/library/lux/ffi.jvm.lux12
-rw-r--r--stdlib/source/library/lux/ffi.old.lux2
-rw-r--r--stdlib/source/library/lux/target/jvm/reflection.lux4
-rw-r--r--stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux66
-rw-r--r--stdlib/source/library/lux/type/variance.lux35
-rw-r--r--stdlib/source/unsafe/lux/data/collection/array.lux96
37 files changed, 325 insertions, 172 deletions
diff --git a/.github/workflows/setup_aedifex/action.yml b/.github/workflows/setup_aedifex/action.yml
index bc848c2f0..fa70014a3 100644
--- a/.github/workflows/setup_aedifex/action.yml
+++ b/.github/workflows/setup_aedifex/action.yml
@@ -1,3 +1,5 @@
+# https://cardinalby.github.io/blog/post/github-actions/dry-reusing-code-in-github-actions/
+# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action
name: 'Setup Aedifex'
runs:
using: "composite"
@@ -8,7 +10,8 @@ runs:
distribution: 'temurin'
java-version: '17'
- - uses: actions/checkout@v2
+ # Presumably, whoever invokes this action already has done a checkout.
+ # - uses: actions/checkout@v2
- run: wget https://github.com/LuxLang/lux/releases/download/0.6.5/aedifex_do_not_touch_3.jar && mv aedifex_do_not_touch_3.jar aedifex.jar
shell: bash
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index f8b31badd..740da5621 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -4,11 +4,13 @@ jobs:
test_stdlib_on_jvm:
runs-on: ubuntu-latest
steps:
+ - uses: actions/checkout@v2
- uses: ./.github/workflows/setup_aedifex
- run: cd ./stdlib/ && ../lux.sh with jvm with bibliotheca test
test_stdlib_on_node_js:
runs-on: ubuntu-latest
steps:
+ - uses: actions/checkout@v2
- uses: ./.github/workflows/setup_aedifex
# https://github.com/actions/setup-node
- uses: actions/setup-node@v2
diff --git a/documentation/bookmark/arithmetic.md b/documentation/bookmark/arithmetic.md
deleted file mode 100644
index e4a3ddd07..000000000
--- a/documentation/bookmark/arithmetic.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Saturation
-
-1. [Saturation arithmetic](https://en.wikipedia.org/wiki/Saturation_arithmetic)
-
-# Interval
-
-1. [Interval Arithmetic: Not All Intervals are Created Equal](https://samlikes.pizza/pluto_interval_blog.jl.html)
-1. [Growing a Language, by Guy Steele](https://www.youtube.com/watch?v=_ahvzDzKdB0&t=2214s)
-1. [Yet another alternative to floating-point numbers](https://wordsandbuttons.online/yet_another_alternative_to_floating_point_numbers.html)
-1. [Interval arithmetic](https://en.wikipedia.org/wiki/Interval_arithmetic)
-1. [How do you compute the midpoint of an interval?](https://hal.archives-ouvertes.fr/file/index/docid/576641/filename/computing-midpoint.pdf)
-
diff --git a/documentation/bookmark/back_end/c++.md b/documentation/bookmark/back_end/c++.md
index 8cbb088d5..e86d2672d 100644
--- a/documentation/bookmark/back_end/c++.md
+++ b/documentation/bookmark/back_end/c++.md
@@ -1,5 +1,10 @@
+# Optimization
+
+0. [C and C++ coding style for best performance](https://www.ibm.com/docs/en/aix/7.1?topic=implementation-c-c-coding-style-best-performance)
+
# Reference
+0. [Constant references are not always your friends](https://belaycpp.com/2022/02/15/constant-references-are-not-always-your-friends/)
0. [Unionizing for Profit: How to Exploit the Power of Unions in C++](https://dev-discuss.pytorch.org/t/unionizing-for-profit-how-to-exploit-the-power-of-unions-in-c/444)
0. [std::any: How, when, and why](https://devblogs.microsoft.com/cppblog/stdany-how-when-and-why/)
0. [Using C Libraries in your Modern C++ Embedded Project - Michael Caisse - CppCon 2021](https://www.youtube.com/watch?v=Ototzy-nP4M)
diff --git a/documentation/bookmark/bloat.md b/documentation/bookmark/bloat.md
new file mode 100644
index 000000000..e1091256c
--- /dev/null
+++ b/documentation/bookmark/bloat.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Nibbler: Debloating Binary Shared Libraries](https://cs.brown.edu/~vpk/papers/nibbler.acsac19.pdf)
+
diff --git a/documentation/bookmark/business/management.md b/documentation/bookmark/business/management.md
index b7205f1d0..aa7b63070 100644
--- a/documentation/bookmark/business/management.md
+++ b/documentation/bookmark/business/management.md
@@ -1,4 +1,5 @@
# Reference
+0. [First, Let’s Fire All the Managers](https://hbr.org/2011/12/first-lets-fire-all-the-managers)
0. [Value Add Disease](https://boz.com/articles/vad)
diff --git a/documentation/bookmark/business/model.md b/documentation/bookmark/business/model.md
new file mode 100644
index 000000000..7857523b8
--- /dev/null
+++ b/documentation/bookmark/business/model.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Reciprocity as a Business Model: What motivates people to pay for services they receive?](https://briefthoughts.substack.com/p/reciprocity-as-a-business-model?s=r)
+
diff --git a/documentation/bookmark/business/negotiation.md b/documentation/bookmark/business/negotiation.md
index 636bcbbfe..32b092b3d 100644
--- a/documentation/bookmark/business/negotiation.md
+++ b/documentation/bookmark/business/negotiation.md
@@ -1,4 +1,5 @@
# Reference
+0. [A Better Way to Divide the Pie](https://insights.som.yale.edu/insights/better-way-to-divide-the-pie)
0. [Rethinking Negotiation: A smarter way to split the pie](https://hbr.org/2021/11/rethinking-negotiation)
diff --git a/documentation/bookmark/community/onboarding.md b/documentation/bookmark/community/onboarding.md
new file mode 100644
index 000000000..8407ed4cd
--- /dev/null
+++ b/documentation/bookmark/community/onboarding.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [The Ultimate Guide to Onboarding Software Engineers](https://leadership.garden/onboarding-engineers/)
+
diff --git a/documentation/bookmark/mixin.md b/documentation/bookmark/composition/mixin.md
index bdcc7ae9c..bdcc7ae9c 100644
--- a/documentation/bookmark/mixin.md
+++ b/documentation/bookmark/composition/mixin.md
diff --git a/documentation/bookmark/recursion_schemes.md b/documentation/bookmark/composition/recursion_schemes.md
index 31a013123..31a013123 100644
--- a/documentation/bookmark/recursion_schemes.md
+++ b/documentation/bookmark/composition/recursion_schemes.md
diff --git a/documentation/bookmark/concurrency/disruptor.md b/documentation/bookmark/concurrency/disruptor.md
new file mode 100644
index 000000000..159a380f6
--- /dev/null
+++ b/documentation/bookmark/concurrency/disruptor.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [LMAX Disruptor: High performance alternative to bounded queues for exchanging data between concurrent threads](https://lmax-exchange.github.io/disruptor/disruptor.html)
+
diff --git a/documentation/bookmark/concurrency/Engine.md b/documentation/bookmark/concurrency/engine.md
index 33d036863..33d036863 100644
--- a/documentation/bookmark/concurrency/Engine.md
+++ b/documentation/bookmark/concurrency/engine.md
diff --git a/documentation/bookmark/concurrency/lock_free_programming.md b/documentation/bookmark/concurrency/lock_free_programming.md
index 1ee123951..d904c8841 100644
--- a/documentation/bookmark/concurrency/lock_free_programming.md
+++ b/documentation/bookmark/concurrency/lock_free_programming.md
@@ -1,5 +1,6 @@
# Reference
+0. [Nonblocking Algorithms and Scalable Multicore Programming: Exploring some alternatives to lock-based synchronization](https://queue.acm.org/detail.cfm?id=2492433)
0. [Design and Implementation of Highly Scalable Quantifiable Data Structures in C++ - CppCon 2021](https://www.youtube.com/watch?v=ECWsLj0pgbI)
0. [Building a Lock-free Multi-producer, Multi-consumer Queue for Tcmalloc - Matt Kulukundis - CppCon 21](https://www.youtube.com/watch?v=_qaKkHuHYE0)
0. [Fear and Loathing in Lock-Free Programming](https://medium.com/@tylerneely/fear-and-loathing-in-lock-free-programming-7158b1cdd50c)
diff --git a/documentation/bookmark/foreign_function_interface.md b/documentation/bookmark/foreign_function_interface.md
index eca9fe747..ce86904db 100644
--- a/documentation/bookmark/foreign_function_interface.md
+++ b/documentation/bookmark/foreign_function_interface.md
@@ -1,4 +1,5 @@
# Reference
+0. [Rust - Python FFI From Scratch](https://i.hsfzxjy.site/2022-03-12-rust-python-ffi-from-scratch/)
0. [Porting libffi to pure WebAssembly](https://www.tweag.io/blog/2022-03-17-libffi-wasm32/)
diff --git a/documentation/bookmark/graphic/3D.md b/documentation/bookmark/graphic/3d.md
index a4d7702f0..a4d7702f0 100644
--- a/documentation/bookmark/graphic/3D.md
+++ b/documentation/bookmark/graphic/3d.md
diff --git a/documentation/bookmark/graphic/svg.md b/documentation/bookmark/graphic/svg.md
new file mode 100644
index 000000000..36b7efe43
--- /dev/null
+++ b/documentation/bookmark/graphic/svg.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [Optimizing SVG Patterns to Their Smallest Size](https://css-tricks.com/optimizing-svg-patterns/)
+
diff --git a/documentation/bookmark/math/arithmetic.md b/documentation/bookmark/math/arithmetic.md
new file mode 100644
index 000000000..93e4a97ee
--- /dev/null
+++ b/documentation/bookmark/math/arithmetic.md
@@ -0,0 +1,12 @@
+# Saturation
+
+0. [Saturation arithmetic](https://en.wikipedia.org/wiki/Saturation_arithmetic)
+
+# Interval
+
+0. [Interval Arithmetic: Not All Intervals are Created Equal](https://samlikes.pizza/pluto_interval_blog.jl.html)
+0. [Growing a Language, by Guy Steele](https://www.youtube.com/watch?v=_ahvzDzKdB0&t=2214s)
+0. [Yet another alternative to floating-point numbers](https://wordsandbuttons.online/yet_another_alternative_to_floating_point_numbers.html)
+0. [Interval arithmetic](https://en.wikipedia.org/wiki/Interval_arithmetic)
+0. [How do you compute the midpoint of an interval?](https://hal.archives-ouvertes.fr/file/index/docid/576641/filename/computing-midpoint.pdf)
+
diff --git a/documentation/bookmark/music/language.md b/documentation/bookmark/music/language.md
new file mode 100644
index 000000000..f7fb95dd6
--- /dev/null
+++ b/documentation/bookmark/music/language.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [glicol](https://glicol.org/)
+
diff --git a/documentation/bookmark/resource_management.md b/documentation/bookmark/resource_management.md
index 3b353ccab..ef459b9f0 100644
--- a/documentation/bookmark/resource_management.md
+++ b/documentation/bookmark/resource_management.md
@@ -1,5 +1,6 @@
# Reference
-1. [Understanding ResourceT](https://www.fpcomplete.com/blog/2017/06/understanding-resourcet/)
-1. [Composable resource management in Scala](https://bszwej.medium.com/composable-resource-management-in-scala-ce902bda48b2)
+0. [Vale's Higher RAII, the pattern that saved me a vital 5 hours in the 7DRL Challenge](https://verdagon.dev/blog/higher-raii-7drl)
+0. [Understanding ResourceT](https://www.fpcomplete.com/blog/2017/06/understanding-resourcet/)
+0. [Composable resource management in Scala](https://bszwej.medium.com/composable-resource-management-in-scala-ce902bda48b2)
diff --git a/documentation/bookmark/text/unicode.md b/documentation/bookmark/text/unicode.md
new file mode 100644
index 000000000..f58b09aac
--- /dev/null
+++ b/documentation/bookmark/text/unicode.md
@@ -0,0 +1,4 @@
+# Reference
+
+0. [How Unicode helps to ruin your software](https://blog.typeable.io/posts/2021-08-17-unicode.html)
+
diff --git a/documentation/bookmark/text/utf8.md b/documentation/bookmark/text/utf8.md
new file mode 100644
index 000000000..4def76b75
--- /dev/null
+++ b/documentation/bookmark/text/utf8.md
@@ -0,0 +1,9 @@
+# Reference
+
+0. [A Branchless UTF-8 Decoder](https://nullprogram.com/blog/2017/10/06/)
+0. [skeeto/branchless-utf8](https://github.com/skeeto/branchless-utf8/blob/master/utf8.h)
+0. [trivial-utf-8](https://gitlab.common-lisp.net/trivial-utf-8/trivial-utf-8)
+0. [utf8: Unicode Text Processing](https://rdrr.io/cran/utf8/)
+0. [Encoding character strings in R](https://rstudio-pubs-static.s3.amazonaws.com/279354_f552c4c41852439f910ad620763960b6.html)
+0. [Any Encoding, Ever - ztd.text and Unicode for C++](https://thephd.dev/any-encoding-ever-ztd-text-unicode-cpp)
+
diff --git a/documentation/bookmark/type_theory/unit.md b/documentation/bookmark/type_theory/unit.md
index cf23e396c..1a82ddf66 100644
--- a/documentation/bookmark/type_theory/unit.md
+++ b/documentation/bookmark/type_theory/unit.md
@@ -1,5 +1,6 @@
# Reference
-1. https://en.wikipedia.org/wiki/Metric_prefix#Metric_units
-1. [unittyped: An extendable library for type-safe computations including units.](https://hackage.haskell.org/package/unittyped)
+0. [mp-units - A Units Library for C++](https://github.com/mpusz/units)
+0. https://en.wikipedia.org/wiki/Metric_prefix#Metric_units
+0. [unittyped: An extendable library for type-safe computations including units.](https://hackage.haskell.org/package/unittyped)
diff --git a/documentation/bookmark/unicode.md b/documentation/bookmark/unicode.md
deleted file mode 100644
index 706b3791d..000000000
--- a/documentation/bookmark/unicode.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Reference
-
-1. [How Unicode helps to ruin your software](https://blog.typeable.io/posts/2021-08-17-unicode.html)
-
diff --git a/documentation/bookmark/utf8.md b/documentation/bookmark/utf8.md
deleted file mode 100644
index 3dd68e828..000000000
--- a/documentation/bookmark/utf8.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Reference
-
-1. [A Branchless UTF-8 Decoder](https://nullprogram.com/blog/2017/10/06/)
-1. [skeeto/branchless-utf8](https://github.com/skeeto/branchless-utf8/blob/master/utf8.h)
-1. [trivial-utf-8](https://gitlab.common-lisp.net/trivial-utf-8/trivial-utf-8)
-1. [utf8: Unicode Text Processing](https://rdrr.io/cran/utf8/)
-1. [Encoding character strings in R](https://rstudio-pubs-static.s3.amazonaws.com/279354_f552c4c41852439f910ad620763960b6.html)
-1. [Any Encoding, Ever - ztd.text and Unicode for C++](https://thephd.dev/any-encoding-ever-ztd-text-unicode-cpp)
-
diff --git a/lux-bootstrapper/src/lux/analyser/proc/jvm.clj b/lux-bootstrapper/src/lux/analyser/proc/jvm.clj
index 38310e60c..0cfa8c873 100644
--- a/lux-bootstrapper/src/lux/analyser/proc/jvm.clj
+++ b/lux-bootstrapper/src/lux/analyser/proc/jvm.clj
@@ -206,7 +206,7 @@
(&/$GenericArray param)
(|do [=param (generic-class->type env param)]
- (return (&/$Primitive &host-type/array-data-tag (&/|list =param))))
+ (return (&type/Array =param)))
(&/$GenericWildcard _)
(return (&/$ExQ &/$End (&/$Parameter 1)))
@@ -568,7 +568,7 @@
&&a-parser/parse-gclass)
gtype-env &/get-type-env
=gclass (&host-type/instance-gtype &type/existential gtype-env gclass)
- :let [array-type (&/$Primitive &host-type/array-data-tag (&/|list =gclass))]
+ :let [array-type (&type/Array =gclass)]
=length (&&/analyse-1 analyse length-type length)
_ (&type/check exo-type array-type)
_location &/location]
@@ -578,11 +578,14 @@
(defn- analyse-jvm-aaload [analyse exo-type ?values]
(|do [:let [(&/$Item array (&/$Item idx (&/$End))) ?values]
=array (&&/analyse-1+ analyse array)
- [arr-class arr-params] (ensure-object (&&/expr-type* =array))
+ array-type (&type/normal (&&/expr-type* =array))
+ [arr-class arr-params] (ensure-object array-type)
_ (&/assert! (= &host-type/array-data-tag arr-class) (str "[Analyser Error] Expected array. Instead got: " arr-class))
- :let [(&/$Item inner-arr-type (&/$End)) arr-params]
+ :let [(&/$Item mutable_type (&/$End)) arr-params
+ (&/$Primitive "#Mutable" (&/$Item type_variance (&/$End))) mutable_type
+ (&/$Function write_type read_type) type_variance]
=idx (&&/analyse-1 analyse idx-type idx)
- _ (&type/check exo-type inner-arr-type)
+ _ (&type/check exo-type read_type)
_location &/location]
(return (&/|list (&&/|meta exo-type _location
(&&/$proc (&/T ["jvm" "aaload"]) (&/|list =array =idx) (&/|list)))))))
@@ -590,12 +593,14 @@
(defn- analyse-jvm-aastore [analyse exo-type ?values]
(|do [:let [(&/$Item array (&/$Item idx (&/$Item elem (&/$End)))) ?values]
=array (&&/analyse-1+ analyse array)
- :let [array-type (&&/expr-type* =array)]
+ array-type (&type/normal (&&/expr-type* =array))
[arr-class arr-params] (ensure-object array-type)
_ (&/assert! (= &host-type/array-data-tag arr-class) (str "[Analyser Error] Expected array. Instead got: " arr-class))
- :let [(&/$Item inner-arr-type (&/$End)) arr-params]
+ :let [(&/$Item mutable_type (&/$End)) arr-params
+ (&/$Primitive "#Mutable" (&/$Item type_variance (&/$End))) mutable_type
+ (&/$Function write_type read_type) type_variance]
=idx (&&/analyse-1 analyse idx-type idx)
- =elem (&&/analyse-1 analyse inner-arr-type elem)
+ =elem (&&/analyse-1 analyse write_type elem)
_ (&type/check exo-type array-type)
_location &/location]
(return (&/|list (&&/|meta exo-type _location
diff --git a/lux-bootstrapper/src/lux/compiler/jvm/proc/host.clj b/lux-bootstrapper/src/lux/compiler/jvm/proc/host.clj
index a455be83a..619e4b6f9 100644
--- a/lux-bootstrapper/src/lux/compiler/jvm/proc/host.clj
+++ b/lux-bootstrapper/src/lux/compiler/jvm/proc/host.clj
@@ -777,7 +777,11 @@
;; (&/$End) special-args
]
^MethodVisitor *writer* &/get-writer
- array-type (&host/->java-sig (&a/expr-type* ?array))
+ normal_array_type (&type/normal (&a/expr-type* ?array))
+ :let [(&/$Primitive "#Array" (&/$Item mutable_type (&/$End))) normal_array_type
+ (&/$Primitive "#Mutable" (&/$Item type_variance (&/$End))) mutable_type
+ (&/$Function write_type read_type) type_variance]
+ array-type (&host/->java-sig (&/$Primitive "#Array" (&/|list read_type)))
_ (compile ?array)
:let [_ (.visitTypeInsn *writer* Opcodes/CHECKCAST array-type)]
_ (compile ?idx)
@@ -792,7 +796,11 @@
;; (&/$End) special-args
]
^MethodVisitor *writer* &/get-writer
- array-type (&host/->java-sig (&a/expr-type* ?array))
+ normal_array_type (&type/normal (&a/expr-type* ?array))
+ :let [(&/$Primitive "#Array" (&/$Item mutable_type (&/$End))) normal_array_type
+ (&/$Primitive "#Mutable" (&/$Item type_variance (&/$End))) mutable_type
+ (&/$Function write_type read_type) type_variance]
+ array-type (&host/->java-sig (&/$Primitive "#Array" (&/|list write_type)))
_ (compile ?array)
:let [_ (.visitTypeInsn *writer* Opcodes/CHECKCAST array-type)]
:let [_ (.visitInsn *writer* Opcodes/DUP)]
@@ -809,7 +817,15 @@
;; (&/$End) special-args
]
^MethodVisitor *writer* &/get-writer
- array-type (&host/->java-sig (&a/expr-type* ?array))
+ normal_array_type (&type/normal (&a/expr-type* ?array))
+ array-type (|case normal_array_type
+ (&/$Primitive ?name (&/$End))
+ (&host/->java-sig normal_array_type)
+
+ (&/$Primitive "#Array" (&/$Item mutable_type (&/$End)))
+ (|let [(&/$Primitive "#Mutable" (&/$Item type_variance (&/$End))) mutable_type
+ (&/$Function write_type read_type) type_variance]
+ (&host/->java-sig (&/$Primitive "#Array" (&/|list read_type)))))
_ (compile ?array)
:let [_ (.visitTypeInsn *writer* Opcodes/CHECKCAST array-type)]
:let [_ (doto *writer*
diff --git a/lux-bootstrapper/src/lux/host.clj b/lux-bootstrapper/src/lux/host.clj
index 7b114a772..0abba888a 100644
--- a/lux-bootstrapper/src/lux/host.clj
+++ b/lux-bootstrapper/src/lux/host.clj
@@ -42,13 +42,19 @@
(def ->package ->module-class)
(defn unfold-array
- "(-> Type (, Int Type))"
+ "(-> Type [Nat Type])"
[type]
(|case type
- (&/$Primitive "#Array" (&/$Item param (&/$End)))
+ (&/$Primitive "#Array" (&/$Item (&/$Primitive "#Mutable" (&/$Item (&/$Function _ param)
+ (&/$End)))
+ (&/$End)))
(|let [[count inner] (unfold-array param)]
(&/T [(inc count) inner]))
+ (&/$Primitive "#Array" (&/$Item param (&/$End)))
+ (|let [[count inner] (unfold-array param)]
+ (&/T [(inc count) inner]))
+
_
(&/T [0 type])))
@@ -59,7 +65,8 @@
[^objects type]
(|case type
(&/$Primitive ?name params)
- (cond (= &host-type/array-data-tag ?name) (|do [:let [[level base] (unfold-array type)]
+ (cond (= &host-type/array-data-tag ?name) (|do [normal_type (&type/normal type)
+ :let [[level base] (unfold-array normal_type)]
base-sig (|case base
(&/$Primitive base-class _)
(return (&host-generics/->type-signature base-class))
diff --git a/lux-bootstrapper/src/lux/type.clj b/lux-bootstrapper/src/lux/type.clj
index e1e229ce9..657eb3077 100644
--- a/lux-bootstrapper/src/lux/type.clj
+++ b/lux-bootstrapper/src/lux/type.clj
@@ -40,8 +40,7 @@
(def Text (&/$Named (&/T [&/prelude "Text"]) (&/$Primitive "#Text" &/$End)))
(def Ident (&/$Named (&/T [&/prelude "Ident"]) (&/$Product Text Text)))
-(defn Array [elemT]
- (&/$Primitive "#Array" (&/|list elemT)))
+(def Array &&host/Array)
(def Nothing
(&/$Named (&/T [&/prelude "Nothing"])
@@ -924,3 +923,25 @@
_
(return type)))
+
+(defn normal
+ "(-> Type Type)"
+ [it]
+ (|case it
+ (&/$Named _ ?it)
+ (normal ?it)
+
+ (&/$Primitive ?name ?parameters)
+ (|do [=parameters (&/map% normal ?parameters)]
+ (return (&/$Primitive ?name =parameters)))
+
+ (&/$Apply ?parameter ?abstraction)
+ (|do [reification (apply-type ?abstraction ?parameter)]
+ (normal reification))
+
+ (&/$Var id)
+ (|do [referenced (deref id)]
+ (normal referenced))
+
+ _
+ (return it)))
diff --git a/lux-bootstrapper/src/lux/type/host.clj b/lux-bootstrapper/src/lux/type/host.clj
index 692062f50..0ea72c98f 100644
--- a/lux-bootstrapper/src/lux/type/host.clj
+++ b/lux-bootstrapper/src/lux/type/host.clj
@@ -64,7 +64,11 @@
(&/$Parameter 1))))
;; [Exports]
+(def mutable-data-tag "#Mutable")
(def array-data-tag "#Array")
+(defn Array [item]
+ (&/$Primitive array-data-tag (&/|list (&/$Primitive mutable-data-tag (&/|list (&/$Function item item))))))
+
(def null-data-tag "#Null")
(def i64-data-tag "#I64")
(def nat-data-tag "#Nat")
@@ -135,7 +139,7 @@
(let [base (or arr-obase simple-base (jprim->lprim arr-pbase))]
(if (.equals "void" base)
Any
- (reduce (fn [inner _] (&/$Primitive array-data-tag (&/|list inner)))
+ (reduce (fn [inner _] (Array inner))
(&/$Primitive base (try (-> (Class/forName base) .getTypeParameters
seq count (repeat (&/$Primitive "java.lang.Object" &/$End))
&/->list)
@@ -152,7 +156,7 @@
(instance? GenericArrayType refl-type)
(|do [inner-type (instance-param existential matchings (.getGenericComponentType ^GenericArrayType refl-type))]
- (return (&/$Primitive array-data-tag (&/|list inner-type))))
+ (return (Array inner-type)))
(instance? ParameterizedType refl-type)
(|do [:let [refl-type* ^ParameterizedType refl-type]
@@ -183,7 +187,11 @@
(if (type= Any class-type)
"V"
(|case class-type
- (&/$Primitive "#Array" (&/$Item (&/$Primitive class-name _) (&/$End)))
+ (&/$Primitive "#Array"
+ (&/$Item (&/$Primitive "#Mutable"
+ (&/$Item (&/$Function _ (&/$Primitive class-name _))
+ (&/$End)))
+ (&/$End)))
(str "[" (&host-generics/->type-signature class-name))
(&/$Primitive class-name _)
@@ -211,7 +219,7 @@
(|case gtype
(&/$GenericArray component-type)
(|do [inner-type (instance-gtype existential matchings component-type)]
- (return (&/$Primitive array-data-tag (&/|list inner-type))))
+ (return (Array inner-type)))
(&/$GenericClass type-name type-params)
;; When referring to type-parameters during class or method
diff --git a/stdlib/source/library/lux/data/collection/array.lux b/stdlib/source/library/lux/data/collection/array.lux
index 4a931cfae..eb0cf93b0 100644
--- a/stdlib/source/library/lux/data/collection/array.lux
+++ b/stdlib/source/library/lux/data/collection/array.lux
@@ -9,13 +9,18 @@
[predicate {"+" Predicate}]]
[data
[collection
- ["[0]" list]]]]]
+ ["[0]" list]]]
+ [type
+ [variance {"+"}]]]]
["!" \\unsafe])
(def: .public type_name
Text
!.type)
+(type: .public Array'
+ !.Array')
+
(type: .public Array
!.Array)
@@ -24,73 +29,73 @@
(|>> !.empty))
(def: .public size
- (All (_ a) (-> (Array a) Nat))
+ (All (_ r w) (-> (Array' r w) Nat))
(|>> !.size))
(def: .public (item index array)
- (All (_ a)
- (-> Nat (Array a) (Maybe a)))
+ (All (_ r w)
+ (-> Nat (Array' r w) (Maybe r)))
(if (!.lacks? index array)
{.#None}
{.#Some (!.item index array)}))
(def: .public (has! index value array)
- (All (_ a)
- (-> Nat a (Array a) (Array a)))
+ (All (_ r w)
+ (-> Nat w (Array' r w) (Array' r w)))
(!.has! index value array))
(def: .public (lacks! index array)
- (All (_ a)
- (-> Nat (Array a) (Array a)))
+ (All (_ r w)
+ (-> Nat (Array' r w) (Array' r w)))
(!.lacks! index array))
(def: .public (lacks? index array)
- (All (_ a)
- (-> Nat (Array a) Bit))
+ (All (_ r w)
+ (-> Nat (Array' r w) Bit))
(!.lacks? index array))
(def: .public (has? index array)
- (All (_ a)
- (-> Nat (Array a) Bit))
+ (All (_ r w)
+ (-> Nat (Array' r w) Bit))
(!.has? index array))
(def: .public (revised! index $ array)
- (All (_ a)
- (-> Nat (-> a a) (Array a) (Array a)))
+ (All (_ r w)
+ (-> Nat (-> r w) (Array' r w) (Array' r w)))
(!.revised! index $ array))
(def: .public (upsert! index default transform array)
- (All (_ a)
- (-> Nat a (-> a a) (Array a) (Array a)))
+ (All (_ r w)
+ (-> Nat r (-> r w) (Array' r w) (Array' r w)))
(!.upsert! index default transform array))
(def: .public (copy! length src_start src_array dest_start dest_array)
- (All (_ a)
- (-> Nat Nat (Array a) Nat (Array a)
- (Array a)))
+ (All (_ r w)
+ (-> Nat Nat (Array' w Nothing) Nat (Array' r w)
+ (Array' r w)))
(!.copy! length src_start src_array dest_start dest_array))
(def: .public occupancy
- (All (_ a) (-> (Array a) Nat))
+ (All (_ r w) (-> (Array' r w) Nat))
(|>> !.occupancy))
(def: .public vacancy
- (All (_ a) (-> (Array a) Nat))
+ (All (_ r w) (-> (Array' r w) Nat))
(|>> !.vacancy))
(def: .public (only! ? it)
- (All (_ a)
- (-> (Predicate a) (Array a) (Array a)))
+ (All (_ r w)
+ (-> (Predicate r) (Array' r w) (Array' r w)))
(!.only! ? it))
(def: .public (example ? it)
- (All (_ a)
- (-> (Predicate a) (Array a) (Maybe a)))
+ (All (_ r w)
+ (-> (Predicate r) (Array' r w) (Maybe r)))
(!.example ? it))
(def: .public (example' ? it)
- (All (_ a)
- (-> (-> Nat a Bit) (Array a) (Maybe [Nat a])))
+ (All (_ r w)
+ (-> (-> Nat r Bit) (Array' r w) (Maybe [Nat r])))
(!.example' ? it))
(def: .public clone
@@ -102,11 +107,11 @@
(|>> !.of_list))
(def: .public (list default array)
- (All (_ a) (-> (Maybe a) (Array a) (List a)))
+ (All (_ r w) (-> (Maybe r) (Array' r w) (List r)))
(!.list default array))
(implementation: .public (equivalence //)
- (All (_ a) (-> (Equivalence a) (Equivalence (Array a))))
+ (All (_ r) (-> (Equivalence r) (Equivalence (Ex (_ w) (Array' r w)))))
(def: (= left/* right/*)
(!.= // left/* right/*)))
@@ -120,7 +125,7 @@
(!.composite left/* right/*)))
(implementation: .public mix
- (Mix Array)
+ (Mix (All (_ r) (Array' r Nothing)))
(def: (mix $ init it)
(!.mix (function (_ index partial total)
@@ -134,17 +139,17 @@
(def: (each $ input)
(!.each $ input)))
-(def: .public (every? ? it)
- (All (_ a)
- (-> (Predicate a) (Predicate (Array a))))
- (!.every? ? it))
+(template [<safe> <unsafe>]
+ [(def: .public (<safe> ? it)
+ (All (_ r w)
+ (-> (Predicate r) (Predicate (Array' r w))))
+ (<unsafe> ? it))]
-(def: .public (any? ? it)
- (All (_ a)
- (-> (Predicate a) (Predicate (Array a))))
- (!.any? ? it))
+ [every? !.every?]
+ [any? !.any?]
+ )
(def: .public (one ? it)
- (All (_ a b)
- (-> (-> a (Maybe b)) (Array a) (Maybe b)))
+ (All (_ r r' w)
+ (-> (-> r (Maybe r')) (Array' r w) (Maybe r')))
(!.one ? it))
diff --git a/stdlib/source/library/lux/ffi.jvm.lux b/stdlib/source/library/lux/ffi.jvm.lux
index 2428f6bb2..2441cf387 100644
--- a/stdlib/source/library/lux/ffi.jvm.lux
+++ b/stdlib/source/library/lux/ffi.jvm.lux
@@ -382,8 +382,7 @@
(` {.#Primitive (~ (code.text (..reflection (jvm.array elementT)))) {.#End}})
{.#None}
- (` {.#Primitive (~ (code.text array.type_name))
- {.#Item (~ (value_type elementT)) {.#End}}}))]))
+ (` ((~! array.Array) (~ (value_type elementT)))))]))
... else
(undefined)
)))
@@ -1691,8 +1690,9 @@
[jvm.double "jvm array new double"]
[jvm.char "jvm array new char"]))
... else
- (in (list (` (.is (~ (value_type {#ManualPrM} (jvm.array type)))
- ("jvm array new object" (~ g!size))))))))))
+ (in (list (` (.as ((~! array.Array) (~ (value_type {#ManualPrM} type)))
+ (.is (~ (value_type {#ManualPrM} (jvm.array type)))
+ ("jvm array new object" (~ g!size)))))))))))
(exception: .public (cannot_convert_to_jvm_type [type .Type])
(exception.report
@@ -1743,9 +1743,9 @@
(text#= array.type_name name)
(case params
- {.#Item elementLT {.#End}}
+ {.#Item {.#Apply writeLT {.#Apply readLT _Mutable}} {.#End}}
(# meta.monad each jvm.array
- (lux_type->jvm_type context elementLT))
+ (lux_type->jvm_type context readLT))
_
<failure>)
diff --git a/stdlib/source/library/lux/ffi.old.lux b/stdlib/source/library/lux/ffi.old.lux
index ce9e50959..32844a7d7 100644
--- a/stdlib/source/library/lux/ffi.old.lux
+++ b/stdlib/source/library/lux/ffi.old.lux
@@ -1727,5 +1727,5 @@
(syntax: .public (type [type (..generic_type^ (list))])
(in (list (..class_type {#ManualPrM} (list) type))))
-(template: .public (as type term)
+(template: .public (is type term)
[(.as type term)])
diff --git a/stdlib/source/library/lux/target/jvm/reflection.lux b/stdlib/source/library/lux/target/jvm/reflection.lux
index 55b6a4185..4fe60fd37 100644
--- a/stdlib/source/library/lux/target/jvm/reflection.lux
+++ b/stdlib/source/library/lux/target/jvm/reflection.lux
@@ -183,8 +183,8 @@
{.#Some reflection}
... TODO: Instead of having single lower/upper bounds, should
... allow for multiple ones.
- (case [(array.read! 0 (java/lang/reflect/WildcardType::getLowerBounds reflection))
- (array.read! 0 (java/lang/reflect/WildcardType::getUpperBounds reflection))]
+ (case [(array.item 0 (java/lang/reflect/WildcardType::getLowerBounds reflection))
+ (array.item 0 (java/lang/reflect/WildcardType::getUpperBounds reflection))]
(^.template [<pattern> <kind>]
[<pattern>
(case (ffi.as java/lang/reflect/GenericArrayType bound)
diff --git a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux
index 95915309c..6d7804b9a 100644
--- a/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux
+++ b/stdlib/source/library/lux/tool/compiler/language/lux/phase/extension/analysis/jvm.lux
@@ -65,7 +65,9 @@
["/[1]" // "_"
[generation
[jvm
- ["[0]" runtime]]]
+ ["[0]" runtime]
+ ["[0]" function "_"
+ ["[1]" abstract]]]]
["/[1]" // "_"
["[0]" generation]
["[0]" directive]
@@ -387,6 +389,9 @@
[(reflection.reflection reflection.char) [box.char jvm.char]])
(dictionary.of_list text.hash)))
+(template: (lux_array_type :read: :write:)
+ [{.#Primitive (static array.type_name) (list {.#Apply :write: {.#Apply :read: _Mutable}})}])
+
(def: (jvm_type luxT)
(-> .Type (Operation (Type Value)))
(case luxT
@@ -401,7 +406,7 @@
{.#None}
(/////analysis.except ..non_jvm_type luxT))
- (pattern {.#Primitive (static array.type_name) (list elemT)})
+ (pattern (lux_array_type elemT _))
(phase#each jvm.array (jvm_type elemT))
{.#Primitive class parametersT}
@@ -432,6 +437,9 @@
{.#Ex _}
(phase#in (jvm.class ..object_class (list)))
+
+ {.#Function _}
+ (phase#in function.class)
_
(/////analysis.except ..non_jvm_type luxT)))
@@ -467,13 +475,16 @@
(case args
(pattern (list arrayC))
(<| typeA.with_var
- (function (_ [@var :var:]))
+ (function (_ [@read :read:]))
+ typeA.with_var
+ (function (_ [@write :write:]))
(do phase.monad
[_ (typeA.inference ..int)
- arrayA (<| (typeA.expecting (.type (array.Array :var:)))
+ arrayA (<| (typeA.expecting (.type (array.Array' :read: :write:)))
(analyse archive arrayC))
- :var: (typeA.check (check.clean (list) :var:))
- arrayJT (jvm_array_type (.type (array.Array :var:)))]
+ :read: (typeA.check (check.clean (list) :read:))
+ :write: (typeA.check (check.clean (list) :write:))
+ arrayJT (jvm_array_type (.type (array.Array' :read: :write:)))]
(in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT))
arrayA)})))
@@ -520,8 +531,7 @@
(def: (check_parameter objectT)
(-> .Type (Operation (Type Parameter)))
(case objectT
- (pattern {.#Primitive (static array.type_name)
- (list elementT)})
+ (pattern (lux_array_type elementT _))
(/////analysis.except ..non_parameter objectT)
{.#Primitive name parameters}
@@ -573,6 +583,9 @@
{.#None}
(/////analysis.except ..non_parameter objectT))
+ {.#Function _}
+ (phase#in function.class)
+
_
(/////analysis.except ..non_parameter objectT)))
@@ -613,9 +626,8 @@
... else
(phase#in (jvm.class name (list)))))
-
- (pattern {.#Primitive (static array.type_name)
- (list elementT)})
+
+ (pattern (lux_array_type elementT _))
(|> elementT
check_jvm
(phase#each jvm.array))
@@ -701,15 +713,18 @@
(case args
(pattern (list idxC arrayC))
(<| typeA.with_var
- (function (_ [@var :var:]))
+ (function (_ [@read :read:]))
+ typeA.with_var
+ (function (_ [@write :write:]))
(do phase.monad
- [_ (typeA.inference :var:)
- arrayA (<| (typeA.expecting (.type (array.Array :var:)))
+ [_ (typeA.inference :read:)
+ arrayA (<| (typeA.expecting (.type (array.Array' :read: :write:)))
(analyse archive arrayC))
- :var: (typeA.check (check.clean (list) :var:))
- arrayJT (jvm_array_type (.type (array.Array :var:)))
idxA (<| (typeA.expecting ..int)
- (analyse archive idxC))]
+ (analyse archive idxC))
+ :read: (typeA.check (check.clean (list) :read:))
+ :write: (typeA.check (check.clean (list) :write:))
+ arrayJT (jvm_array_type (.type (array.Array' :read: :write:)))]
(in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT))
idxA
arrayA)})))
@@ -745,17 +760,20 @@
(case args
(pattern (list idxC valueC arrayC))
(<| typeA.with_var
- (function (_ [@var :var:]))
+ (function (_ [@read :read:]))
+ typeA.with_var
+ (function (_ [@write :write:]))
(do phase.monad
- [_ (typeA.inference (.type (array.Array :var:)))
- arrayA (<| (typeA.expecting (.type (array.Array :var:)))
+ [_ (typeA.inference (.type (array.Array' :read: :write:)))
+ arrayA (<| (typeA.expecting (.type (array.Array' :read: :write:)))
(analyse archive arrayC))
- :var: (typeA.check (check.clean (list) :var:))
- arrayJT (jvm_array_type (.type (array.Array :var:)))
idxA (<| (typeA.expecting ..int)
(analyse archive idxC))
- valueA (<| (typeA.expecting :var:)
- (analyse archive valueC))]
+ valueA (<| (typeA.expecting :write:)
+ (analyse archive valueC))
+ :read: (typeA.check (check.clean (list) :read:))
+ :write: (typeA.check (check.clean (list) :write:))
+ arrayJT (jvm_array_type (.type (array.Array' :read: :write:)))]
(in {/////analysis.#Extension extension_name (list (/////analysis.text (..signature arrayJT))
idxA
valueA
diff --git a/stdlib/source/library/lux/type/variance.lux b/stdlib/source/library/lux/type/variance.lux
index 00d2d931e..93f80356a 100644
--- a/stdlib/source/library/lux/type/variance.lux
+++ b/stdlib/source/library/lux/type/variance.lux
@@ -1,6 +1,8 @@
(.using
- [library
- [lux "*"]])
+ [library
+ [lux "*"
+ [meta
+ ["[0]" symbol]]]])
(type: .public (Co it)
(-> Any it))
@@ -10,3 +12,32 @@
(type: .public (In it)
(-> it it))
+
+(type: .public (Mutable r w)
+ (Primitive "#Mutable" [(-> w r)]))
+
+(template [<name> <type>]
+ [(template: .public (<name> it)
+ [((.is (.All (_ r w) <type>)
+ (.|>> .as_expected))
+ it)])]
+
+ [read (.-> (..Mutable r w) r)]
+ [write (.-> w (..Mutable r w))]
+ )
+
+(type: .public (Read_Only a)
+ (Mutable a Nothing))
+
+(type: .public (Write_Only a)
+ (Mutable Any a))
+
+(template [<name> <type>]
+ [(template: .public (<name> it)
+ [((.is (.All (_ r w) <type>)
+ (.|>>))
+ it)])]
+
+ [read_only (.-> (..Mutable r w) (..Read_Only r))]
+ [write_only (.-> (..Mutable r w) (..Write_Only w))]
+ )
diff --git a/stdlib/source/unsafe/lux/data/collection/array.lux b/stdlib/source/unsafe/lux/data/collection/array.lux
index e66d3ca3b..0a44efcf8 100644
--- a/stdlib/source/unsafe/lux/data/collection/array.lux
+++ b/stdlib/source/unsafe/lux/data/collection/array.lux
@@ -6,17 +6,23 @@
["[0]" functor]]
[data
[collection
- ["[0]" list]]]]])
+ ["[0]" list]]]
+ [type
+ ["[0]" variance]]]])
(def: .public type
"#Array")
-(type: .public (Array a)
- {.#Primitive ..type {.#Item a {.#End}}})
+(template [<item> <array>]
+ [(type: .public <array>
+ {.#Primitive ..type {.#Item <item> {.#End}}})]
+
+ [(variance.Mutable r w) (Array' r w)]
+ [(variance.Mutable a a) (Array a)]
+ )
(with_expansions [<index_type> (.Primitive "java.lang.Long")
- <elem_type> (.Primitive "java.lang.Object")
- <array_type> (.type (..Array <elem_type>))]
+ <item_type> (.Primitive "java.lang.Object")]
(for @.jvm (template: (jvm_int value)
[(.|> value
(.as <index_type>)
@@ -33,7 +39,7 @@
(~~ (.static @.jvm))
(|> (~~ (..jvm_int size))
"jvm array new object"
- (.is <array_type>)
+ (.is (..Array <item_type>))
.as_expected)
(~~ (.static @.js)) ("js array new" size)
@@ -45,14 +51,13 @@
<size>)]))
(`` (template: .public (size <array>)
- [((.is (.All (_ a) (.-> (..Array a) .Nat))
+ [((.is (.All (_ r w) (.-> (..Array' r w) .Nat))
(.function (size array)
(.for (~~ (.static @.old))
("jvm arraylength" array)
(~~ (.static @.jvm))
(.|> array
- (.as <array_type>)
"jvm array length object"
"jvm conversion int-to-long"
"jvm object cast"
@@ -71,8 +76,8 @@
[(<null?> (<read!> index array))])
(`` (template: .public (lacks? <index> <array>)
- [((.is (.All (_ a)
- (.-> .Nat (..Array a) .Bit))
+ [((.is (.All (_ r w)
+ (.-> .Nat (..Array' r w) .Bit))
(.function (lacks? index array)
(.let [size (..size array)]
(.if ("lux i64 <" (.int size) (.int index))
@@ -81,7 +86,6 @@
(~~ (.static @.jvm))
(.|> array
- (.as <array_type>)
("jvm array read object" (~~ (jvm_int index)))
"jvm object null?")
@@ -98,15 +102,14 @@
[(.not (..lacks? index array))])
(`` (template: .public (item <index> <array>)
- [((.is (.All (_ a)
- (.-> .Nat (..Array a) a))
+ [((.is (.All (_ r w)
+ (.-> .Nat (..Array' r w) r))
(.function (item index array)
(.for (~~ (.static @.old))
("jvm aaload" array index)
(~~ (.static @.jvm))
(.|> array
- (.as <array_type>)
("jvm array read object" (~~ (jvm_int index)))
.as_expected)
@@ -119,16 +122,15 @@
<index> <array>)]))
(`` (template: .public (has! <index> <value> <array>)
- [((.is (.All (_ a)
- (.-> .Nat a (..Array a) (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> .Nat w (..Array' r w) (..Array' r w)))
(.function (has! index value array)
(.for (~~ (.static @.old))
("jvm aastore" array index value)
(~~ (.static @.jvm))
(.|> array
- (.as <array_type>)
- ("jvm array write object" (~~ (jvm_int index)) (.as <elem_type> value))
+ ("jvm array write object" (~~ (jvm_int index)) value)
.as_expected)
(~~ (.static @.js)) ("js array write" index value array)
@@ -140,8 +142,8 @@
<index> <value> <array>)]))
(`` (template: .public (lacks! <index> <array>)
- [((.is (.All (_ a)
- (.-> .Nat (..Array a) (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> .Nat (..Array' r w) (..Array' r w)))
(.function (lacks! index array)
(.let [size (..size array)]
(.if ("lux i64 <" (.int size) (.int index))
@@ -149,7 +151,7 @@
(..has! index (.as_expected ("jvm object null")) array)
(~~ (.static @.jvm))
- (..has! index (.as_expected (is <elem_type> ("jvm object null"))) array)
+ (..has! index (.as_expected (is <item_type> ("jvm object null"))) array)
(~~ (.static @.js)) ("js array delete" index array)
(~~ (.static @.python)) ("python array delete" index array)
@@ -162,8 +164,8 @@
)
(template: .public (revised! <index> <$> <array>)
- [((.is (.All (_ a)
- (.-> .Nat (.-> a a) (..Array a) (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> .Nat (.-> r w) (..Array' r w) (..Array' r w)))
(.function (revised! index $ array)
(.if (..lacks? index array)
array
@@ -171,8 +173,8 @@
<index> <$> <array>)])
(template: .public (upsert! <index> <default> <$> <array>)
- [((.is (.All (_ a)
- (.-> .Nat a (.-> a a) (..Array a) (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> .Nat r (.-> r w) (..Array' r w) (..Array' r w)))
(.function (upsert! index default $ array)
(..has! index
($ (.if (..lacks? index array)
@@ -182,9 +184,9 @@
<index> <default> <$> <array>)])
(template: .public (copy! <length> <src_start> <src_array> <dest_start> <dest_array>)
- [((.is (.All (_ a)
- (.-> .Nat .Nat (..Array a) .Nat (..Array a)
- (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> .Nat .Nat (..Array' w .Nothing) .Nat (..Array' r w)
+ (..Array' r w)))
(.function (copy! length src_start src_array dest_start dest_array)
(.loop (again [offset 0])
(.if ("lux i64 <" (.int length) (.int offset))
@@ -200,7 +202,7 @@
(template [<name> <when_lacks> <when_has>]
[(template: .public (<name> <array>)
- [((.is (.All (_ a) (.-> (..Array a) .Nat))
+ [((.is (.All (_ r w) (.-> (..Array' r w) .Nat))
(.function (occupancy array)
(.let [size (..size array)]
(.loop (again [index 0
@@ -217,8 +219,8 @@
)
(template: .public (only! <?> <it>)
- [((.is (.All (_ a)
- (.-> (.-> a .Bit) (..Array a) (..Array a)))
+ [((.is (.All (_ r w)
+ (.-> (.-> r .Bit) (..Array' r w) (..Array' r w)))
(.function (only! ? it)
(.let [size (..size it)]
(.loop (again [index 0])
@@ -235,8 +237,8 @@
(template [<name> <predicate> <test> <type> <term>]
[(template: .public (<name> <?> <it>)
- [((.is (.All (_ a)
- (.-> <predicate> (..Array a) (.Maybe <type>)))
+ [((.is (.All (_ r w)
+ (.-> <predicate> (..Array' r w) (.Maybe <type>)))
(.function (<name> ? it)
(.let [size (..size it)]
(.loop (again [index 0])
@@ -250,8 +252,8 @@
{.#None})))))
<?> <it>)])]
- [example (.-> a .Bit) (? it) a it]
- [example' (.-> Nat a .Bit) (? index it) [Nat a] [index it]]
+ [example (.-> r .Bit) (? it) r it]
+ [example' (.-> Nat r .Bit) (? index it) [Nat r] [index it]]
)
(template: .public (clone <it>)
@@ -283,7 +285,7 @@
(-- 0))
(`` (template: (list|-default <empty> <array>)
- [((.is (.All (_ a) (.-> (.List a) (..Array a) (.List a)))
+ [((.is (.All (_ r w) (.-> (.List r) (..Array' r w) (.List r)))
(.function (list|-default empty array)
(.loop (again [index ("lux i64 -" 1 (..size array))
output empty])
@@ -296,7 +298,7 @@
<empty> <array>)]))
(`` (template: (list|+default <default> <array>)
- [((.is (.All (_ a) (.-> a (..Array a) (.List a)))
+ [((.is (.All (_ r w) (.-> r (..Array' r w) (.List r)))
(.function (list|+default default array)
(.loop (again [index ("lux i64 -" 1 (..size array))
output (`` (.is (.List (~~ (.these (~~ (.type_of default)))))
@@ -311,7 +313,7 @@
<default> <array>)]))
(`` (template: .public (list <default> <array>)
- [((.is (.All (_ a) (.-> (.Maybe a) (..Array a) (.List a)))
+ [((.is (.All (_ r w) (.-> (.Maybe r) (..Array' r w) (.List r)))
(.function (list default array)
(.case default
{.#Some default}
@@ -322,7 +324,7 @@
<default> <array>)]))
(template: .public (= <//#=> <left/*> <right/*>)
- [((.is (.All (_ a) (.-> (.-> a a .Bit) (..Array a) (..Array a) .Bit))
+ [((.is (.All (_ r w0 w1) (.-> (.-> r r .Bit) (..Array' r w0) (..Array' r w1) .Bit))
(.function (= //#= left/* right/*)
(.let [size (..size left/*)]
(.and ("lux i64 =" (..size right/*) size)
@@ -339,7 +341,7 @@
<//#=> <left/*> <right/*>)])
(template: .public (composite <left/*> <right/*>)
- [((.is (.All (_ a) (.-> (..Array a) (..Array a) (..Array a)))
+ [((.is (.All (_ a) (.-> (..Array' a .Nothing) (..Array' a .Nothing) (..Array a)))
(.function (composite left/* right/*)
(.let [|left| (..size left/*)
|right| (..size right/*)]
@@ -349,8 +351,8 @@
<left/*> <right/*>)])
(template: .public (mix <$> <init> <it>)
- [((.is (.All (_ a b)
- (.-> (.-> Nat b a a) a (..Array b) a))
+ [((.is (.All (_ r w s)
+ (.-> (.-> Nat r s s) s (..Array' r w) s))
(.function (mix $ init it)
(.let [size (..size it)]
(.loop (again [index 0
@@ -373,9 +375,9 @@
(template [<name> <init> <op>]
[(template: .public (<name> <?> <it>)
- [((.is (.All (_ a)
- (.-> (.-> a .Bit)
- (.-> (..Array a) .Bit)))
+ [((.is (.All (_ r w)
+ (.-> (.-> r .Bit)
+ (.-> (..Array' r w) .Bit)))
(.function (<name> ? it)
(.let [size (..size it)]
(.loop (again [index 0])
@@ -392,8 +394,8 @@
)
(template: .public (one <?> <it>)
- [((.is (.All (_ a b)
- (.-> (.-> a (.Maybe b)) (..Array a) (.Maybe b)))
+ [((.is (.All (_ r r' w)
+ (.-> (.-> r (.Maybe r')) (..Array' r w) (.Maybe r')))
(.function (one ? it)
(.let [size (..size it)]
(.loop (again [index 0])