packages feed

cabal-gild-0.3.0.0: source/library/CabalGild/Type/Chunk.hs

module CabalGild.Type.Chunk where

import qualified Data.ByteString as ByteString
import qualified Distribution.Compat.Lens as Lens

data Chunk = Chunk
  { spaceBefore :: Bool,
    value :: ByteString.ByteString,
    spaceAfter :: Bool
  }
  deriving (Eq, Show)

instance Semigroup Chunk where
  x <> y =
    let s =
          if spaceAfter x && spaceBefore y
            then ByteString.singleton 0x20
            else ByteString.empty
        z =
          Chunk
            { spaceBefore = spaceBefore x,
              value = value x <> s <> value y,
              spaceAfter = spaceAfter y
            }
     in if isEmpty x then y else if isEmpty y then x else z

instance Monoid Chunk where
  mempty =
    Chunk
      { spaceBefore = False,
        value = ByteString.empty,
        spaceAfter = False
      }

colon :: Chunk
colon = Lens.set spaceAfterLens True . fromByteString $ ByteString.singleton 0x3a

fromByteString :: ByteString.ByteString -> Chunk
fromByteString bs = mempty {value = bs}

isEmpty :: Chunk -> Bool
isEmpty = ByteString.null . value

spaceAfterLens :: Lens.Lens' Chunk Bool
spaceAfterLens f s = fmap (\a -> s {spaceAfter = a}) . f $ spaceAfter s

spaceBeforeLens :: Lens.Lens' Chunk Bool
spaceBeforeLens f s = fmap (\a -> s {spaceBefore = a}) . f $ spaceBefore s