1
1
mirror of https://github.com/github/semantic.git synced 2024-12-23 06:41:45 +03:00
semantic/src/Renderer.hs

62 lines
2.1 KiB
Haskell
Raw Normal View History

{-# LANGUAGE GADTs #-}
2017-03-31 22:55:57 +03:00
module Renderer
( DiffRenderer(..)
, runDiffRenderer
2017-03-31 22:55:57 +03:00
, Format(..)
2017-04-03 22:31:46 +03:00
, Summaries(..)
2017-03-31 22:55:57 +03:00
) where
2017-04-03 23:00:00 +03:00
import Data.Aeson (ToJSON, Value)
import Data.Functor.Both
2016-08-24 21:30:29 +03:00
import Data.Map as Map hiding (null)
import Data.Functor.Listable
import Data.Record
2017-04-01 06:02:41 +03:00
import Diff
import Info
2017-03-09 01:45:47 +03:00
import Prologue
2017-03-31 23:49:29 +03:00
import Renderer.JSON as R
import Renderer.Patch as R
import Renderer.SExpression as R
import Renderer.Split as R
import Renderer.Summary as R
import Renderer.TOC as R
import Source (SourceBlob)
import Syntax
data DiffRenderer fields output where
SplitRenderer :: (HasField fields Category, HasField fields Range) => DiffRenderer fields Text
PatchRenderer :: HasField fields Range => DiffRenderer fields Text
JSONDiffRenderer :: (ToJSON (Record fields), HasField fields Category, HasField fields Range) => DiffRenderer fields (Map Text Value)
SummaryRenderer :: HasDefaultFields fields => DiffRenderer fields Summaries
SExpressionDiffRenderer :: (HasField fields Category, HasField fields SourceSpan) => SExpressionFormat -> DiffRenderer fields ByteString
ToCRenderer :: HasDefaultFields fields => DiffRenderer fields Summaries
runDiffRenderer :: Monoid output => DiffRenderer fields output -> [(Both SourceBlob, Diff (Syntax Text) (Record fields))] -> output
runDiffRenderer renderer = foldMap . uncurry $ case renderer of
SplitRenderer -> R.split
PatchRenderer -> R.patch
JSONDiffRenderer -> R.json
SummaryRenderer -> (Summaries .) . R.summary
SExpressionDiffRenderer format -> R.sExpression format
ToCRenderer -> (Summaries .) . R.toc
-- | The available types of diff rendering.
2017-03-11 01:12:23 +03:00
data Format = Split | Patch | JSON | Summary | SExpression | TOC | Index | ParseTree
deriving (Show)
2017-04-03 22:31:46 +03:00
newtype Summaries = Summaries { unSummaries :: Map Text (Map Text [Value]) }
deriving Show
instance Monoid Summaries where
mempty = Summaries mempty
mappend = (Summaries .) . (Map.unionWith (Map.unionWith (<>)) `on` unSummaries)
instance Listable Format where
tiers = cons0 Split
\/ cons0 Patch
\/ cons0 JSON
\/ cons0 Summary
\/ cons0 SExpression
\/ cons0 TOC