packages feed

from-string 1.0.0.1 → 1.0.0.2

raw patch · 4 files changed

+337/−217 lines, 4 filesdep +from-stringdep ~bytestringdep ~rawfilepathdep ~unixPVP ok

version bump matches the API change (PVP)

Dependencies added: from-string

Dependency ranges changed: bytestring, rawfilepath, unix

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -4,6 +4,12 @@  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/). +## 1.0.0.2 - 2025-10-24++### Changed++- Split the test code into ordinary test and code generation test. The code generation test will not be run by default (by Hackage or Stackage, for example).+ ## 1.0.0.1 - 2025-10-24  ### Changed
+ codegen/Main.hs view
@@ -0,0 +1,229 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}++module Main (main) where++import Control.Exception+import Control.Monad (unless)+import Data.ByteString (ByteString)+import qualified Data.ByteString as B+import Data.ByteString.Builder (Builder)+import qualified Data.ByteString.Builder as B+import Data.List (intercalate, intersperse)+import Data.Maybe (fromMaybe)+import RawFilePath+import System.Exit+import System.IO+import System.Posix.Env.ByteString+import System.Posix.Temp.ByteString++data StringType+  = String+  | StrictByteString+  | LazyByteString+  | ByteStringBuilder+  | ShortByteString+  | StrictText+  | LazyText+  | TextBuilder+  deriving (Eq, Show)++stringTypeName :: StringType -> Builder+stringTypeName = \case+  String -> "String"+  StrictByteString -> "B.ByteString"+  LazyByteString -> "LB.ByteString"+  ByteStringBuilder -> "BB.Builder"+  ShortByteString -> "SB.ShortByteString"+  StrictText -> "T.Text"+  LazyText -> "LT.Text"+  TextBuilder -> "TB.Builder"++data Strategy+  = ConvFunc ByteString+  | Via StringType++type Row = (StringType, StringType, Strategy)++mappings :: [Row]+mappings =+  [ (String, StrictByteString, Via StrictText)+  , (String, LazyByteString, Via LazyText)+  , (String, ByteStringBuilder, ConvFunc "BB.stringUtf8")+  , (String, ShortByteString, Via StrictByteString)+  , (String, StrictText, ConvFunc "T.pack")+  , (String, LazyText, ConvFunc "LT.pack")+  , (String, TextBuilder, ConvFunc "TB.fromString")+  , (StrictByteString, String, Via StrictText)+  , (StrictByteString, LazyByteString, ConvFunc "LB.fromStrict")+  , (StrictByteString, ByteStringBuilder, ConvFunc "BB.byteString")+  , (StrictByteString, ShortByteString, ConvFunc "SB.toShort")+  , (StrictByteString, StrictText, ConvFunc "TE.decodeUtf8Lenient")+  , (StrictByteString, LazyText, Via LazyByteString)+  , (StrictByteString, TextBuilder, Via StrictText)+  , (LazyByteString, String, Via LazyText)+  , (LazyByteString, StrictByteString, ConvFunc "LB.toStrict")+  , (LazyByteString, ByteStringBuilder, ConvFunc "BB.lazyByteString")+  , (LazyByteString, ShortByteString, Via StrictByteString)+  , (LazyByteString, StrictText, Via StrictByteString)+  , (LazyByteString, LazyText, ConvFunc "LTE.decodeUtf8With TEE.lenientDecode")+  , (LazyByteString, TextBuilder, Via LazyText)+  , (ByteStringBuilder, String, Via LazyText)+  , (ByteStringBuilder, StrictByteString, Via LazyByteString)+  , (ByteStringBuilder, LazyByteString, ConvFunc "BB.toLazyByteString")+  , (ByteStringBuilder, ShortByteString, Via StrictByteString)+  , (ByteStringBuilder, StrictText, Via StrictByteString)+  , (ByteStringBuilder, LazyText, Via LazyByteString)+  , (ByteStringBuilder, TextBuilder, Via LazyByteString)+  , (ShortByteString, String, Via StrictByteString)+  , (ShortByteString, StrictByteString, ConvFunc "SB.fromShort")+  , (ShortByteString, LazyByteString, Via StrictByteString)+  , (ShortByteString, ByteStringBuilder, ConvFunc "BB.shortByteString")+  , (ShortByteString, StrictText, Via StrictByteString)+  , (ShortByteString, LazyText, Via StrictByteString)+  , (ShortByteString, TextBuilder, Via StrictByteString)+  , (StrictText, String, ConvFunc "T.unpack")+  , (StrictText, StrictByteString, ConvFunc "TE.encodeUtf8")+  , (StrictText, LazyByteString, Via LazyText)+  , (StrictText, ByteStringBuilder, ConvFunc "TE.encodeUtf8Builder")+  , (StrictText, ShortByteString, Via StrictByteString)+  , (StrictText, LazyText, ConvFunc "LT.fromStrict")+  , (StrictText, TextBuilder, ConvFunc "TB.fromText")+  , (LazyText, String, ConvFunc "LT.unpack")+  , (LazyText, StrictByteString, Via LazyByteString)+  , (LazyText, LazyByteString, ConvFunc "LTE.encodeUtf8")+  , (LazyText, ByteStringBuilder, ConvFunc "LTE.encodeUtf8Builder")+  , (LazyText, ShortByteString, Via StrictByteString)+  , (LazyText, StrictText, ConvFunc "LT.toStrict")+  , (LazyText, TextBuilder, ConvFunc "TB.fromLazyText")+  , (TextBuilder, String, Via LazyText)+  , (TextBuilder, StrictByteString, Via LazyText)+  , (TextBuilder, LazyByteString, Via LazyText)+  , (TextBuilder, ByteStringBuilder, Via LazyText)+  , (TextBuilder, ShortByteString, Via LazyText)+  , (TextBuilder, StrictText, Via LazyText)+  , (TextBuilder, LazyText, ConvFunc "TB.toLazyText")+  ]++fullyQualifiedModule :: ByteString -> ByteString+fullyQualifiedModule = \case+  "B" -> "Data.ByteString"+  "BB" -> "Data.ByteString.Builder"+  "LB" -> "Data.ByteString.Lazy"+  "SB" -> "Data.ByteString.Short"+  "T" -> "Data.Text"+  "TE" -> "Data.Text.Encoding"+  "TEE" -> "Data.Text.Encoding.Error"+  "LT" -> "Data.Text.Lazy"+  "TB" -> "Data.Text.Lazy.Builder"+  "LTE" -> "Data.Text.Lazy.Encoding"+  unknown -> error $ show unknown <> " is not a correct module name"++fullyQualifiedExpr :: ByteString -> ByteString+fullyQualifiedExpr expr = fullyQualifiedModule moduleName <> rest+ where+  (moduleName, rest) = B.break (0x2e ==) expr++forceLookup :: (Show k, Eq k) => k -> [(k, v)] -> v+forceLookup key table = fromMaybe (error $ "key " <> show key <> " not found") $ lookup key table++getStrategy+  :: StringType -> StringType -> [Row] -> Strategy+getStrategy fromType toType table = forceLookup (fromType, toType) kvTable+ where+  kvTable = flip map table $ \(a, b, c) -> ((a, b), c)++getMapping+  :: Row -> [Row] -> [ByteString]+getMapping (fromType, toType, strategy) table = case strategy of+  ConvFunc expr -> [expr]+  Via intermediate ->+    let formerStrategy = getStrategy fromType intermediate table+        formerPart = getMapping (fromType, intermediate, formerStrategy) table+        latterStrategy = getStrategy intermediate toType table+        latterPart = getMapping (intermediate, toType, latterStrategy) table+     in latterPart ++ formerPart++main :: IO ()+main = do+  args <- getArgs+  let noDiff = "--no-diff" `elem` args+      shouldKeepFile = noDiff || "--keep" `elem` args+  bracket acquire (release shouldKeepFile) $ \(tmpPath, hdl) -> do+    B.putStr $ tmpPath <> "\n"+    B.hPutBuilder hdl $ header <> mconcat instancePart+    hClose hdl++    unless noDiff $ do+      diffExitCode <- runDiff tmpPath+      exitWith diffExitCode+ where+  acquire = mkstemps "haskell-from-" ".hs"+  release shouldKeepFile (path, hdl)+    | shouldKeepFile = hClose hdl+    | otherwise = hClose hdl >> removeFile path++  runDiff path =+    runProcess+      "diff"+      ["-u", "--color=always", path, "src/From/String/AutoGen.hs"]++  instanceLine fromType toType =+    mconcat+      [ "instance From "+      , stringTypeName fromType+      , " "+      , stringTypeName toType+      , " where\n"+      ]+  instancePart =+    [ let exprs = getMapping row mappings+          quote b = "'" <> b <> "'"+       in mconcat+            [ "\n"+            , "-- | "+            , mconcat+                $ intersperse " "+                $ map+                  (quote . B.byteString)+                $ intercalate ["."]+                -- Split by space, to link each part in the expression+                $ map (map fullyQualifiedExpr . B.split 0x20) exprs+            , "\n"+            , instanceLine fromType toType+            , "  from = "+            , mconcat+                $ intersperse+                  " . "+                $ map+                  B.byteString+                  exprs+            , "\n"+            ]+    | row@(fromType, toType, _) <- mappings+    ]++runProcess :: RawFilePath -> [ByteString] -> IO ExitCode+runProcess cmd args = startProcess (proc cmd args) >>= waitForProcess++header :: Builder+header =+  "{- FOURMOLU_DISABLE -}\n\+  \{- Make sure you edit test/Main.hs -}\n\+  \{-# LANGUAGE FlexibleInstances #-}\n\+  \{-# LANGUAGE MultiParamTypeClasses #-}\n\+  \{-# OPTIONS_GHC -Wno-orphans #-}\n\+  \\n\+  \module From.String.AutoGen () where\n\+  \\n\+  \import qualified Data.ByteString as B\n\+  \import qualified Data.ByteString.Builder as BB\n\+  \import qualified Data.ByteString.Lazy as LB\n\+  \import qualified Data.ByteString.Short as SB\n\+  \import qualified Data.Text as T\n\+  \import qualified Data.Text.Encoding as TE\n\+  \import qualified Data.Text.Encoding.Error as TEE\n\+  \import qualified Data.Text.Lazy as LT\n\+  \import qualified Data.Text.Lazy.Builder as TB\n\+  \import qualified Data.Text.Lazy.Encoding as LTE\n\+  \import From (From (..))\n"
from-string.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           from-string-version:        1.0.0.1+version:        1.0.0.2 synopsis:       Instances of 'From' for common string types description:    Convenient "sane default" conversion from/to strict ByteString, lazy                 ByteString, ByteString Builder, ShortByteString, strict Text, lazy Text, Text@@ -28,6 +28,11 @@   type: git   location: https://codeberg.org/xt/from +flag codegen+  description: Enable code generation test+  manual: True+  default: False+ library   exposed-modules:       From.String@@ -44,19 +49,39 @@     , text >=2.0 && <3   default-language: Haskell2010 -test-suite from-string-test+test-suite codegen   type: exitcode-stdio-1.0   main-is: Main.hs   other-modules:       Paths_from_string   hs-source-dirs:+      codegen+  ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints+  build-depends:+      base >=4.2 && <5+    , bytestring >=0.11.4.0 && <2+    , from >=1.0 && <2+    , rawfilepath >=1.0.1 && <2+    , text >=2.0 && <3+    , unix >2.7.3 && <3+  default-language: Haskell2010+  if flag(codegen)+    buildable: True+  else+    buildable: False++test-suite test+  type: exitcode-stdio-1.0+  main-is: Main.hs+  other-modules:+      Paths_from_string+  hs-source-dirs:       test   ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints   build-depends:       base >=4.2 && <5-    , bytestring+    , bytestring >=0.11.4.0 && <2     , from >=1.0 && <2-    , rawfilepath+    , from-string     , text >=2.0 && <3-    , unix   default-language: Haskell2010
test/Main.hs view
@@ -1,229 +1,89 @@-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedStrings #-}- module Main (main) where -import Control.Exception-import Control.Monad (unless)-import Data.ByteString (ByteString) import qualified Data.ByteString as B-import Data.ByteString.Builder (Builder)-import qualified Data.ByteString.Builder as B-import Data.List (intercalate, intersperse)-import Data.Maybe (fromMaybe)-import RawFilePath+import qualified Data.ByteString.Builder as BB+import qualified Data.ByteString.Lazy as LB+import qualified Data.ByteString.Short as SB+import qualified Data.Text as T+import qualified Data.Text.Lazy as LT+import qualified Data.Text.Lazy.Builder as TB+import From.String import System.Exit-import System.IO-import System.Posix.Env.ByteString-import System.Posix.Temp.ByteString -data StringType-  = String-  | StrictByteString-  | LazyByteString-  | ByteStringBuilder-  | ShortByteString-  | StrictText-  | LazyText-  | TextBuilder-  deriving (Eq, Show)--stringTypeName :: StringType -> Builder-stringTypeName = \case-  String -> "String"-  StrictByteString -> "B.ByteString"-  LazyByteString -> "LB.ByteString"-  ByteStringBuilder -> "BB.Builder"-  ShortByteString -> "SB.ShortByteString"-  StrictText -> "T.Text"-  LazyText -> "LT.Text"-  TextBuilder -> "TB.Builder"+cB :: B.ByteString+cB = B.pack [0xec, 0x95, 0x88, 0xeb, 0x85, 0x95]+{-# NOINLINE cB #-} -data Strategy-  = ConvFunc ByteString-  | Via StringType+cLB :: LB.ByteString+cLB = LB.pack [0xec, 0x95, 0x88, 0xeb, 0x85, 0x95]+{-# NOINLINE cLB #-} -type Row = (StringType, StringType, Strategy)+cBB :: BB.Builder+cBB = BB.byteString cB+{-# NOINLINE cBB #-} -mappings :: [Row]-mappings =-  [ (String, StrictByteString, Via StrictText)-  , (String, LazyByteString, Via LazyText)-  , (String, ByteStringBuilder, ConvFunc "BB.stringUtf8")-  , (String, ShortByteString, Via StrictByteString)-  , (String, StrictText, ConvFunc "T.pack")-  , (String, LazyText, ConvFunc "LT.pack")-  , (String, TextBuilder, ConvFunc "TB.fromString")-  , (StrictByteString, String, Via StrictText)-  , (StrictByteString, LazyByteString, ConvFunc "LB.fromStrict")-  , (StrictByteString, ByteStringBuilder, ConvFunc "BB.byteString")-  , (StrictByteString, ShortByteString, ConvFunc "SB.toShort")-  , (StrictByteString, StrictText, ConvFunc "TE.decodeUtf8Lenient")-  , (StrictByteString, LazyText, Via LazyByteString)-  , (StrictByteString, TextBuilder, Via StrictText)-  , (LazyByteString, String, Via LazyText)-  , (LazyByteString, StrictByteString, ConvFunc "LB.toStrict")-  , (LazyByteString, ByteStringBuilder, ConvFunc "BB.lazyByteString")-  , (LazyByteString, ShortByteString, Via StrictByteString)-  , (LazyByteString, StrictText, Via StrictByteString)-  , (LazyByteString, LazyText, ConvFunc "LTE.decodeUtf8With TEE.lenientDecode")-  , (LazyByteString, TextBuilder, Via LazyText)-  , (ByteStringBuilder, String, Via LazyText)-  , (ByteStringBuilder, StrictByteString, Via LazyByteString)-  , (ByteStringBuilder, LazyByteString, ConvFunc "BB.toLazyByteString")-  , (ByteStringBuilder, ShortByteString, Via StrictByteString)-  , (ByteStringBuilder, StrictText, Via StrictByteString)-  , (ByteStringBuilder, LazyText, Via LazyByteString)-  , (ByteStringBuilder, TextBuilder, Via LazyByteString)-  , (ShortByteString, String, Via StrictByteString)-  , (ShortByteString, StrictByteString, ConvFunc "SB.fromShort")-  , (ShortByteString, LazyByteString, Via StrictByteString)-  , (ShortByteString, ByteStringBuilder, ConvFunc "BB.shortByteString")-  , (ShortByteString, StrictText, Via StrictByteString)-  , (ShortByteString, LazyText, Via StrictByteString)-  , (ShortByteString, TextBuilder, Via StrictByteString)-  , (StrictText, String, ConvFunc "T.unpack")-  , (StrictText, StrictByteString, ConvFunc "TE.encodeUtf8")-  , (StrictText, LazyByteString, Via LazyText)-  , (StrictText, ByteStringBuilder, ConvFunc "TE.encodeUtf8Builder")-  , (StrictText, ShortByteString, Via StrictByteString)-  , (StrictText, LazyText, ConvFunc "LT.fromStrict")-  , (StrictText, TextBuilder, ConvFunc "TB.fromText")-  , (LazyText, String, ConvFunc "LT.unpack")-  , (LazyText, StrictByteString, Via LazyByteString)-  , (LazyText, LazyByteString, ConvFunc "LTE.encodeUtf8")-  , (LazyText, ByteStringBuilder, ConvFunc "LTE.encodeUtf8Builder")-  , (LazyText, ShortByteString, Via StrictByteString)-  , (LazyText, StrictText, ConvFunc "LT.toStrict")-  , (LazyText, TextBuilder, ConvFunc "TB.fromLazyText")-  , (TextBuilder, String, Via LazyText)-  , (TextBuilder, StrictByteString, Via LazyText)-  , (TextBuilder, LazyByteString, Via LazyText)-  , (TextBuilder, ByteStringBuilder, Via LazyText)-  , (TextBuilder, ShortByteString, Via LazyText)-  , (TextBuilder, StrictText, Via LazyText)-  , (TextBuilder, LazyText, ConvFunc "TB.toLazyText")-  ]+cSB :: SB.ShortByteString+cSB = SB.pack [0xec, 0x95, 0x88, 0xeb, 0x85, 0x95]+{-# NOINLINE cSB #-} -fullyQualifiedModule :: ByteString -> ByteString-fullyQualifiedModule = \case-  "B" -> "Data.ByteString"-  "BB" -> "Data.ByteString.Builder"-  "LB" -> "Data.ByteString.Lazy"-  "SB" -> "Data.ByteString.Short"-  "T" -> "Data.Text"-  "TE" -> "Data.Text.Encoding"-  "TEE" -> "Data.Text.Encoding.Error"-  "LT" -> "Data.Text.Lazy"-  "TB" -> "Data.Text.Lazy.Builder"-  "LTE" -> "Data.Text.Lazy.Encoding"-  unknown -> error $ show unknown <> " is not a correct module name"+cT :: T.Text+cT = T.pack "\50504\45397"+{-# NOINLINE cT #-} -fullyQualifiedExpr :: ByteString -> ByteString-fullyQualifiedExpr expr = fullyQualifiedModule moduleName <> rest- where-  (moduleName, rest) = B.break (0x2e ==) expr+cLT :: LT.Text+cLT = LT.pack "\50504\45397"+{-# NOINLINE cLT #-} -forceLookup :: (Show k, Eq k) => k -> [(k, v)] -> v-forceLookup key table = fromMaybe (error $ "key " <> show key <> " not found") $ lookup key table+cTB :: TB.Builder+cTB = TB.fromString "\50504\45397"+{-# NOINLINE cTB #-} -getStrategy-  :: StringType -> StringType -> [Row] -> Strategy-getStrategy fromType toType table = forceLookup (fromType, toType) kvTable+assertEq :: (Eq term) => String -> term -> term -> IO ()+assertEq comment leftTerm rightTerm+  | leftTerm == rightTerm = report+  | otherwise = report >> exitFailure  where-  kvTable = flip map table $ \(a, b, c) -> ((a, b), c)--getMapping-  :: Row -> [Row] -> [ByteString]-getMapping (fromType, toType, strategy) table = case strategy of-  ConvFunc expr -> [expr]-  Via intermediate ->-    let formerStrategy = getStrategy fromType intermediate table-        formerPart = getMapping (fromType, intermediate, formerStrategy) table-        latterStrategy = getStrategy intermediate toType table-        latterPart = getMapping (intermediate, toType, latterStrategy) table-     in latterPart ++ formerPart+  report = putStrLn comment +-- TODO: More test cases+-- NOTE: Data.ByteString.Builder.Builder does not have Eq main :: IO () main = do-  args <- getArgs-  let noDiff = "--no-diff" `elem` args-      shouldKeepFile = noDiff || "--keep" `elem` args-  bracket acquire (release shouldKeepFile) $ \(tmpPath, hdl) -> do-    B.putStr $ tmpPath <> "\n"-    B.hPutBuilder hdl $ header <> mconcat instancePart-    hClose hdl--    unless noDiff $ do-      diffExitCode <- runDiff tmpPath-      exitWith diffExitCode- where-  acquire = mkstemps "haskell-from-" ".hs"-  release shouldKeepFile (path, hdl)-    | shouldKeepFile = hClose hdl-    | otherwise = hClose hdl >> removeFile path--  runDiff path =-    runProcess-      "diff"-      ["-u", "--color=always", path, "src/From/String/AutoGen.hs"]--  instanceLine fromType toType =-    mconcat-      [ "instance From "-      , stringTypeName fromType-      , " "-      , stringTypeName toType-      , " where\n"-      ]-  instancePart =-    [ let exprs = getMapping row mappings-          quote b = "'" <> b <> "'"-       in mconcat-            [ "\n"-            , "-- | "-            , mconcat-                $ intersperse " "-                $ map-                  (quote . B.byteString)-                $ intercalate ["."]-                -- Split by space, to link each part in the expression-                $ map (map fullyQualifiedExpr . B.split 0x20) exprs-            , "\n"-            , instanceLine fromType toType-            , "  from = "-            , mconcat-                $ intersperse-                  " . "-                $ map-                  B.byteString-                  exprs-            , "\n"-            ]-    | row@(fromType, toType, _) <- mappings-    ]--runProcess :: RawFilePath -> [ByteString] -> IO ExitCode-runProcess cmd args = startProcess (proc cmd args) >>= waitForProcess+  assertEq " cB == from cLB" cB (from cLB)+  assertEq " cB == from cBB" cB (from cBB)+  assertEq " cB == from cSB" cB (from cSB)+  assertEq " cB == from cT" cB (from cT)+  assertEq " cB == from cLT" cB (from cLT)+  assertEq " cB == from cTB" cB (from cTB)+  assertEq "cLB == from cB" cLB (from cB)+  assertEq "cLB == from cBB" cLB (from cBB)+  assertEq "cLB == from cSB" cLB (from cSB)+  assertEq "cLB == from cT" cLB (from cT)+  assertEq "cLB == from cLT" cLB (from cLT)+  assertEq "cLB == from cTB" cLB (from cTB)+  assertEq "cSB == from cB" cSB (from cB)+  assertEq "cSB == from cLB" cSB (from cLB)+  assertEq "cSB == from cBB" cSB (from cBB)+  assertEq "cSB == from cT" cSB (from cT)+  assertEq "cSB == from cLT" cSB (from cLT)+  assertEq "cSB == from cTB" cSB (from cTB)+  assertEq " cT == from cB" cT (from cB)+  assertEq " cT == from cLB" cT (from cLB)+  assertEq " cT == from cBB" cT (from cBB)+  assertEq " cT == from cSB" cT (from cSB)+  assertEq " cT == from cLT" cT (from cLT)+  assertEq " cT == from cTB" cT (from cTB)+  assertEq "cLT == from cB" cLT (from cB)+  assertEq "cLT == from cLB" cLT (from cLB)+  assertEq "cLT == from cBB" cLT (from cBB)+  assertEq "cLT == from cSB" cLT (from cSB)+  assertEq "cLT == from cT" cLT (from cT)+  assertEq "cLT == from cTB" cLT (from cTB)+  assertEq "cTB == from cB" cTB (from cB)+  assertEq "cTB == from cLB" cTB (from cLB)+  assertEq "cTB == from cBB" cTB (from cBB)+  assertEq "cTB == from cSB" cTB (from cSB)+  assertEq "cTB == from cT" cTB (from cT)+  assertEq "cTB == from cLT" cTB (from cLT) -header :: Builder-header =-  "{- FOURMOLU_DISABLE -}\n\-  \{- Make sure you edit test/Main.hs -}\n\-  \{-# LANGUAGE FlexibleInstances #-}\n\-  \{-# LANGUAGE MultiParamTypeClasses #-}\n\-  \{-# OPTIONS_GHC -Wno-orphans #-}\n\-  \\n\-  \module From.String.AutoGen () where\n\-  \\n\-  \import qualified Data.ByteString as B\n\-  \import qualified Data.ByteString.Builder as BB\n\-  \import qualified Data.ByteString.Lazy as LB\n\-  \import qualified Data.ByteString.Short as SB\n\-  \import qualified Data.Text as T\n\-  \import qualified Data.Text.Encoding as TE\n\-  \import qualified Data.Text.Encoding.Error as TEE\n\-  \import qualified Data.Text.Lazy as LT\n\-  \import qualified Data.Text.Lazy.Builder as TB\n\-  \import qualified Data.Text.Lazy.Encoding as LTE\n\-  \import From (From (..))\n"+  exitSuccess