{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Ormolu.Printer.SpanStream
( SpanStream (..),
mkSpanStream,
)
where
import Data.DList (DList)
import qualified Data.DList as D
import Data.Data (Data)
import Data.Generics (everything, ext2Q)
import Data.List (sortOn)
import Data.Typeable (cast)
import SrcLoc
newtype SpanStream = SpanStream [RealSrcSpan]
deriving (Eq, Show, Data, Semigroup, Monoid)
mkSpanStream ::
Data a =>
a ->
SpanStream
mkSpanStream a =
SpanStream
. sortOn realSrcSpanStart
. D.toList
$ everything mappend (const mempty `ext2Q` queryLocated) a
where
queryLocated ::
(Data e0) =>
GenLocated e0 e1 ->
DList RealSrcSpan
queryLocated (L mspn _) =
case cast mspn :: Maybe SrcSpan of
Nothing -> mempty
Just (UnhelpfulSpan _) -> mempty
Just (RealSrcSpan spn) -> D.singleton spn