1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
24import Prelude hiding (null)
25import Control.Arrow ((***))
26import qualified Data.ByteString.Char8 as BSC
27import qualified Data.ByteString.Builder as B
28import qualified Data.Map as Map
29import qualified Data.Scientific as Sci
30import Data.Monoid ((<>))
31import qualified Data.Name as Name
32import qualified Data.Utf8 as Utf8
43 | Object [(Utf8.String, Value)]
47 | Number Sci.Scientific
51array :: [Value] -> Value
56object :: [(Utf8.String,Value)] -> Value
61string :: Utf8.String -> Value
63 String (encodeUtf8 str)
66name :: Name.Name -> Value
68 String (B.char7 '"' <> Name.toBuilder nm <> B.char7 '"')
81number :: Sci.Scientific -> Value
91dict :: (k -> Utf8.String) -> (v -> Value) -> Map.Map k v -> Value
92dict encodeKey encodeValue pairs =
93 Object $ map (encodeKey *** encodeValue) (Map.toList pairs)
96list :: (a -> Value) -> [a] -> Value
97list encodeEntry entries =
98 Array $ map encodeEntry entries
105(==>) :: a -> b -> (a, b)
114write :: FilePath -> Value -> IO ()
116 File.writeBuilder path (encode value <> "\n")
119writeUgly :: FilePath -> Value -> IO ()
120writeUgly path value =
121 File.writeBuilder path (encodeUgly value)
128encodeUgly :: Value -> B.Builder
134 Array (first : rest) ->
137 B.char7 ',' <> encodeUgly entry
139 B.char7 '[' <> encodeUgly first <> mconcat (map encodeEntry rest) <> B.char7 ']'
144 Object (first : rest) ->
146 encodeEntry char (key, entry) =
147 B.char7 char <> encodeUtf8 key <> B.char7 ':' <> encodeUgly entry
149 encodeEntry '{' first <> mconcat (map (encodeEntry ',') rest) <> B.char7 '}'
155 B.string7 (if boolean then "true" else "false")
161 B.string7 (Sci.formatScientific Sci.Generic Nothing scientific)
171encode :: Value -> B.Builder
176encodeHelp :: BSC.ByteString -> Value -> B.Builder
177encodeHelp indent value =
182 Array (first : rest) ->
183 encodeArray indent first rest
188 Object (first : rest) ->
189 encodeObject indent first rest
195 B.string7 (if boolean then "true" else "false")
201 B.string7 (Sci.formatScientific Sci.Generic Nothing scientific)
211encodeUtf8 :: Utf8.String -> B.Builder
213 B.char7 '"' <> Utf8.toBuilder str <> B.char7 '"'
220encodeArray :: BSC.ByteString -> Value -> [Value] -> B.Builder
222 encodeSequence arrayOpen arrayClose encodeHelp
225arrayOpen :: B.Builder
230arrayClose :: B.Builder
239encodeObject :: BSC.ByteString -> (Utf8.String, Value) -> [(Utf8.String, Value)] -> B.Builder
241 encodeSequence objectOpen objectClose encodeField
244objectOpen :: B.Builder
249objectClose :: B.Builder
254encodeField :: BSC.ByteString -> (Utf8.String, Value) -> B.Builder
255encodeField indent (key, value) =
256 encodeUtf8 key <> B.string7 ": " <> encodeHelp indent value
263encodeSequence :: B.Builder -> B.Builder -> (BSC.ByteString -> a -> B.Builder) -> BSC.ByteString -> a -> [a] -> B.Builder
264encodeSequence open close encodeEntry indent first rest =
270 B.byteString newIndent
273 newline <> B.byteString indent <> close
275 addValue field builder =
278 <> encodeEntry newIndent field
283 <> encodeEntry newIndent first
284 <> foldr addValue closer rest
287commaNewline :: B.Builder
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list