Skip to content

Commit

Permalink
Expose the Enumeration APIs from the Unfold module (#2377)
Browse files Browse the repository at this point in the history
Co-authored-by: Harendra Kumar <[email protected]>
  • Loading branch information
rnjtranjan and harendra-kumar authored Jul 20, 2023
1 parent ad19cf7 commit a87bf85
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 74 deletions.
3 changes: 3 additions & 0 deletions core/src/Streamly/Data/Unfold.hs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ module Streamly.Data.Unfold
, replicateM
, iterateM

-- ** Enumeration
, Enumerable (..)

-- ** From Containers
, fromList
, fromListM
Expand Down
35 changes: 5 additions & 30 deletions core/src/Streamly/Internal/Data/Unfold.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,36 +46,7 @@ module Streamly.Internal.Data.Unfold
, iterateM

-- ** Enumerations
, Enumerable (..)

-- ** Enumerate Num
, enumerateFromNum
, enumerateFromThenNum
, enumerateFromStepNum

-- ** Enumerating 'Bounded 'Integral' Types
, enumerateFromIntegralBounded
, enumerateFromThenIntegralBounded
, enumerateFromToIntegralBounded
, enumerateFromThenToIntegralBounded

-- ** Enumerating 'Unounded Integral' Types
, enumerateFromIntegral
, enumerateFromThenIntegral
, enumerateFromToIntegral
, enumerateFromThenToIntegral

-- ** Enumerating 'Small Integral' Types
, enumerateFromSmallBounded
, enumerateFromThenSmallBounded
, enumerateFromToSmall
, enumerateFromThenToSmall

-- ** Enumerating 'Fractional' Types
, enumerateFromFractional
, enumerateFromThenFractional
, enumerateFromToFractional
, enumerateFromThenToFractional
, module Streamly.Internal.Data.Unfold.Enumeration

-- ** From Containers
, fromList
Expand Down Expand Up @@ -210,6 +181,10 @@ import Foreign.Ptr

#include "DocTestDataUnfold.hs"

-------------------------------------------------------------------------------
-- Input operations
-------------------------------------------------------------------------------

-- | Convert an 'Unfold' into an unfold accepting a tuple as an argument,
-- using the argument of the original fold as the second element of tuple and
-- discarding the first element of the tuple.
Expand Down
58 changes: 14 additions & 44 deletions core/src/Streamly/Internal/Data/Unfold/Enumeration.hs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ import Prelude
-- the value overflows it keeps enumerating in a cycle:
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.take 10 $ Stream.unfold Unfold.enumerateFromStepNum (255::Word8,1)
-- >>> Stream.toList $ Stream.take 10 $ Stream.unfold Unfold.enumerateFromStepNum (255::Word8,1)
-- [255,0,1,2,3,4,5,6,7,8]
--
-- @
Expand Down Expand Up @@ -125,7 +125,7 @@ enumerateFromStepNum = Unfold step inject
--
-- Example:
-- @
-- >>> Stream.fold Fold.toList $ Stream.take 10 $ Stream.unfold enumerateFromThenNum (255::Word8,0)
-- >>> Stream.toList $ Stream.take 10 $ Stream.unfold enumerateFromThenNum (255::Word8,0)
-- [255,0,1,2,3,4,5,6,7,8]
--
-- @
Expand All @@ -152,7 +152,7 @@ enumerateFromThenNum =
--
-- @
-- >>> enumerateFromNum = lmap (\from -> (from, 1)) Unfold.enumerateFromStepNum
-- >>> Stream.fold Fold.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
-- >>> Stream.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
-- [0.9,1.9,2.9,3.9,4.9,5.9]
--
-- @
Expand All @@ -162,7 +162,7 @@ enumerateFromThenNum =
--
-- @
-- >>> enumerateFromNum = lmap (\from -> (from, from + 1)) Unfold.enumerateFromThenNum
-- >>> Stream.fold Fold.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
-- >>> Stream.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
-- [0.9,1.9,2.9,3.8999999999999995,4.8999999999999995,5.8999999999999995]
--
-- @
Expand Down Expand Up @@ -284,7 +284,7 @@ enumerateFromThenFractional = enumerateFromThenNum
-- specified upper limit rounded to the nearest integral value:
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromToFractional (0.1, 6.3)
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromToFractional (0.1, 6.3)
-- [0.1,1.1,2.1,3.1,4.1,5.1,6.1]
--
-- @
Expand Down Expand Up @@ -389,24 +389,15 @@ class Enum a => Enumerable a where
-- @from@, enumerating up to 'maxBound' when the type is 'Bounded' or
-- generating an infinite stream when the type is not 'Bounded'.
--
-- >>> import qualified Streamly.Data.Stream as Stream
-- >>> import qualified Streamly.Internal.Data.Unfold as Unfold
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom (0 :: Int)
-- >>> Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom (0 :: Int)
-- [0,1,2,3]
--
-- @
--
-- For 'Fractional' types, enumeration is numerically stable. However, no
-- overflow or underflow checks are performed.
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom 1.1
-- >>> Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom 1.1
-- [1.1,2.1,3.1,4.1]
--
-- @
--
-- /Pre-release/
--
enumerateFrom :: Monad m => Unfold m a a
Expand All @@ -415,27 +406,18 @@ class Enum a => Enumerable a where
-- @from@, enumerating the type up to the value @to@. If @to@ is smaller than
-- @from@ then an empty stream is returned.
--
-- >>> import qualified Streamly.Data.Stream as Stream
-- >>> import qualified Streamly.Internal.Data.Unfold as Unfold
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromTo (0, 4)
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromTo (0, 4)
-- [0,1,2,3,4]
--
-- @
--
-- For 'Fractional' types, the last element is equal to the specified @to@
-- value after rounding to the nearest integral value.
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4)
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4)
-- [1.1,2.1,3.1,4.1]
--
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4.6)
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4.6)
-- [1.1,2.1,3.1,4.1,5.1]
--
-- @
--
-- /Pre-release/
enumerateFromTo :: Monad m => Unfold m (a, a) a

Expand All @@ -445,18 +427,12 @@ class Enum a => Enumerable a where
-- after @from@. For 'Bounded' types the stream ends when 'maxBound' is
-- reached, for unbounded types it keeps enumerating infinitely.
--
-- >>> import qualified Streamly.Data.Stream as Stream
-- >>> import qualified Streamly.Internal.Data.Unfold as Unfold
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0, 2)
-- >>> Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0, 2)
-- [0,2,4,6]
--
-- >>> Stream.fold Fold.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0,(-2))
-- >>> Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0,(-2))
-- [0,-2,-4,-6]
--
-- @
--
-- /Pre-release/
enumerateFromThen :: Monad m => Unfold m (a, a) a

Expand All @@ -465,18 +441,12 @@ class Enum a => Enumerable a where
-- @to@. Enumeration can occur downwards or upwards depending on whether @then@
-- comes before or after @from@.
--
-- >>> import qualified Streamly.Data.Stream as Stream
-- >>> import qualified Streamly.Internal.Data.Unfold as Unfold
--
-- @
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, 2, 6)
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, 2, 6)
-- [0,2,4,6]
--
-- >>> Stream.fold Fold.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, (-2), (-6))
-- >>> Stream.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, (-2), (-6))
-- [0,-2,-4,-6]
--
-- @
--
-- /Pre-release/
enumerateFromThenTo :: Monad m => Unfold m (a, a, a) a

Expand Down

0 comments on commit a87bf85

Please sign in to comment.