From f7d9e213d5c974668e855bf0fff862daef47191b Mon Sep 17 00:00:00 2001 From: Blugatroff <51498987+Blugatroff@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:49:49 +0100 Subject: [PATCH 1/3] Add length to Data.Array.ST --- src/Data/Array/ST.js | 6 ++++++ src/Data/Array/ST.purs | 7 +++++++ test/Test/Data/Array/ST.purs | 17 +++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/Data/Array/ST.js b/src/Data/Array/ST.js index 57709b79..24267de7 100644 --- a/src/Data/Array/ST.js +++ b/src/Data/Array/ST.js @@ -27,6 +27,12 @@ export const poke = function (i) { }; }; +export const lengthImpl = function (xs) { + return function () { + return xs.length; + }; +}; + export const popImpl = function (just) { return function (nothing) { return function (xs) { diff --git a/src/Data/Array/ST.purs b/src/Data/Array/ST.purs index 2817bee6..9df7cebd 100644 --- a/src/Data/Array/ST.purs +++ b/src/Data/Array/ST.purs @@ -11,6 +11,7 @@ module Data.Array.ST , peek , poke , modify + , length , pop , push , pushAll @@ -149,6 +150,12 @@ foreign import peekImpl -- | Change the value at the specified index in a mutable array. foreign import poke :: forall h a. Int -> a -> STArray h a -> ST h Boolean +-- | Get the number of elements in a mutable array. +length :: forall h a. STArray h a -> ST h Int +length = lengthImpl + +foreign import lengthImpl :: forall h a. STArray h a -> ST h Int + -- | Remove the last element from an array and return that element. pop :: forall h a. STArray h a -> ST h (Maybe a) pop = popImpl Just Nothing diff --git a/test/Test/Data/Array/ST.purs b/test/Test/Data/Array/ST.purs index 8a83cd99..6e42fc2f 100644 --- a/test/Test/Data/Array/ST.purs +++ b/test/Test/Data/Array/ST.purs @@ -49,6 +49,23 @@ testArrayST = do assert $ STA.run (STA.unsafeThaw [1, 2, 3]) == [1, 2, 3] + log "length should return the number of items in an STArray" + + assert $ ST.run (do + arr <- STA.thaw nil + length <- STA.length arr + pure $ length == 0) + + assert $ ST.run (do + arr <- STA.thaw [1] + length <- STA.length arr + pure $ length == 1) + + assert $ ST.run (do + arr <- STA.thaw [1, 2, 3, 4, 5] + length <- STA.length arr + pure $ length == 5) + log "pop should remove elements from an STArray" assert $ STA.run (do From b518e62e1266ac06c0033be50bc50533b18babcb Mon Sep 17 00:00:00 2001 From: Blugatroff <51498987+Blugatroff@users.noreply.github.com> Date: Sun, 15 Jan 2023 00:00:43 +0100 Subject: [PATCH 2/3] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 438b8d07..45640969 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Breaking changes: New features: - Add `prependArray` (#224 by @JordanMartinez) +- Add `Data.Array.ST.length` (#239 by @Blugatroff) Bugfixes: From f65cbf53370c5ae564a7da7277b93d500c48d1ad Mon Sep 17 00:00:00 2001 From: Blugatroff <51498987+Blugatroff@users.noreply.github.com> Date: Mon, 16 Jan 2023 22:56:06 +0100 Subject: [PATCH 3/3] Export foreign function directly instead of using `lengthImpl`. --- src/Data/Array/ST.js | 2 +- src/Data/Array/ST.purs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Data/Array/ST.js b/src/Data/Array/ST.js index 24267de7..7dfff146 100644 --- a/src/Data/Array/ST.js +++ b/src/Data/Array/ST.js @@ -27,7 +27,7 @@ export const poke = function (i) { }; }; -export const lengthImpl = function (xs) { +export const length = function (xs) { return function () { return xs.length; }; diff --git a/src/Data/Array/ST.purs b/src/Data/Array/ST.purs index 9df7cebd..b4e6a87f 100644 --- a/src/Data/Array/ST.purs +++ b/src/Data/Array/ST.purs @@ -151,10 +151,7 @@ foreign import peekImpl foreign import poke :: forall h a. Int -> a -> STArray h a -> ST h Boolean -- | Get the number of elements in a mutable array. -length :: forall h a. STArray h a -> ST h Int -length = lengthImpl - -foreign import lengthImpl :: forall h a. STArray h a -> ST h Int +foreign import length :: forall h a. STArray h a -> ST h Int -- | Remove the last element from an array and return that element. pop :: forall h a. STArray h a -> ST h (Maybe a)