aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2025-11-15 22:48:06 +0100
committerTom Smeding <tom@tomsmeding.com>2025-11-15 22:48:06 +0100
commite9a0873ceb5c2140dc3331aa8239d511675d55c4 (patch)
tree4101ee16a5f0a0005376008a0956bfbca313b362
parent965ea2fd5aa21e1570f97957ae5613894fe8795d (diff)
README: Document array buffer sharing policy
-rw-r--r--README.md8
-rw-r--r--src/Data/Array/XArray.hs1
2 files changed, 8 insertions, 1 deletions
diff --git a/README.md b/README.md
index 01bcbac..2e24c91 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,14 @@ as precisely as you want to GHC what exactly you're doing.
Below the surface layer, there is a more low-level wrapper (`XArray`) around
`orthotope` that defines a non-nested `Mixed`-style array type.
+**Be aware**: `ox-arrays` attempts to preserve sharing as much as possible.
+That is to say: if a function is able avoid copying array data and return an
+array that references the original underlying `Vector`, it may do so. For
+example, this means that if you convert a nested array to a list of arrays, all
+returned arrays reference part of the original array without copying. This
+makes `mtoList` fast, but also means that memory may be retained longer than
+you might expect.
+
Here is a little taster of the API, to get a sense for the design:
```haskell
diff --git a/src/Data/Array/XArray.hs b/src/Data/Array/XArray.hs
index 6ad48cc..29154f1 100644
--- a/src/Data/Array/XArray.hs
+++ b/src/Data/Array/XArray.hs
@@ -308,7 +308,6 @@ toListOuter (XArray arr@(ORS.A (ORG.A _ t))) =
0 : _ -> []
-- using orthotope's functions here would entail using rerank, which is slow, so we don't
[_] | Refl <- (unsafeCoerceRefl :: sh :~: '[]) -> coerce (map S.scalar $ S.toList arr)
- -- TODO: this shares the backing array among all the results; is that what we want?
n : sh -> coerce $ map (ORG.A sh . OI.indexT t) [0 .. n - 1]
fromList1 :: Storable a => StaticShX '[n] -> [a] -> XArray '[n] a