Эффективно добавить завершающий символ новой строки в JSON ByteString, испускаемый Aeson при записи в файл
По умолчанию Aeson encode
или же encodePretty
не добавляйте завершающий символ новой строки в ByteString
, Т.е. при просмотре результирующего файла в vim я вижу [noeol]
индикатор.
Что такое эффективный / идиоматический способ добавления новой строки в файл?
Вот SSCCE для Main.hs
:
{-# LANGUAGE DeriveGeneric #-}
import Data.Aeson
import Data.Aeson.Encode.Pretty
import GHC.Generics
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Internal as BS
data ExampleRecord =
ExampleRecord {
field1 :: String
, field2 :: String
} deriving (Show, Generic)
instance ToJSON ExampleRecord
main = L.writeFile "foo.json" $ encodePretty (ExampleRecord "a" "b")
с сопровождением myproj.cabal
файл:
name: myproj
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable emit-json
main-is: Main.hs
build-depends:
base >=4.8 && <4.9
, aeson
, aeson-pretty
, bytestring
default-language: Haskell2010
Я могу добавить новую строку foo.json
используя snoc
функция отByteString
, изменяя последнюю строку в Main.hs
к этому:
main = L.writeFile "foo.json" $ encodePretty (ExampleRecord "a" "b") `L.snoc` BS.c2w '\n'
Тем не менее snoc
документация описывает это как операцию O(n). Должен ли быть способ добавить эту новую строку в постоянное время?