module CabalGild.Unstable.Type.Line where
import qualified CabalGild.Unstable.Type.Chunk as Chunk
import qualified Data.ByteString as ByteString
import qualified Distribution.Compat.Lens as Lens
data Line = Line
{
Line -> Int
indent :: Int,
Line -> Chunk
chunk :: Chunk.Chunk
}
deriving (Line -> Line -> Bool
(Line -> Line -> Bool) -> (Line -> Line -> Bool) -> Eq Line
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Line -> Line -> Bool
== :: Line -> Line -> Bool
$c/= :: Line -> Line -> Bool
/= :: Line -> Line -> Bool
Eq, Int -> Line -> ShowS
[Line] -> ShowS
Line -> String
(Int -> Line -> ShowS)
-> (Line -> String) -> ([Line] -> ShowS) -> Show Line
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Line -> ShowS
showsPrec :: Int -> Line -> ShowS
$cshow :: Line -> String
show :: Line -> String
$cshowList :: [Line] -> ShowS
showList :: [Line] -> ShowS
Show)
chunkLens :: Lens.Lens' Line Chunk.Chunk
chunkLens :: Lens' Line Chunk
chunkLens Chunk -> f Chunk
f Line
s = (Chunk -> Line) -> f Chunk -> f Line
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Chunk
a -> Line
s {chunk = a}) (f Chunk -> f Line) -> (Chunk -> f Chunk) -> Chunk -> f Line
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Chunk -> f Chunk
f (Chunk -> f Line) -> Chunk -> f Line
forall a b. (a -> b) -> a -> b
$ Line -> Chunk
chunk Line
s
empty :: Line
empty :: Line
empty =
Line
{ indent :: Int
indent = Int
0,
chunk :: Chunk
chunk = Chunk
forall a. Monoid a => a
mempty
}
isEmpty :: Line -> Bool
isEmpty :: Line -> Bool
isEmpty = Chunk -> Bool
Chunk.isEmpty (Chunk -> Bool) -> (Line -> Chunk) -> Line -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Line -> Chunk
chunk
toByteString :: Line -> ByteString.ByteString
toByteString :: Line -> ByteString
toByteString Line
l =
if Line -> Bool
isEmpty Line
l
then ByteString
ByteString.empty
else
ByteString -> ByteString -> ByteString
forall a. Monoid a => a -> a -> a
mappend (Int -> Word8 -> ByteString
ByteString.replicate (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Line -> Int
indent Line
l) Word8
0x20)
(ByteString -> ByteString)
-> (Chunk -> ByteString) -> Chunk -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Chunk -> ByteString
Chunk.value
(Chunk -> ByteString) -> Chunk -> ByteString
forall a b. (a -> b) -> a -> b
$ Line -> Chunk
chunk Line
l