11module Data.Array.NonEmpty
2- ( NonEmptyArray
2+ ( module Data.Array.NonEmpty.Internal
33 , fromArray
44 , fromNonEmpty
55 , toArray
@@ -93,71 +93,27 @@ module Data.Array.NonEmpty
9393
9494import Prelude
9595
96- import Control.Alt (class Alt )
9796import Control.Alternative (class Alternative )
9897import Control.Lazy (class Lazy )
9998import Control.Monad.Rec.Class (class MonadRec )
10099import Data.Array as A
100+ import Data.Array.NonEmpty.Internal (NonEmptyArray )
101101import Data.Bifunctor (bimap )
102- import Data.Eq (class Eq1 )
103102import Data.Foldable (class Foldable )
104- import Data.FoldableWithIndex (class FoldableWithIndex )
105- import Data.FunctorWithIndex (class FunctorWithIndex )
106103import Data.Maybe (Maybe (..), fromJust )
107104import Data.NonEmpty (NonEmpty , (:|))
108- import Data.Ord (class Ord1 )
109- import Data.Semigroup.Foldable (class Foldable1 , foldMap1Default )
110- import Data.Semigroup.Traversable (class Traversable1 , sequence1Default )
111- import Data.Traversable (class Traversable )
112- import Data.TraversableWithIndex (class TraversableWithIndex )
105+ import Data.Semigroup.Foldable (class Foldable1 )
113106import Data.Tuple (Tuple )
114107import Data.Unfoldable (class Unfoldable )
115108import Partial.Unsafe (unsafePartial )
116-
117- newtype NonEmptyArray a = NonEmptyArray (Array a )
118-
119- instance showNonEmptyArray :: Show a => Show (NonEmptyArray a ) where
120- show (NonEmptyArray xs) = " (NonEmptyArray " <> show xs <> " )"
121-
122- derive newtype instance eqNonEmptyArray :: Eq a => Eq (NonEmptyArray a )
123- derive newtype instance eq1NonEmptyArray :: Eq1 NonEmptyArray
124-
125- derive newtype instance ordNonEmptyArray :: Ord a => Ord (NonEmptyArray a )
126- derive newtype instance ord1NonEmptyArray :: Ord1 NonEmptyArray
127-
128- derive newtype instance functorNonEmptyArray :: Functor NonEmptyArray
129- derive newtype instance functorWithIndexNonEmptyArray :: FunctorWithIndex Int NonEmptyArray
130-
131- derive newtype instance foldableNonEmptyArray :: Foldable NonEmptyArray
132- derive newtype instance foldableWithIndexNonEmptyArray :: FoldableWithIndex Int NonEmptyArray
133-
134- instance foldable1NonEmptyArray :: Foldable1 NonEmptyArray where
135- foldMap1 = foldMap1Default
136- fold1 = fold1Impl (<>)
137-
138- derive newtype instance traversableNonEmptyArray :: Traversable NonEmptyArray
139- derive newtype instance traversableWithIndexNonEmptyArray :: TraversableWithIndex Int NonEmptyArray
140-
141- instance traversable1NonEmptyArray :: Traversable1 NonEmptyArray where
142- traverse1 = traverse1Impl apply map
143- sequence1 = sequence1Default
144-
145- derive newtype instance applyNonEmptyArray :: Apply NonEmptyArray
146-
147- derive newtype instance applicativeNonEmptyArray :: Applicative NonEmptyArray
148-
149- derive newtype instance bindNonEmptyArray :: Bind NonEmptyArray
150-
151- derive newtype instance monadNonEmptyArray :: Monad NonEmptyArray
152-
153- derive newtype instance altNonEmptyArray :: Alt NonEmptyArray
109+ import Unsafe.Coerce (unsafeCoerce )
154110
155111-- | Internal - adapt an Array transform to NonEmptyArray
156112--
157113-- Note that this is unsafe: if the transform returns an empty array, this can
158114-- explode at runtime.
159115unsafeAdapt :: forall a b . (Array a -> Array b ) -> NonEmptyArray a -> NonEmptyArray b
160- unsafeAdapt f = NonEmptyArray <<< adaptAny f
116+ unsafeAdapt f = unsafeFromArray <<< adaptAny f
161117
162118-- | Internal - adapt an Array transform to NonEmptyArray,
163119-- with polymorphic result.
@@ -173,18 +129,21 @@ adaptMaybe f = unsafePartial $ fromJust <<< f <<< toArray
173129
174130fromArray :: forall a . Array a -> Maybe (NonEmptyArray a )
175131fromArray xs
176- | A .length xs > 0 = Just (NonEmptyArray xs)
177- | otherwise = Nothing
132+ | A .length xs > 0 = Just (unsafeFromArray xs)
133+ | otherwise = Nothing
178134
179135-- | INTERNAL
180136unsafeFromArray :: forall a . Array a -> NonEmptyArray a
181- unsafeFromArray = NonEmptyArray
137+ unsafeFromArray = unsafeCoerce
138+
139+ unsafeFromArrayF :: forall f a . f (Array a ) -> f (NonEmptyArray a )
140+ unsafeFromArrayF = unsafeCoerce
182141
183142fromNonEmpty :: forall a . NonEmpty Array a -> NonEmptyArray a
184143fromNonEmpty (x :| xs) = cons' x xs
185144
186145toArray :: forall a . NonEmptyArray a -> Array a
187- toArray ( NonEmptyArray xs) = xs
146+ toArray = unsafeCoerce
188147
189148toNonEmpty :: forall a . NonEmptyArray a -> NonEmpty Array a
190149toNonEmpty = uncons >>> \{head: x, tail: xs} -> x :| xs
@@ -199,7 +158,7 @@ toUnfoldable :: forall f a. Unfoldable f => NonEmptyArray a -> f a
199158toUnfoldable = adaptAny A .toUnfoldable
200159
201160singleton :: forall a . a -> NonEmptyArray a
202- singleton = NonEmptyArray <<< A .singleton
161+ singleton = unsafeFromArray <<< A .singleton
203162
204163range :: Int -> Int -> NonEmptyArray Int
205164range x y = unsafeFromArray $ A .range x y
@@ -208,14 +167,14 @@ infix 8 range as ..
208167
209168-- | Replicate an item at least once
210169replicate :: forall a . Int -> a -> NonEmptyArray a
211- replicate i x = NonEmptyArray $ A .replicate (max 1 i) x
170+ replicate i x = unsafeFromArray $ A .replicate (max 1 i) x
212171
213172some
214173 :: forall f a
215174 . Alternative f
216175 => Lazy (f (Array a ))
217176 => f a -> f (NonEmptyArray a )
218- some = map NonEmptyArray <<< A .some
177+ some = unsafeFromArrayF <<< A .some
219178
220179length :: forall a . NonEmptyArray a -> Int
221180length = adaptAny A .length
@@ -279,19 +238,19 @@ findLastIndex :: forall a. (a -> Boolean) -> NonEmptyArray a -> Maybe Int
279238findLastIndex x = adaptAny $ A .findLastIndex x
280239
281240insertAt :: forall a . Int -> a -> NonEmptyArray a -> Maybe (NonEmptyArray a )
282- insertAt i x = map NonEmptyArray <<< A .insertAt i x <<< toArray
241+ insertAt i x = unsafeFromArrayF <<< A .insertAt i x <<< toArray
283242
284243deleteAt :: forall a . Int -> NonEmptyArray a -> Maybe (Array a )
285244deleteAt i = adaptAny $ A .deleteAt i
286245
287246updateAt :: forall a . Int -> a -> NonEmptyArray a -> Maybe (NonEmptyArray a )
288- updateAt i x = map NonEmptyArray <<< A .updateAt i x <<< toArray
247+ updateAt i x = unsafeFromArrayF <<< A .updateAt i x <<< toArray
289248
290249updateAtIndices :: forall t a . Foldable t => t (Tuple Int a ) -> NonEmptyArray a -> NonEmptyArray a
291250updateAtIndices pairs = unsafeAdapt $ A .updateAtIndices pairs
292251
293252modifyAt :: forall a . Int -> (a -> a ) -> NonEmptyArray a -> Maybe (NonEmptyArray a )
294- modifyAt i f = map NonEmptyArray <<< A .modifyAt i f <<< toArray
253+ modifyAt i f = unsafeFromArrayF <<< A .modifyAt i f <<< toArray
295254
296255modifyAtIndices :: forall t a . Foldable t => t Int -> (a -> a ) -> NonEmptyArray a -> NonEmptyArray a
297256modifyAtIndices is f = unsafeAdapt $ A .modifyAtIndices is f
@@ -303,7 +262,7 @@ reverse :: forall a. NonEmptyArray a -> NonEmptyArray a
303262reverse = unsafeAdapt A .reverse
304263
305264concat :: forall a . NonEmptyArray (NonEmptyArray a ) -> NonEmptyArray a
306- concat = NonEmptyArray <<< A .concat <<< toArray <<< map toArray
265+ concat = unsafeFromArray <<< A .concat <<< toArray <<< map toArray
307266
308267concatMap :: forall a b . (a -> NonEmptyArray b ) -> NonEmptyArray a -> NonEmptyArray b
309268concatMap = flip bind
@@ -439,7 +398,7 @@ zipWith
439398 -> NonEmptyArray a
440399 -> NonEmptyArray b
441400 -> NonEmptyArray c
442- zipWith f xs ys = NonEmptyArray $ A .zipWith f (toArray xs) (toArray ys)
401+ zipWith f xs ys = unsafeFromArray $ A .zipWith f (toArray xs) (toArray ys)
443402
444403
445404zipWithA
@@ -449,13 +408,13 @@ zipWithA
449408 -> NonEmptyArray a
450409 -> NonEmptyArray b
451410 -> m (NonEmptyArray c )
452- zipWithA f xs ys = NonEmptyArray <$> A .zipWithA f (toArray xs) (toArray ys)
411+ zipWithA f xs ys = unsafeFromArrayF $ A .zipWithA f (toArray xs) (toArray ys)
453412
454413zip :: forall a b . NonEmptyArray a -> NonEmptyArray b -> NonEmptyArray (Tuple a b )
455- zip xs ys = NonEmptyArray $ toArray xs `A.zip` toArray ys
414+ zip xs ys = unsafeFromArray $ toArray xs `A.zip` toArray ys
456415
457416unzip :: forall a b . NonEmptyArray (Tuple a b ) -> Tuple (NonEmptyArray a ) (NonEmptyArray b )
458- unzip = bimap NonEmptyArray NonEmptyArray <<< A .unzip <<< toArray
417+ unzip = bimap unsafeFromArray unsafeFromArray <<< A .unzip <<< toArray
459418
460419foldM :: forall m a b . Monad m => (a -> b -> m a ) -> a -> NonEmptyArray b -> m a
461420foldM f acc = adaptAny $ A .foldM f acc
@@ -465,14 +424,3 @@ foldRecM f acc = adaptAny $ A.foldRecM f acc
465424
466425unsafeIndex :: forall a . Partial => NonEmptyArray a -> Int -> a
467426unsafeIndex = adaptAny A .unsafeIndex
468-
469- -- we use FFI here to avoid the unnecessary copy created by `tail`
470- foreign import fold1Impl :: forall a . (a -> a -> a ) -> NonEmptyArray a -> a
471-
472- foreign import traverse1Impl
473- :: forall m a b
474- . (forall a' b' . (m (a' -> b' ) -> m a' -> m b' ))
475- -> (forall a' b' . (a' -> b' ) -> m a' -> m b' )
476- -> (a -> m b )
477- -> NonEmptyArray a
478- -> m (NonEmptyArray b )
0 commit comments