Skip to content

Commit 6cf5b21

Browse files
committed
clearly indicate unsafety of adapt functions
1 parent 3081380 commit 6cf5b21

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

src/Data/Array/NonEmpty.purs

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ derive newtype instance eq1NonEmptyArray :: Eq1 NonEmptyArray
3232
derive newtype instance ordNonEmptyArray :: Ord a => Ord (NonEmptyArray a)
3333
derive newtype instance ord1NonEmptyArray :: Ord1 NonEmptyArray
3434

35-
3635
derive newtype instance functorNonEmptyArray :: Functor NonEmptyArray
3736
derive newtype instance functorWithIndexNonEmptyArray :: FunctorWithIndex Int NonEmptyArray
3837

@@ -53,19 +52,31 @@ derive newtype instance monadNonEmptyArray :: Monad NonEmptyArray
5352
derive newtype instance altNonEmptyArray :: Alt NonEmptyArray
5453

5554
-- | Internal - adapt an Array transform to NonEmptyArray
56-
adapt :: forall a b. (Array a -> Array b) -> NonEmptyArray a -> NonEmptyArray b
57-
adapt f = NonEmptyArray <<< adaptAny f
55+
--
56+
-- Note that this is unsafe: if the transform returns an empty array, this can
57+
-- explode at runtime.
58+
unsafeAdapt :: forall a b. (Array a -> Array b) -> NonEmptyArray a -> NonEmptyArray b
59+
unsafeAdapt f = NonEmptyArray <<< adaptAny f
5860

5961
-- | Internal - adapt an Array transform with argument to NonEmptyArray
60-
adapt' :: forall a b c. (a -> Array b -> Array c) -> a -> NonEmptyArray b -> NonEmptyArray c
61-
adapt' f = adapt <<< f
62+
--
63+
-- Note that this is unsafe: if the transform returns an empty array, this can
64+
-- explode at runtime.
65+
unsafeAdapt' :: forall a b c. (a -> Array b -> Array c) -> a -> NonEmptyArray b -> NonEmptyArray c
66+
unsafeAdapt' f = unsafeAdapt <<< f
6267

6368
-- | Internal - adapt an Array transform with two arguments to NonEmptyArray
64-
adapt'' :: forall a b c d. (a -> b -> Array c -> Array d) -> a -> b -> NonEmptyArray c -> NonEmptyArray d
65-
adapt'' f = adapt' <<< f
69+
--
70+
-- Note that this is unsafe: if the transform returns an empty array, this can
71+
-- explode at runtime.
72+
unsafeAdapt'' :: forall a b c d. (a -> b -> Array c -> Array d) -> a -> b -> NonEmptyArray c -> NonEmptyArray d
73+
unsafeAdapt'' f = unsafeAdapt' <<< f
6674

6775
-- | Internal - adapt an Array transform to NonEmptyArray,
6876
-- with polymorphic result.
77+
--
78+
-- Note that this is unsafe: if the transform returns an empty array, this can
79+
-- explode at runtime.
6980
adaptAny :: forall a b. (Array a -> b) -> NonEmptyArray a -> b
7081
adaptAny f = f <<< toArray
7182

@@ -130,7 +141,7 @@ length :: forall a. NonEmptyArray a -> Int
130141
length = adaptAny A.length
131142

132143
cons :: forall a. a -> NonEmptyArray a -> NonEmptyArray a
133-
cons = adapt' A.cons
144+
cons = unsafeAdapt' A.cons
134145

135146
infixr 6 cons as :
136147

@@ -141,10 +152,10 @@ appendArray :: forall a. NonEmptyArray a -> Array a -> NonEmptyArray a
141152
appendArray xs ys = unsafeFromArray $ toArray xs <> ys
142153

143154
insert :: forall a. Ord a => a -> NonEmptyArray a -> NonEmptyArray a
144-
insert = adapt' A.insert
155+
insert = unsafeAdapt' A.insert
145156

146157
insertBy :: forall a. (a -> a -> Ordering) -> a -> NonEmptyArray a -> NonEmptyArray a
147-
insertBy = adapt'' A.insertBy
158+
insertBy = unsafeAdapt'' A.insertBy
148159

149160
head :: forall a. NonEmptyArray a -> a
150161
head = adaptMaybe A.head
@@ -197,7 +208,7 @@ alterAt :: forall a. Int -> (a -> Maybe a) -> NonEmptyArray a -> Maybe (Array a)
197208
alterAt i f = A.alterAt i f <<< toArray
198209

199210
reverse :: forall a. NonEmptyArray a -> NonEmptyArray a
200-
reverse = adapt A.reverse
211+
reverse = unsafeAdapt A.reverse
201212

202213
concat :: forall a. NonEmptyArray (NonEmptyArray a) -> NonEmptyArray a
203214
concat = NonEmptyArray <<< A.concat <<< toArray <<< map toArray
@@ -230,19 +241,19 @@ catMaybes :: forall a. NonEmptyArray (Maybe a) -> Array a
230241
catMaybes = adaptAny A.catMaybes
231242

232243
updateAtIndices :: forall t a. Foldable t => t (Tuple Int a) -> NonEmptyArray a -> NonEmptyArray a
233-
updateAtIndices = adapt' A.updateAtIndices
244+
updateAtIndices = unsafeAdapt' A.updateAtIndices
234245

235246
modifyAtIndices :: forall t a. Foldable t => t Int -> (a -> a) -> NonEmptyArray a -> NonEmptyArray a
236-
modifyAtIndices = adapt'' A.modifyAtIndices
247+
modifyAtIndices = unsafeAdapt'' A.modifyAtIndices
237248

238249
sort :: forall a. Ord a => NonEmptyArray a -> NonEmptyArray a
239-
sort = adapt A.sort
250+
sort = unsafeAdapt A.sort
240251

241252
sortBy :: forall a. (a -> a -> Ordering) -> NonEmptyArray a -> NonEmptyArray a
242-
sortBy = adapt' A.sortBy
253+
sortBy = unsafeAdapt' A.sortBy
243254

244255
sortWith :: forall a b. Ord b => (a -> b) -> NonEmptyArray a -> NonEmptyArray a
245-
sortWith = adapt' A.sortWith
256+
sortWith = unsafeAdapt' A.sortWith
246257

247258
slice :: forall a. Int -> Int -> NonEmptyArray a -> Array a
248259
slice = adaptAny'' A.slice
@@ -282,10 +293,10 @@ span = adaptAny' A.span
282293
--groupBy :: forall a. (a -> a -> Boolean) -> NonEmptyArray a -> NonEmptyArray (NonEmptyArray a)
283294

284295
nub :: forall a. Eq a => NonEmptyArray a -> NonEmptyArray a
285-
nub = adapt A.nub
296+
nub = unsafeAdapt A.nub
286297

287298
nubBy :: forall a. (a -> a -> Boolean) -> NonEmptyArray a -> NonEmptyArray a
288-
nubBy = adapt' A.nubBy
299+
nubBy = unsafeAdapt' A.nubBy
289300

290301
delete :: forall a. Eq a => a -> NonEmptyArray a -> Array a
291302
delete = adaptAny' A.delete

0 commit comments

Comments
 (0)