Эффективно добавить завершающий символ новой строки в 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). Должен ли быть способ добавить эту новую строку в постоянное время?

0 ответов

Другие вопросы по тегам