fluent-effectful 1.0.0 → 1.1.0
raw patch · 5 files changed
+24/−12 lines, 5 filesdep ~fluentdep ~fluent-icusetup-changedPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: fluent, fluent-icu
API changes (from Hackage documentation)
+ Effectful.Fluent.Multi: Bundle :: NonEmpty locale -> [Resource] -> HashMap Identifier ([Pattern] -> HashMap Identifier Value -> Either String Pattern) -> Bool -> Bundle locale
+ Effectful.Fluent.Multi: Cardinal :: Form
+ Effectful.Fluent.Multi: Code :: CurrencyDisplay
+ Effectful.Fluent.Multi: Currency :: Text -> Style
+ Effectful.Fluent.Multi: Decimal :: Style
+ Effectful.Fluent.Multi: Few :: Category
+ Effectful.Fluent.Multi: Isolated :: Pattern -> PatternElement
+ Effectful.Fluent.Multi: Long :: Width
+ Effectful.Fluent.Multi: Many :: Category
+ Effectful.Fluent.Multi: Name :: CurrencyDisplay
+ Effectful.Fluent.Multi: Narrow :: Width
+ Effectful.Fluent.Multi: NumberOptions :: Form -> Style -> CurrencyDisplay -> Width -> Bool -> Int -> Int -> Maybe Int -> Maybe Int -> Maybe Int -> NumberOptions
+ Effectful.Fluent.Multi: Numeric :: Digits
+ Effectful.Fluent.Multi: One :: Category
+ Effectful.Fluent.Multi: Ordinal :: Form
+ Effectful.Fluent.Multi: Other :: Category
+ Effectful.Fluent.Multi: Pattern :: NonEmpty PatternElement -> Pattern
+ Effectful.Fluent.Multi: Percent :: Style
+ Effectful.Fluent.Multi: Reference :: Either String Identifier -> Maybe AttributeAccessor -> HashMap Text Value -> [Override] -> Reference
+ Effectful.Fluent.Multi: Short :: Width
+ Effectful.Fluent.Multi: Symbol :: CurrencyDisplay
+ Effectful.Fluent.Multi: TimeOptions :: Text -> Maybe Bool -> Maybe Width -> Maybe Width -> Maybe Digits -> Maybe (Either Digits Width) -> Maybe Digits -> Maybe Digits -> Maybe Digits -> Maybe Digits -> Maybe Width -> TimeOptions
+ Effectful.Fluent.Multi: Two :: Category
+ Effectful.Fluent.Multi: TwoDigit :: Digits
+ Effectful.Fluent.Multi: Unit :: Text -> Style
+ Effectful.Fluent.Multi: UseIsolating :: Bool -> Override
+ Effectful.Fluent.Multi: Value :: Value -> PatternElement
+ Effectful.Fluent.Multi: WithFunction :: Identifier -> ([Pattern] -> HashMap Identifier Value -> Either String Pattern) -> Override
+ Effectful.Fluent.Multi: Zero :: Category
+ Effectful.Fluent.Multi: [arguments] :: Reference -> HashMap Text Value
+ Effectful.Fluent.Multi: [attribute] :: Reference -> Maybe AttributeAccessor
+ Effectful.Fluent.Multi: [currencyDisplay] :: NumberOptions -> CurrencyDisplay
+ Effectful.Fluent.Multi: [day] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Multi: [era] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Multi: [form] :: NumberOptions -> Form
+ Effectful.Fluent.Multi: [functions] :: Bundle locale -> HashMap Identifier ([Pattern] -> HashMap Identifier Value -> Either String Pattern)
+ Effectful.Fluent.Multi: [hour12] :: TimeOptions -> Maybe Bool
+ Effectful.Fluent.Multi: [hour] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Multi: [locales] :: Bundle locale -> NonEmpty locale
+ Effectful.Fluent.Multi: [maximumFractionDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Multi: [maximumSignificantDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Multi: [minimumFractionDigits] :: NumberOptions -> Int
+ Effectful.Fluent.Multi: [minimumIntegerDigits] :: NumberOptions -> Int
+ Effectful.Fluent.Multi: [minimumSignificantDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Multi: [minute] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Multi: [month] :: TimeOptions -> Maybe (Either Digits Width)
+ Effectful.Fluent.Multi: [name] :: Reference -> Either String Identifier
+ Effectful.Fluent.Multi: [overrides] :: Reference -> [Override]
+ Effectful.Fluent.Multi: [resources] :: Bundle locale -> [Resource]
+ Effectful.Fluent.Multi: [second] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Multi: [style] :: NumberOptions -> Style
+ Effectful.Fluent.Multi: [timeZoneName] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Multi: [timeZone] :: TimeOptions -> Text
+ Effectful.Fluent.Multi: [unitDisplay] :: NumberOptions -> Width
+ Effectful.Fluent.Multi: [useGrouping] :: NumberOptions -> Bool
+ Effectful.Fluent.Multi: [useIsolating] :: Bundle locale -> Bool
+ Effectful.Fluent.Multi: [weekday] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Multi: [year] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Multi: bundle :: NonEmpty locale -> [Resource] -> Bundle locale
+ Effectful.Fluent.Multi: capitalise :: Locale l => l -> Text -> Text
+ Effectful.Fluent.Multi: class Locale l
+ Effectful.Fluent.Multi: class ToValue v
+ Effectful.Fluent.Multi: class Translate r
+ Effectful.Fluent.Multi: data Bundle locale
+ Effectful.Fluent.Multi: data Category
+ Effectful.Fluent.Multi: data CurrencyDisplay
+ Effectful.Fluent.Multi: data Digits
+ Effectful.Fluent.Multi: data Form
+ Effectful.Fluent.Multi: data Identifier
+ Effectful.Fluent.Multi: data NumberOptions
+ Effectful.Fluent.Multi: data Override
+ Effectful.Fluent.Multi: data PatternElement
+ Effectful.Fluent.Multi: data Reference
+ Effectful.Fluent.Multi: data Resource
+ Effectful.Fluent.Multi: data Style
+ Effectful.Fluent.Multi: data TimeOptions
+ Effectful.Fluent.Multi: data Value
+ Effectful.Fluent.Multi: data Width
+ Effectful.Fluent.Multi: displayLanguage :: Locale l => l -> l -> Maybe Text
+ Effectful.Fluent.Multi: fluent :: QuasiQuoter
+ Effectful.Fluent.Multi: formatNumber :: Locale l => NonEmpty l -> Scientific -> NumberOptions -> Either String Text
+ Effectful.Fluent.Multi: formatTime :: Locale l => NonEmpty l -> UTCTime -> TimeOptions -> Either String Text
+ Effectful.Fluent.Multi: fromCode :: Locale l => Text -> Maybe l
+ Effectful.Fluent.Multi: localDisplayLanguage :: Locale l => l -> Maybe Text
+ Effectful.Fluent.Multi: messageIdentifiers :: FilePath -> DecsQ
+ Effectful.Fluent.Multi: newtype Pattern
+ Effectful.Fluent.Multi: numberOptions :: NumberOptions
+ Effectful.Fluent.Multi: parseResource :: Text -> Either String Resource
+ Effectful.Fluent.Multi: parseResourceLenient :: Text -> Resource
+ Effectful.Fluent.Multi: pluralCategory :: Locale l => l -> Scientific -> NumberOptions -> Category
+ Effectful.Fluent.Multi: timeOptions :: TimeOptions
+ Effectful.Fluent.Multi: toCode :: Locale l => l -> Text
+ Effectful.Fluent.Multi: toValue :: ToValue v => v -> Value
+ Effectful.Fluent.Multi: translate :: Translate r => Reference -> r
+ Effectful.Fluent.Single: Bundle :: NonEmpty locale -> [Resource] -> HashMap Identifier ([Pattern] -> HashMap Identifier Value -> Either String Pattern) -> Bool -> Bundle locale
+ Effectful.Fluent.Single: Cardinal :: Form
+ Effectful.Fluent.Single: Code :: CurrencyDisplay
+ Effectful.Fluent.Single: Currency :: Text -> Style
+ Effectful.Fluent.Single: Decimal :: Style
+ Effectful.Fluent.Single: Few :: Category
+ Effectful.Fluent.Single: Isolated :: Pattern -> PatternElement
+ Effectful.Fluent.Single: Long :: Width
+ Effectful.Fluent.Single: Many :: Category
+ Effectful.Fluent.Single: Name :: CurrencyDisplay
+ Effectful.Fluent.Single: Narrow :: Width
+ Effectful.Fluent.Single: NumberOptions :: Form -> Style -> CurrencyDisplay -> Width -> Bool -> Int -> Int -> Maybe Int -> Maybe Int -> Maybe Int -> NumberOptions
+ Effectful.Fluent.Single: Numeric :: Digits
+ Effectful.Fluent.Single: One :: Category
+ Effectful.Fluent.Single: Ordinal :: Form
+ Effectful.Fluent.Single: Other :: Category
+ Effectful.Fluent.Single: Pattern :: NonEmpty PatternElement -> Pattern
+ Effectful.Fluent.Single: Percent :: Style
+ Effectful.Fluent.Single: Reference :: Either String Identifier -> Maybe AttributeAccessor -> HashMap Text Value -> [Override] -> Reference
+ Effectful.Fluent.Single: Short :: Width
+ Effectful.Fluent.Single: Symbol :: CurrencyDisplay
+ Effectful.Fluent.Single: TimeOptions :: Text -> Maybe Bool -> Maybe Width -> Maybe Width -> Maybe Digits -> Maybe (Either Digits Width) -> Maybe Digits -> Maybe Digits -> Maybe Digits -> Maybe Digits -> Maybe Width -> TimeOptions
+ Effectful.Fluent.Single: Two :: Category
+ Effectful.Fluent.Single: TwoDigit :: Digits
+ Effectful.Fluent.Single: Unit :: Text -> Style
+ Effectful.Fluent.Single: UseIsolating :: Bool -> Override
+ Effectful.Fluent.Single: Value :: Value -> PatternElement
+ Effectful.Fluent.Single: WithFunction :: Identifier -> ([Pattern] -> HashMap Identifier Value -> Either String Pattern) -> Override
+ Effectful.Fluent.Single: Zero :: Category
+ Effectful.Fluent.Single: [arguments] :: Reference -> HashMap Text Value
+ Effectful.Fluent.Single: [attribute] :: Reference -> Maybe AttributeAccessor
+ Effectful.Fluent.Single: [currencyDisplay] :: NumberOptions -> CurrencyDisplay
+ Effectful.Fluent.Single: [day] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Single: [era] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Single: [form] :: NumberOptions -> Form
+ Effectful.Fluent.Single: [functions] :: Bundle locale -> HashMap Identifier ([Pattern] -> HashMap Identifier Value -> Either String Pattern)
+ Effectful.Fluent.Single: [hour12] :: TimeOptions -> Maybe Bool
+ Effectful.Fluent.Single: [hour] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Single: [locales] :: Bundle locale -> NonEmpty locale
+ Effectful.Fluent.Single: [maximumFractionDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Single: [maximumSignificantDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Single: [minimumFractionDigits] :: NumberOptions -> Int
+ Effectful.Fluent.Single: [minimumIntegerDigits] :: NumberOptions -> Int
+ Effectful.Fluent.Single: [minimumSignificantDigits] :: NumberOptions -> Maybe Int
+ Effectful.Fluent.Single: [minute] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Single: [month] :: TimeOptions -> Maybe (Either Digits Width)
+ Effectful.Fluent.Single: [name] :: Reference -> Either String Identifier
+ Effectful.Fluent.Single: [overrides] :: Reference -> [Override]
+ Effectful.Fluent.Single: [resources] :: Bundle locale -> [Resource]
+ Effectful.Fluent.Single: [second] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Single: [style] :: NumberOptions -> Style
+ Effectful.Fluent.Single: [timeZoneName] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Single: [timeZone] :: TimeOptions -> Text
+ Effectful.Fluent.Single: [unitDisplay] :: NumberOptions -> Width
+ Effectful.Fluent.Single: [useGrouping] :: NumberOptions -> Bool
+ Effectful.Fluent.Single: [useIsolating] :: Bundle locale -> Bool
+ Effectful.Fluent.Single: [weekday] :: TimeOptions -> Maybe Width
+ Effectful.Fluent.Single: [year] :: TimeOptions -> Maybe Digits
+ Effectful.Fluent.Single: bundle :: NonEmpty locale -> [Resource] -> Bundle locale
+ Effectful.Fluent.Single: capitalise :: Locale l => l -> Text -> Text
+ Effectful.Fluent.Single: class Locale l
+ Effectful.Fluent.Single: class ToValue v
+ Effectful.Fluent.Single: class Translate r
+ Effectful.Fluent.Single: data Bundle locale
+ Effectful.Fluent.Single: data Category
+ Effectful.Fluent.Single: data CurrencyDisplay
+ Effectful.Fluent.Single: data Digits
+ Effectful.Fluent.Single: data Form
+ Effectful.Fluent.Single: data Identifier
+ Effectful.Fluent.Single: data NumberOptions
+ Effectful.Fluent.Single: data Override
+ Effectful.Fluent.Single: data PatternElement
+ Effectful.Fluent.Single: data Reference
+ Effectful.Fluent.Single: data Resource
+ Effectful.Fluent.Single: data Style
+ Effectful.Fluent.Single: data TimeOptions
+ Effectful.Fluent.Single: data Value
+ Effectful.Fluent.Single: data Width
+ Effectful.Fluent.Single: displayLanguage :: Locale l => l -> l -> Maybe Text
+ Effectful.Fluent.Single: fluent :: QuasiQuoter
+ Effectful.Fluent.Single: formatNumber :: Locale l => NonEmpty l -> Scientific -> NumberOptions -> Either String Text
+ Effectful.Fluent.Single: formatTime :: Locale l => NonEmpty l -> UTCTime -> TimeOptions -> Either String Text
+ Effectful.Fluent.Single: fromCode :: Locale l => Text -> Maybe l
+ Effectful.Fluent.Single: localDisplayLanguage :: Locale l => l -> Maybe Text
+ Effectful.Fluent.Single: messageIdentifiers :: FilePath -> DecsQ
+ Effectful.Fluent.Single: newtype Pattern
+ Effectful.Fluent.Single: numberOptions :: NumberOptions
+ Effectful.Fluent.Single: parseResource :: Text -> Either String Resource
+ Effectful.Fluent.Single: parseResourceLenient :: Text -> Resource
+ Effectful.Fluent.Single: pluralCategory :: Locale l => l -> Scientific -> NumberOptions -> Category
+ Effectful.Fluent.Single: timeOptions :: TimeOptions
+ Effectful.Fluent.Single: toCode :: Locale l => l -> Text
+ Effectful.Fluent.Single: toValue :: ToValue v => v -> Value
+ Effectful.Fluent.Single: translate :: Translate r => Reference -> r
Files
- CHANGELOG.md +12/−0
- Setup.hs +0/−2
- fluent-effectful.cabal +3/−3
- src/Effectful/Fluent/Multi.hs +4/−4
- src/Effectful/Fluent/Single.hs +5/−3
CHANGELOG.md view
@@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/). +## [1.1.0] - 2026-10-20++### Changed++- **Breaking:** `fluent` 1.1.0 breaking changes:+ - `SomeValue` is now `Value`.+ - The `Value` class is now `ToValue`.+ - Constructors are used qualified: `Value.String`, `Value.Number`, `Value.Time`.+ - `CustomValue` and `ToValue.format` are replaced by `Value.Formatted`.+ - The `fluent` quasi-quoter and `messageIdentifiers` fail to compile on a syntax error.+ - `parseResource` fails on a syntax error. `parseResourceLenient` returns a `JunkEntry` instead.+ ## [1.0.0] - 2026-10-01 ### Added
− Setup.hs
@@ -1,2 +0,0 @@-import Distribution.Simple-main = defaultMain
fluent-effectful.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: fluent-effectful-version: 1.0.0+version: 1.1.0 category: Language synopsis: Fluent effect for Effectful description:@@ -71,7 +71,7 @@ Effectful.Fluent.Single build-depends:- fluent >=1.0 && <1.1,+ fluent >=1.1 && <1.2, unordered-containers >=0.2 && <0.3, test-suite test@@ -83,7 +83,7 @@ build-tool-depends: hspec-effectful-discover:hspec-effectful-discover build-depends: fluent-effectful,- fluent-icu >=1.0 && <1.1,+ fluent-icu >=1.1 && <1.2, hspec-effectful >=1.0 && <1.2, other-modules:
src/Effectful/Fluent/Multi.hs view
@@ -25,10 +25,10 @@ -- > let enRes = [fluent|welcome = Welcome, { $name }|] -- > deRes = [fluent|welcome = Willkommen, { $name }|] ----- Or parse Fluent source at runtime with 'parseResource':+-- Or parse Fluent source at runtime with 'parseResource' or 'parseResourceLenient': -- -- > enRes <- either fail pure . parseResource =<< Text.readFile "en-GB.ftl"--- > deRes <- either fail pure . parseResource =<< Text.readFile "de-CH.ftl"+-- > deRes <- parseResourceLenient <$> Text.readFile "de-CH.ftl" -- -- == 2. Building bundles --@@ -47,9 +47,9 @@ -- -- > main :: IO () -- > main = runEff . runFluent [english, swiss] $ do--- > translate "welcome" ("name", value @Text "Ann") enGB >>= liftIO . print+-- > translate "welcome" ("name", "Ann") enGB >>= liftIO . print -- > -- Right "Welcome, Ann"--- > translate "welcome" ("name", value @Text "Ann") deCH >>= liftIO . print+-- > translate "welcome" ("name", "Ann") deCH >>= liftIO . print -- > -- Right "Willkommen, Ann" module Effectful.Fluent.Multi ( -- * Effect
src/Effectful/Fluent/Single.hs view
@@ -28,10 +28,12 @@ -- > welcome = Welcome, { $name } -- > |] ----- Or parse Fluent source at runtime with 'parseResource':+-- Or parse Fluent source at runtime with 'parseResource' or 'parseResourceLenient': ----- > resource <- either fail pure . parseResource =<< Text.readFile "en-GB.ftl"+-- > resource <- parseResourceLenient <$> Text.readFile "en-GB.ftl" --+-- A syntax error fails the whole file. 'parseResourceLenient' returns a 'JunkEntry' instead.+-- -- == 2. Building bundles -- -- Combine 'Resource's and 'Locale's into a 'Bundle' using 'bundle':@@ -46,7 +48,7 @@ -- > main = runEff . runFluent english $ do -- > translate "greeting" >>= liftIO . print -- > -- Right "Hello!"--- > translate "welcome" ("name", value @Text "Ann") >>= liftIO . print+-- > translate "welcome" ("name", "Ann") >>= liftIO . print -- > -- Right "Welcome, Ann" module Effectful.Fluent.Single ( -- * Effect