Skip to content

Commit 3c8fd65

Browse files
committed
Add oneOf1 and oneOfMap1 to Data.Semigroup.Foldable
1 parent 8413e6d commit 3c8fd65

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/Data/Semigroup/Foldable.purs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ module Data.Semigroup.Foldable
77
, traverse1_
88
, for1_
99
, sequence1_
10+
, oneOf1
11+
, oneOfMap1
1012
, foldMap1Default
1113
, fold1Default
1214
, fold1DefaultR
@@ -23,7 +25,9 @@ module Data.Semigroup.Foldable
2325

2426
import Prelude
2527

28+
import Control.Alt (class Alt, alt)
2629
import Data.Foldable (class Foldable)
30+
import Data.Monoid.Alternate (Alternate(..))
2731
import Data.Monoid.Dual (Dual(..))
2832
import Data.Monoid.Multiplicative (Multiplicative(..))
2933
import Data.Newtype (ala, alaF)
@@ -117,6 +121,14 @@ for1_ = flip traverse1_
117121
sequence1_ :: forall t f a. Foldable1 t => Apply f => t (f a) -> f Unit
118122
sequence1_ = traverse1_ identity
119123

124+
-- | Combines a non empty collection of elements using the `Alt` operation.
125+
oneOf1 :: forall f g a. Foldable1 f => Alt g => f (g a) -> g a
126+
oneOf1 = foldr1 alt
127+
128+
-- | Folds a non empty structure into some `Alt`.
129+
oneOfMap1 :: forall f g a b. Foldable1 f => Alt g => (a -> g b) -> f a -> g b
130+
oneOfMap1 = alaF Alternate foldMap1
131+
120132
maximum :: forall f a. Ord a => Foldable1 f => f a -> a
121133
maximum = ala Max foldMap1
122134

test/Main.purs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Data.Int (toNumber, pow)
1313
import Data.Maybe (Maybe(..))
1414
import Data.Monoid.Additive (Additive(..))
1515
import Data.Newtype (unwrap)
16-
import Data.Semigroup.Foldable (class Foldable1, foldr1, foldl1, fold1Default, foldr1Default, foldl1Default)
16+
import Data.Semigroup.Foldable (class Foldable1, foldr1, foldl1, fold1Default, foldr1Default, foldl1Default, oneOf1, oneOfMap1)
1717
import Data.Semigroup.Foldable as Foldable1
1818
import Data.Traversable (class Traversable, sequenceDefault, traverse, sequence, traverseDefault)
1919
import Data.TraversableWithIndex (class TraversableWithIndex, traverseWithIndex)
@@ -213,6 +213,13 @@ main = do
213213
(maybeMkNEArray (negate <<< toNumber <$> arrayFrom1UpTo 10)))
214214
== Just (-1.0)
215215

216+
log "Test oneOf1"
217+
assert $ Just "a" == (maybeMkNEArray [Nothing, Just "a", Just "b"] >>= oneOf1)
218+
219+
log "Test oneOfMap1" *> do
220+
let pred n = if n >= 5 then Just n else Nothing
221+
assert $ Just 5 == (maybeMkNEArray [1, 5, 10, 20] >>= oneOfMap1 pred)
222+
216223
log "All done!"
217224

218225

0 commit comments

Comments
 (0)