Skip to content

Commit bfc3c23

Browse files
committed
Add generators for date and time types
1 parent d3847b4 commit bfc3c23

File tree

7 files changed

+117
-1
lines changed

7 files changed

+117
-1
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"package.json"
1717
],
1818
"dependencies": {
19-
"purescript-enums": "^3.0.0",
19+
"purescript-enums": "^3.1.0",
2020
"purescript-functions": "^3.0.0",
2121
"purescript-generics": "^4.0.0",
2222
"purescript-integers": "^3.0.0",

src/Data/Date/Component/Gen.purs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module Data.Date.Component.Gen where
2+
3+
import Prelude
4+
import Control.Monad.Gen (class MonadGen, chooseInt)
5+
import Data.Date.Component (Day, Month, Weekday, Year)
6+
import Data.Enum (toEnum)
7+
import Data.Enum.Gen (genBoundedEnum)
8+
import Data.Maybe (fromJust)
9+
import Partial.Unsafe (unsafePartial)
10+
11+
-- | Generates a random `Year` in the range 1900-2100, inclusive.
12+
genYear :: forall m. MonadGen m => m Year
13+
genYear = unsafePartial fromJust <<< toEnum <$> chooseInt 1900 2100
14+
15+
-- | Generates a random `Month` component.
16+
genMonth :: forall m. MonadGen m => m Month
17+
genMonth = genBoundedEnum
18+
19+
-- | Generates a random `Day` component.
20+
genDay :: forall m. MonadGen m => m Day
21+
genDay = genBoundedEnum
22+
23+
-- | Generates a random `Weekday` component.
24+
genWeekday :: forall m. MonadGen m => m Weekday
25+
genWeekday = genBoundedEnum

src/Data/Date/Gen.purs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module Data.Date.Gen
2+
( genDate
3+
, module Data.Date.Component.Gen
4+
) where
5+
6+
import Prelude
7+
import Control.Monad.Gen (class MonadGen)
8+
import Data.Date (Date, canonicalDate)
9+
import Data.Date.Component.Gen (genDay, genMonth, genWeekday, genYear)
10+
11+
-- | Generates a random `Date` between 1st Jan 1900 and 31st Dec 2100,
12+
-- | inclusive.
13+
genDate :: forall m. MonadGen m => m Date
14+
genDate = canonicalDate <$> genYear <*> genMonth <*> genDay

src/Data/DateTime/Gen.purs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Data.DateTime.Gen
2+
( genDateTime
3+
, module Data.Date.Gen
4+
, module Data.Time.Gen
5+
) where
6+
7+
import Prelude
8+
import Control.Monad.Gen (class MonadGen)
9+
import Data.Date.Gen (genDate, genDay, genMonth, genWeekday, genYear)
10+
import Data.DateTime (DateTime(..))
11+
import Data.Time.Gen (genHour, genMillisecond, genMinute, genSecond, genTime)
12+
13+
-- | Generates a random `DateTime` between 1st Jan 1900 00:00:00 and
14+
-- | 31st Dec 2100 23:59:59, inclusive.
15+
genDateTime :: forall m. MonadGen m => m DateTime
16+
genDateTime = DateTime <$> genDate <*> genTime

src/Data/Time/Component/Gen.purs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module Data.Time.Component.Gen where
2+
3+
import Control.Monad.Gen (class MonadGen)
4+
import Data.Enum.Gen (genBoundedEnum)
5+
import Data.Time.Component (Hour, Millisecond, Minute, Second)
6+
7+
-- | Generates a random `Hour` component.
8+
genHour :: forall m. MonadGen m => m Hour
9+
genHour = genBoundedEnum
10+
11+
-- | Generates a random `Minute` component.
12+
genMinute :: forall m. MonadGen m => m Minute
13+
genMinute = genBoundedEnum
14+
15+
-- | Generates a random `Second` component.
16+
genSecond :: forall m. MonadGen m => m Second
17+
genSecond = genBoundedEnum
18+
19+
-- | Generates a random `Millisecond` component.
20+
genMillisecond :: forall m. MonadGen m => m Millisecond
21+
genMillisecond = genBoundedEnum

src/Data/Time/Duration/Gen.purs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module Data.Time.Duration.Gen where
2+
3+
import Prelude
4+
5+
import Control.Monad.Gen (class MonadGen)
6+
import Control.Monad.Gen as Gen
7+
import Data.Time.Duration (Days(..), Hours(..), Milliseconds(..), Minutes(..), Seconds(..))
8+
9+
-- | Generates a random `Milliseconds` duration, up to 10 minutes.
10+
genMilliseconds :: forall m. MonadGen m => m Milliseconds
11+
genMilliseconds = Milliseconds <$> Gen.chooseFloat 0.0 600000.0
12+
13+
-- | Generates a random `Seconds` duration, up to 10 minutes.
14+
genSeconds :: forall m. MonadGen m => m Seconds
15+
genSeconds = Seconds <$> Gen.chooseFloat 0.0 600.0
16+
17+
-- | Generates a random `Seconds` duration, up to 10 hours.
18+
genMinutes :: forall m. MonadGen m => m Minutes
19+
genMinutes = Minutes <$> Gen.chooseFloat 0.0 600.0
20+
21+
-- | Generates a random `Hours` duration, up to 10 days.
22+
genHours :: forall m. MonadGen m => m Hours
23+
genHours = Hours <$> Gen.chooseFloat 0.0 240.0
24+
25+
-- | Generates a random `Days` duration, up to 6 weeks.
26+
genDays :: forall m. MonadGen m => m Days
27+
genDays = Days <$> Gen.chooseFloat 0.0 42.0

src/Data/Time/Gen.purs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Data.Time.Gen
2+
( genTime
3+
, module Data.Time.Component.Gen
4+
) where
5+
6+
import Prelude
7+
import Control.Monad.Gen (class MonadGen)
8+
import Data.Time (Time(..))
9+
import Data.Time.Component.Gen (genHour, genMillisecond, genMinute, genSecond)
10+
11+
-- | Generates a random `Time` between 00:00:00 and 23:59:59, inclusive.
12+
genTime :: forall m. MonadGen m => m Time
13+
genTime = Time <$> genHour <*> genMinute <*> genSecond <*> genMillisecond

0 commit comments

Comments
 (0)