From bfc3c23d6492ec380df01e96ddbdbe76df4f3612 Mon Sep 17 00:00:00 2001 From: Gary Burgess Date: Thu, 8 Jun 2017 14:37:55 +0100 Subject: [PATCH] Add generators for date and time types --- bower.json | 2 +- src/Data/Date/Component/Gen.purs | 25 +++++++++++++++++++++++++ src/Data/Date/Gen.purs | 14 ++++++++++++++ src/Data/DateTime/Gen.purs | 16 ++++++++++++++++ src/Data/Time/Component/Gen.purs | 21 +++++++++++++++++++++ src/Data/Time/Duration/Gen.purs | 27 +++++++++++++++++++++++++++ src/Data/Time/Gen.purs | 13 +++++++++++++ 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/Data/Date/Component/Gen.purs create mode 100644 src/Data/Date/Gen.purs create mode 100644 src/Data/DateTime/Gen.purs create mode 100644 src/Data/Time/Component/Gen.purs create mode 100644 src/Data/Time/Duration/Gen.purs create mode 100644 src/Data/Time/Gen.purs diff --git a/bower.json b/bower.json index 0bce8fb..cbdaf33 100644 --- a/bower.json +++ b/bower.json @@ -16,7 +16,7 @@ "package.json" ], "dependencies": { - "purescript-enums": "^3.0.0", + "purescript-enums": "^3.1.0", "purescript-functions": "^3.0.0", "purescript-generics": "^4.0.0", "purescript-integers": "^3.0.0", diff --git a/src/Data/Date/Component/Gen.purs b/src/Data/Date/Component/Gen.purs new file mode 100644 index 0000000..fb5fb80 --- /dev/null +++ b/src/Data/Date/Component/Gen.purs @@ -0,0 +1,25 @@ +module Data.Date.Component.Gen where + +import Prelude +import Control.Monad.Gen (class MonadGen, chooseInt) +import Data.Date.Component (Day, Month, Weekday, Year) +import Data.Enum (toEnum) +import Data.Enum.Gen (genBoundedEnum) +import Data.Maybe (fromJust) +import Partial.Unsafe (unsafePartial) + +-- | Generates a random `Year` in the range 1900-2100, inclusive. +genYear :: forall m. MonadGen m => m Year +genYear = unsafePartial fromJust <<< toEnum <$> chooseInt 1900 2100 + +-- | Generates a random `Month` component. +genMonth :: forall m. MonadGen m => m Month +genMonth = genBoundedEnum + +-- | Generates a random `Day` component. +genDay :: forall m. MonadGen m => m Day +genDay = genBoundedEnum + +-- | Generates a random `Weekday` component. +genWeekday :: forall m. MonadGen m => m Weekday +genWeekday = genBoundedEnum diff --git a/src/Data/Date/Gen.purs b/src/Data/Date/Gen.purs new file mode 100644 index 0000000..6709a40 --- /dev/null +++ b/src/Data/Date/Gen.purs @@ -0,0 +1,14 @@ +module Data.Date.Gen + ( genDate + , module Data.Date.Component.Gen + ) where + +import Prelude +import Control.Monad.Gen (class MonadGen) +import Data.Date (Date, canonicalDate) +import Data.Date.Component.Gen (genDay, genMonth, genWeekday, genYear) + +-- | Generates a random `Date` between 1st Jan 1900 and 31st Dec 2100, +-- | inclusive. +genDate :: forall m. MonadGen m => m Date +genDate = canonicalDate <$> genYear <*> genMonth <*> genDay diff --git a/src/Data/DateTime/Gen.purs b/src/Data/DateTime/Gen.purs new file mode 100644 index 0000000..717d37a --- /dev/null +++ b/src/Data/DateTime/Gen.purs @@ -0,0 +1,16 @@ +module Data.DateTime.Gen + ( genDateTime + , module Data.Date.Gen + , module Data.Time.Gen + ) where + +import Prelude +import Control.Monad.Gen (class MonadGen) +import Data.Date.Gen (genDate, genDay, genMonth, genWeekday, genYear) +import Data.DateTime (DateTime(..)) +import Data.Time.Gen (genHour, genMillisecond, genMinute, genSecond, genTime) + +-- | Generates a random `DateTime` between 1st Jan 1900 00:00:00 and +-- | 31st Dec 2100 23:59:59, inclusive. +genDateTime :: forall m. MonadGen m => m DateTime +genDateTime = DateTime <$> genDate <*> genTime diff --git a/src/Data/Time/Component/Gen.purs b/src/Data/Time/Component/Gen.purs new file mode 100644 index 0000000..79b4de0 --- /dev/null +++ b/src/Data/Time/Component/Gen.purs @@ -0,0 +1,21 @@ +module Data.Time.Component.Gen where + +import Control.Monad.Gen (class MonadGen) +import Data.Enum.Gen (genBoundedEnum) +import Data.Time.Component (Hour, Millisecond, Minute, Second) + +-- | Generates a random `Hour` component. +genHour :: forall m. MonadGen m => m Hour +genHour = genBoundedEnum + +-- | Generates a random `Minute` component. +genMinute :: forall m. MonadGen m => m Minute +genMinute = genBoundedEnum + +-- | Generates a random `Second` component. +genSecond :: forall m. MonadGen m => m Second +genSecond = genBoundedEnum + +-- | Generates a random `Millisecond` component. +genMillisecond :: forall m. MonadGen m => m Millisecond +genMillisecond = genBoundedEnum diff --git a/src/Data/Time/Duration/Gen.purs b/src/Data/Time/Duration/Gen.purs new file mode 100644 index 0000000..84d350e --- /dev/null +++ b/src/Data/Time/Duration/Gen.purs @@ -0,0 +1,27 @@ +module Data.Time.Duration.Gen where + +import Prelude + +import Control.Monad.Gen (class MonadGen) +import Control.Monad.Gen as Gen +import Data.Time.Duration (Days(..), Hours(..), Milliseconds(..), Minutes(..), Seconds(..)) + +-- | Generates a random `Milliseconds` duration, up to 10 minutes. +genMilliseconds :: forall m. MonadGen m => m Milliseconds +genMilliseconds = Milliseconds <$> Gen.chooseFloat 0.0 600000.0 + +-- | Generates a random `Seconds` duration, up to 10 minutes. +genSeconds :: forall m. MonadGen m => m Seconds +genSeconds = Seconds <$> Gen.chooseFloat 0.0 600.0 + +-- | Generates a random `Seconds` duration, up to 10 hours. +genMinutes :: forall m. MonadGen m => m Minutes +genMinutes = Minutes <$> Gen.chooseFloat 0.0 600.0 + +-- | Generates a random `Hours` duration, up to 10 days. +genHours :: forall m. MonadGen m => m Hours +genHours = Hours <$> Gen.chooseFloat 0.0 240.0 + +-- | Generates a random `Days` duration, up to 6 weeks. +genDays :: forall m. MonadGen m => m Days +genDays = Days <$> Gen.chooseFloat 0.0 42.0 diff --git a/src/Data/Time/Gen.purs b/src/Data/Time/Gen.purs new file mode 100644 index 0000000..1aa5bb3 --- /dev/null +++ b/src/Data/Time/Gen.purs @@ -0,0 +1,13 @@ +module Data.Time.Gen + ( genTime + , module Data.Time.Component.Gen + ) where + +import Prelude +import Control.Monad.Gen (class MonadGen) +import Data.Time (Time(..)) +import Data.Time.Component.Gen (genHour, genMillisecond, genMinute, genSecond) + +-- | Generates a random `Time` between 00:00:00 and 23:59:59, inclusive. +genTime :: forall m. MonadGen m => m Time +genTime = Time <$> genHour <*> genMinute <*> genSecond <*> genMillisecond