string-interpolate 0.3.4.0 → 1.0.0.0
raw patch · 4 files changed
+28/−28 lines, 4 filesdep +ghc-hs-metadep −haskell-src-extsdep −haskell-src-metaPVP ok
version bump matches the API change (PVP)
Dependencies added: ghc-hs-meta
Dependencies removed: haskell-src-exts, haskell-src-meta
API changes (from Hackage documentation)
- Data.String.Interpolate.Conversion: proxyWrapper :: forall final flag. IsCustomSink final ~ flag => (Proxy flag -> final) -> final
+ Data.String.Interpolate.Conversion: proxyWrapper :: forall final (flag :: Bool). IsCustomSink final ~ flag => (Proxy flag -> final) -> final
- Data.String.Interpolate.Conversion: type Builder flag dst :: Type;
+ Data.String.Interpolate.Conversion: type Builder (flag :: Bool) dst;
- Data.String.Interpolate.Conversion: type family IsCustomSink dst
+ Data.String.Interpolate.Conversion: type family IsCustomSink dst :: Bool
Files
- CHANGELOG.md +4/−0
- src/lib/Data/String/Interpolate.hs +6/−9
- string-interpolate.cabal +7/−8
- test/spec.hs +11/−11
CHANGELOG.md view
@@ -2,6 +2,10 @@ ## Unreleased +## v1.0.0.0 (2026-08-16)+++ Switch to using `ghc-hs-meta` when parsing interpolations, for faster compile times+ ## v0.3.4.0 (2024-07-09) + Fixed a performance bug causing exponential compilation times when using
src/lib/Data/String/Interpolate.hs view
@@ -62,10 +62,7 @@ import Data.Foldable ( traverse_ ) import Data.List ( intercalate ) -import qualified Language.Haskell.Exts.Extension as Ext-import Language.Haskell.Exts.Parser- ( ParseMode(..), ParseResult(..), defaultParseMode, parseExpWithMode )-import Language.Haskell.Meta ( ToExp(..) )+import Language.Haskell.Meta.Parse ( parseExpWithExts ) import Language.Haskell.TH import Language.Haskell.TH.Quote ( QuasiQuoter(..) ) @@ -275,12 +272,12 @@ reifyExpression :: String -> Q Exp reifyExpression s = do -- We want to explicitly use whatever extensions are enabled in current module- exts <- (fmap . fmap) (Ext.parseExtension . show) extsEnabled- parseMode <- pure (defaultParseMode { extensions = exts })- case parseExpWithMode parseMode s of- ParseFailed _ err -> fail $+ exts <- extsEnabled+ case parseExpWithExts exts s of+ Left (_, _, err) -> fail $ "Data.String.Interpolate.i: got error: '" ++ err ++ "' while parsing expression: " ++ s- ParseOk e -> pure (toExp e)+ Right e ->+ pure e reportIndentWarning :: IndentWarning -> Q () reportIndentWarning (IndentWarning line base) = do
string-interpolate.cabal view
@@ -1,7 +1,7 @@ cabal-version: 1.18 name: string-interpolate-version: 0.3.4.0+version: 1.0.0.0 synopsis: Haskell string/text/bytestring interpolation that just works description: Unicode-aware string interpolation that handles all textual types. .@@ -74,9 +74,8 @@ , bytestring <0.13 , text <2.2 , split <0.3- , haskell-src-exts <1.24- , haskell-src-meta <0.9- , template-haskell <2.22+ , ghc-hs-meta <0.2+ , template-haskell <2.25 , text-conversions <0.4 , utf8-string <1.1 default-language: Haskell2010@@ -91,13 +90,13 @@ build-depends: base ==4.* , string-interpolate- , QuickCheck <2.16+ , QuickCheck <2.19 , bytestring <0.13 , text <2.2- , template-haskell <2.22+ , template-haskell <2.25 , hspec ==2.* , hspec-core ==2.*- , quickcheck-instances <0.4+ , quickcheck-instances <0.5 , quickcheck-text <0.2 , quickcheck-unicode <1.1 , unordered-containers <0.3@@ -112,7 +111,7 @@ build-depends: base ==4.* , string-interpolate- , QuickCheck <2.16+ , QuickCheck <2.19 , bytestring <0.13 , text <2.2 , deepseq <1.6
test/spec.hs view
@@ -3,14 +3,14 @@ {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PackageImports #-} {-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE LambdaCase #-} import qualified Data.ByteString as B import qualified Data.ByteString.Builder as LB@@ -18,7 +18,7 @@ import Data.Char ( chr, isSpace ) import Data.Foldable ( foldMap ) import qualified Data.HashMap.Strict as HM-import Data.List ( sort, intersperse )+import Data.List ( intersperse, sort ) import Data.Semigroup import qualified Data.Text as T import qualified Data.Text.Lazy as LT@@ -30,18 +30,18 @@ import Control.Monad.IO.Class ( liftIO ) import "hspec" Test.Hspec-import "hspec" Test.Hspec.QuickCheck import "hspec-core" Test.Hspec.Core.Runner+import "hspec" Test.Hspec.QuickCheck import "QuickCheck" Test.QuickCheck import "quickcheck-instances" Test.QuickCheck.Instances.ByteString () import "QuickCheck" Test.QuickCheck.Monadic import "quickcheck-unicode" Test.QuickCheck.Unicode -import Data.String.Interpolate ( i, iii, __i, __i'E, __i'L, iii'E, iii'L )+import Data.String.Interpolate ( __i, __i'E, __i'L, i, iii, iii'E, iii'L ) import Data.String.Interpolate.Conversion hiding- ( build, finalize, interpolate, ofString, chompSpaces )-import Data.String.Interpolate.Types ( InterpSegment(..) )-import Data.String.Interpolate.Parse ( parseInterpSegments )+ ( build, chompSpaces, finalize, interpolate, ofString )+import Data.String.Interpolate.Parse ( parseInterpSegments )+import Data.String.Interpolate.Types ( InterpSegment(..) ) main :: IO () main = hspecWith testConfig $ parallel $ do@@ -535,10 +535,10 @@ , Tabs <$> arbitrary ] - shrink (Verbatim t) = Verbatim <$> shrink t+ shrink (Verbatim t) = Verbatim <$> shrink t shrink (Expression t) = []- shrink (Spaces n) = [Spaces (n `div` 2), Spaces (n-1)]- shrink (Tabs n) = [Tabs (n `div` 2), Tabs (n-1)]+ shrink (Spaces n) = [Spaces (n `div` 2), Spaces (n-1)]+ shrink (Tabs n) = [Tabs (n `div` 2), Tabs (n-1)] charFrequencies :: T.Text -> HM.HashMap Char Int charFrequencies = T.foldl' (flip $ HM.alter increment) HM.empty . T.filter (not . isSpace)