{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
module Data.Annotation
( module Data.Annotation
, module Data.Proxy
) where
import Data.Either
import Data.Maybe
import Data.Proxy
import Data.Set (Set)
import qualified Data.Set as Set
import Data.String
import qualified Data.Text as Text
import Data.Typeable
import GHC.Stack
type AnnC a = (Typeable a, Show a)
data Annotation where
Annotation
:: AnnC a
=> a
-> Annotation
instance Show Annotation where
showsPrec :: Int -> Annotation -> ShowS
showsPrec Int
p (Annotation a
a) =
Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"Annotation @"
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> TypeRep -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 (a -> TypeRep
forall a. Typeable a => a -> TypeRep
typeOf a
a)
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" "
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
a
instance IsString Annotation where
fromString :: String -> Annotation
fromString = Text -> Annotation
forall a. AnnC a => a -> Annotation
Annotation (Text -> Annotation) -> (String -> Text) -> String -> Annotation
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack
toAnnotation :: (AnnC a) => a -> Annotation
toAnnotation :: forall a. AnnC a => a -> Annotation
toAnnotation = a -> Annotation
forall a. AnnC a => a -> Annotation
Annotation
castAnnotation
:: forall a. (Typeable a)
=> Annotation
-> Maybe a
castAnnotation :: forall a. Typeable a => Annotation -> Maybe a
castAnnotation (Annotation a
ann) =
a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
ann
tryAnnotation
:: forall a. (Typeable a)
=> Annotation
-> Either a Annotation
tryAnnotation :: forall a. Typeable a => Annotation -> Either a Annotation
tryAnnotation a :: Annotation
a@(Annotation a
val) =
case a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
val of
Just a
x ->
a -> Either a Annotation
forall a b. a -> Either a b
Left a
x
Maybe a
Nothing ->
Annotation -> Either a Annotation
forall a b. b -> Either a b
Right Annotation
a
tryAnnotations
:: forall a. (Typeable a)
=> [Annotation]
-> ([a], [Annotation])
tryAnnotations :: forall a. Typeable a => [Annotation] -> ([a], [Annotation])
tryAnnotations = [Either a Annotation] -> ([a], [Annotation])
forall a b. [Either a b] -> ([a], [b])
partitionEithers ([Either a Annotation] -> ([a], [Annotation]))
-> ([Annotation] -> [Either a Annotation])
-> [Annotation]
-> ([a], [Annotation])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Annotation -> Either a Annotation)
-> [Annotation] -> [Either a Annotation]
forall a b. (a -> b) -> [a] -> [b]
map Annotation -> Either a Annotation
forall a. Typeable a => Annotation -> Either a Annotation
tryAnnotation
annotationTypes
:: [Annotation]
-> Set TypeRep
annotationTypes :: [Annotation] -> Set TypeRep
annotationTypes = [TypeRep] -> Set TypeRep
forall a. Ord a => [a] -> Set a
Set.fromList ([TypeRep] -> Set TypeRep)
-> ([Annotation] -> [TypeRep]) -> [Annotation] -> Set TypeRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Annotation -> TypeRep) -> [Annotation] -> [TypeRep]
forall a b. (a -> b) -> [a] -> [b]
map (\(Annotation a
a) -> a -> TypeRep
forall a. Typeable a => a -> TypeRep
typeOf a
a)
mapAnnotation
:: ((AnnC a, AnnC b))
=> (a -> b)
-> Annotation
-> Maybe Annotation
mapAnnotation :: forall a b.
(AnnC a, AnnC b) =>
(a -> b) -> Annotation -> Maybe Annotation
mapAnnotation a -> b
f (Annotation a
ann) =
b -> Annotation
forall a. AnnC a => a -> Annotation
Annotation (b -> Annotation) -> (a -> b) -> a -> Annotation
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f (a -> Annotation) -> Maybe a -> Maybe Annotation
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> Maybe a
forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
ann
mapMaybeAnnotation
:: (AnnC a, AnnC b)
=> (a -> b)
-> Annotation
-> Annotation
mapMaybeAnnotation :: forall a b.
(AnnC a, AnnC b) =>
(a -> b) -> Annotation -> Annotation
mapMaybeAnnotation a -> b
f Annotation
ann =
Annotation -> Maybe Annotation -> Annotation
forall a. a -> Maybe a -> a
fromMaybe Annotation
ann ((a -> b) -> Annotation -> Maybe Annotation
forall a b.
(AnnC a, AnnC b) =>
(a -> b) -> Annotation -> Maybe Annotation
mapAnnotation a -> b
f Annotation
ann)
newtype CallStackAnnotation = CallStackAnnotation
{ CallStackAnnotation -> [(String, SrcLoc)]
unCallStackAnnotation :: [(String, SrcLoc)]
}
deriving (CallStackAnnotation -> CallStackAnnotation -> Bool
(CallStackAnnotation -> CallStackAnnotation -> Bool)
-> (CallStackAnnotation -> CallStackAnnotation -> Bool)
-> Eq CallStackAnnotation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CallStackAnnotation -> CallStackAnnotation -> Bool
== :: CallStackAnnotation -> CallStackAnnotation -> Bool
$c/= :: CallStackAnnotation -> CallStackAnnotation -> Bool
/= :: CallStackAnnotation -> CallStackAnnotation -> Bool
Eq, Int -> CallStackAnnotation -> ShowS
[CallStackAnnotation] -> ShowS
CallStackAnnotation -> String
(Int -> CallStackAnnotation -> ShowS)
-> (CallStackAnnotation -> String)
-> ([CallStackAnnotation] -> ShowS)
-> Show CallStackAnnotation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CallStackAnnotation -> ShowS
showsPrec :: Int -> CallStackAnnotation -> ShowS
$cshow :: CallStackAnnotation -> String
show :: CallStackAnnotation -> String
$cshowList :: [CallStackAnnotation] -> ShowS
showList :: [CallStackAnnotation] -> ShowS
Show)
{-# DEPRECATED CallStackAnnotation "You can just use `CallStack` directly now." #-}
callStackAnnotation :: HasCallStack => Annotation
callStackAnnotation :: HasCallStack => Annotation
callStackAnnotation = CallStack -> Annotation
forall a. AnnC a => a -> Annotation
Annotation CallStack
HasCallStack => CallStack
callStack
callStackToAnnotation :: CallStack -> Annotation
callStackToAnnotation :: CallStack -> Annotation
callStackToAnnotation = CallStack -> Annotation
forall a. AnnC a => a -> Annotation
Annotation
callStackFromAnnotation :: CallStackAnnotation -> CallStack
callStackFromAnnotation :: CallStackAnnotation -> CallStack
callStackFromAnnotation CallStackAnnotation
ann =
[(String, SrcLoc)] -> CallStack
fromCallSiteList ([(String, SrcLoc)] -> CallStack)
-> [(String, SrcLoc)] -> CallStack
forall a b. (a -> b) -> a -> b
$ CallStackAnnotation -> [(String, SrcLoc)]
unCallStackAnnotation CallStackAnnotation
ann
{-# DEPRECATED callStackFromAnnotation "You can use 'CallStack' directly in annotations as of 0.2.0.0." #-}
callStackInAnnotations :: [Annotation] -> ([CallStack], [Annotation])
callStackInAnnotations :: [Annotation] -> ([CallStack], [Annotation])
callStackInAnnotations =
[Annotation] -> ([CallStack], [Annotation])
forall a. Typeable a => [Annotation] -> ([a], [Annotation])
tryAnnotations
{-# DEPRECATED callStackInAnnotations "You can just use 'tryAnnotations' directly as of 0.2.0.0." #-}