yasi 0.0.0.1 → 0.1.0.0
raw patch · 6 files changed
+20/−4 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Yasi.Internal: ShowAbs :: Segment
Files
- CHANGELOG.md +4/−0
- src/Yasi.hs +2/−0
- src/Yasi/Internal.hs +9/−1
- test/Interpolations.hs +2/−2
- test/Segments.hs +2/−0
- yasi.cabal +1/−1
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for yasi +## 0.1.0.0 -- 2021-02-13++ * Support `show` abstractions+ ## 0.0.0.1 -- 2021-02-13 * Support older GHC versions
src/Yasi.hs view
@@ -35,5 +35,7 @@ -- -- >>> let x = 1 + 1 in [i|1 + 1 = ${show x}|] :: ByteString -- "1 + 1 = 2"+-- >>> [i|2 + 2 = $show|] (2 + 2) :: Text+-- "2 + 2 = 4" i :: TH.QuasiQuoter i = interpolator '$' pure pure
src/Yasi/Internal.hs view
@@ -33,11 +33,13 @@ | Var String | ShowVar String | Abs -- idea due to interpolate+ | ShowAbs deriving (Show, Eq, Generic) parseSegments :: MonadFail m => Char -> String -> m [Segment] parseSegments c = fmap (group []) . go where+ -- rewrite this go s | let (lit, rest) = span (/= c) s, not (null lit) = (Lit lit :) <$> go rest | s == "" = pure []@@ -47,6 +49,7 @@ (var, '}' : rest) -> let seg = case var of "" -> Abs+ "show" -> ShowAbs 's' : 'h' : 'o' : 'w' : ' ' : var -> ShowVar var var -> Var var in (seg :) <$> go rest@@ -54,7 +57,9 @@ | _ : v : rest' <- s, isVarStartChar v = let (vs, rest) = span isVarChar rest'- in (Var (v : vs) :) <$> go rest+ var = v : vs+ s = if var == "show" then ShowAbs else Var var+ in (s :) <$> go rest | otherwise = fail $ "invalid char after " <> [c] isVarStartChar v = C.isAscii v && C.isAlpha v isVarChar v = C.isAscii v && (C.isAlphaNum v || v == '_' || v == '\'')@@ -79,6 +84,9 @@ Abs -> do n <- TH.newName "int" pure (TH.VarE n, TH.LamE [TH.VarP n])+ ShowAbs -> do+ n <- TH.newName "showint"+ pure (TH.AppE (TH.VarE 'show) $ TH.VarE n, TH.LamE [TH.VarP n]) prep asg af = do (as, g) <- asg (a, f) <- af
test/Interpolations.hs view
@@ -30,8 +30,8 @@ let p = T.encodeUtf8 "℘" [i|℘$a℘$b℘$c℘|] === p <> a <> p <> T.encodeUtf8 b <> p <> T.encodeUtf8 (T.pack c) <> p, testProperty "abstractions" . property $ do- (a, b) <- (,) <$> forAll genText <*> forAll genText- [i|xxx-${}${}-yyy|] a b === "xxx-" <> a <> b <> "-yyy"+ (a, b) <- (,) <$> forAll genText <*> forAll (Gen.integral $ Range.constant 0 1000)+ [i|xxx-${}$show-yyy|] a (b :: Int) === "xxx-" <> a <> T.pack (show b) <> "-yyy" ] where genString = Gen.string range Gen.unicodeAll
test/Segments.hs view
@@ -21,5 +21,7 @@ ps "${foobar]" @?= Nothing ps "test-$0foo" @?= Nothing ps "${show }" @?= Just [ShowVar ""]+ ps "${show}" @?= Just [ShowAbs]+ ps "$show" @?= Just [ShowAbs] where ps = parseSegments '$'
yasi.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: yasi-version: 0.0.0.1+version: 0.1.0.0 synopsis: Yet another string interpolator description: