From 421e1ef6bf8e4669d1376d6ba15f2167586623a6 Mon Sep 17 00:00:00 2001 From: Zelenya Date: Thu, 16 Jan 2020 17:34:05 +0100 Subject: [PATCH] Add groupBy to Array.NonEmpty --- src/Data/Array/NonEmpty.purs | 12 ++++++++++++ test/Test/Data/Array/NonEmpty.purs | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/Data/Array/NonEmpty.purs b/src/Data/Array/NonEmpty.purs index d987fd8f..d27c0f3d 100644 --- a/src/Data/Array/NonEmpty.purs +++ b/src/Data/Array/NonEmpty.purs @@ -64,6 +64,9 @@ module Data.Array.NonEmpty , dropEnd , dropWhile , span + , group + , group' + , groupBy , nub , nubBy @@ -339,6 +342,15 @@ span -> { init :: Array a, rest :: Array a } span f = adaptAny $ A.span f +group :: forall a. Eq a => NonEmptyArray a -> NonEmptyArray (NonEmptyArray a) +group = unsafeAdapt $ A.group + +group' :: forall a. Ord a => NonEmptyArray a -> NonEmptyArray (NonEmptyArray a) +group' = unsafeAdapt $ A.group' + +groupBy :: forall a. (a -> a -> Boolean) -> NonEmptyArray a -> NonEmptyArray (NonEmptyArray a) +groupBy op = unsafeAdapt $ A.groupBy op + nub :: forall a. Ord a => NonEmptyArray a -> NonEmptyArray a nub = unsafeAdapt A.nub diff --git a/test/Test/Data/Array/NonEmpty.purs b/test/Test/Data/Array/NonEmpty.purs index fbc576fa..c2b170cf 100644 --- a/test/Test/Data/Array/NonEmpty.purs +++ b/test/Test/Data/Array/NonEmpty.purs @@ -234,6 +234,18 @@ testNonEmptyArray = do let oneToSeven = fromArray [1, 2, 3, 4, 5, 6, 7] testSpan { p: (_ < 4), input: oneToSeven, init_: [1, 2, 3], rest_: [4, 5, 6, 7] } + log "group should group consecutive equal elements into arrays" + assert $ NEA.group (fromArray [1, 2, 2, 3, 3, 3, 1]) == fromArray [NEA.singleton 1, fromArray [2, 2], fromArray [3, 3, 3], NEA.singleton 1] + + log "group' should sort then group consecutive equal elements into arrays" + assert $ NEA.group' (fromArray [1, 2, 2, 3, 3, 3, 1]) == fromArray [fromArray [1, 1], fromArray [2, 2], fromArray [3, 3, 3]] + + log "groupBy should group consecutive equal elements into arrays based on an equivalence relation" + assert $ NEA.groupBy (\x y -> odd x && odd y) (fromArray [1, 1, 2, 2, 3, 3]) == fromArray [fromArray [1, 1], NEA.singleton 2, NEA.singleton 2, fromArray [3, 3]] + + log "groupBy should be stable" + assert $ NEA.groupBy (\_ _ -> true) (fromArray [1, 2, 3]) == fromArray [fromArray [1, 2, 3]] + log "nub should remove duplicate elements from the list, keeping the first occurence" assert $ NEA.nub (fromArray [1, 2, 2, 3, 4, 1]) == fromArray [1, 2, 3, 4]