{-# LANGUAGE PatternSynonyms #-}

-- | The data model for Unison transcripts.
module Unison.Codebase.Transcript
  ( ExpectingError,
    HasBug,
    ScratchFileName,
    Hidden (..),
    UcmLine (..),
    UcmContext (..),
    APIRequest (..),
    pattern CMarkCodeBlock,
    Stanza,
    InfoTags (..),
    getCommonInfoTags,
    Transcript (..),
    settings,
    TranscriptType (..),
    Behaviors (..),
    extractBehaviors,
    Settings (..),
    defaultInfoTags,
    ProcessedBlock (..),
    CMark.Node,
  )
where

import CMark qualified
import Data.Aeson.Types ((.:?), (.=))
import Data.Aeson.Types qualified as Aeson
import Data.Functor.Classes (Show1, liftShowsPrec)
import GHC.Show (showList__)
import Unison.Core.Project (ProjectBranchName, ProjectName)
import Unison.Prelude
import Unison.Project (ProjectAndBranch)

-- | A transcript is executable Markdown, akin to a Jupyter Notebook.
--
--  __NB__: This is effectively the AST. It needs to preserve anything we want to be able to serialize into transcript
--          output.
data Transcript = Transcript {Transcript -> Value
frontmatter :: Aeson.Value, Transcript -> [Stanza]
stanzas :: [Stanza]}
  deriving (Int -> Transcript -> ShowS
[Transcript] -> ShowS
Transcript -> String
(Int -> Transcript -> ShowS)
-> (Transcript -> String)
-> ([Transcript] -> ShowS)
-> Show Transcript
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Transcript -> ShowS
showsPrec :: Int -> Transcript -> ShowS
$cshow :: Transcript -> String
show :: Transcript -> String
$cshowList :: [Transcript] -> ShowS
showList :: [Transcript] -> ShowS
Show)

type ExpectingError = Bool

type HasBug = Bool

type ScratchFileName = Text

data Hidden = Shown | HideOutput | HideAll
  deriving (Hidden -> Hidden -> Bool
(Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Bool) -> Eq Hidden
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Hidden -> Hidden -> Bool
== :: Hidden -> Hidden -> Bool
$c/= :: Hidden -> Hidden -> Bool
/= :: Hidden -> Hidden -> Bool
Eq, Eq Hidden
Eq Hidden =>
(Hidden -> Hidden -> Ordering)
-> (Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Hidden)
-> (Hidden -> Hidden -> Hidden)
-> Ord Hidden
Hidden -> Hidden -> Bool
Hidden -> Hidden -> Ordering
Hidden -> Hidden -> Hidden
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Hidden -> Hidden -> Ordering
compare :: Hidden -> Hidden -> Ordering
$c< :: Hidden -> Hidden -> Bool
< :: Hidden -> Hidden -> Bool
$c<= :: Hidden -> Hidden -> Bool
<= :: Hidden -> Hidden -> Bool
$c> :: Hidden -> Hidden -> Bool
> :: Hidden -> Hidden -> Bool
$c>= :: Hidden -> Hidden -> Bool
>= :: Hidden -> Hidden -> Bool
$cmax :: Hidden -> Hidden -> Hidden
max :: Hidden -> Hidden -> Hidden
$cmin :: Hidden -> Hidden -> Hidden
min :: Hidden -> Hidden -> Hidden
Ord, ReadPrec [Hidden]
ReadPrec Hidden
Int -> ReadS Hidden
ReadS [Hidden]
(Int -> ReadS Hidden)
-> ReadS [Hidden]
-> ReadPrec Hidden
-> ReadPrec [Hidden]
-> Read Hidden
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Hidden
readsPrec :: Int -> ReadS Hidden
$creadList :: ReadS [Hidden]
readList :: ReadS [Hidden]
$creadPrec :: ReadPrec Hidden
readPrec :: ReadPrec Hidden
$creadListPrec :: ReadPrec [Hidden]
readListPrec :: ReadPrec [Hidden]
Read, Int -> Hidden -> ShowS
[Hidden] -> ShowS
Hidden -> String
(Int -> Hidden -> ShowS)
-> (Hidden -> String) -> ([Hidden] -> ShowS) -> Show Hidden
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Hidden -> ShowS
showsPrec :: Int -> Hidden -> ShowS
$cshow :: Hidden -> String
show :: Hidden -> String
$cshowList :: [Hidden] -> ShowS
showList :: [Hidden] -> ShowS
Show)

data UcmLine
  = UcmCommand UcmContext Text
  | -- | Text does not include the '--' prefix.
    UcmComment Text
  | UcmOutputLine Text
  deriving (UcmLine -> UcmLine -> Bool
(UcmLine -> UcmLine -> Bool)
-> (UcmLine -> UcmLine -> Bool) -> Eq UcmLine
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UcmLine -> UcmLine -> Bool
== :: UcmLine -> UcmLine -> Bool
$c/= :: UcmLine -> UcmLine -> Bool
/= :: UcmLine -> UcmLine -> Bool
Eq, Int -> UcmLine -> ShowS
[UcmLine] -> ShowS
UcmLine -> String
(Int -> UcmLine -> ShowS)
-> (UcmLine -> String) -> ([UcmLine] -> ShowS) -> Show UcmLine
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UcmLine -> ShowS
showsPrec :: Int -> UcmLine -> ShowS
$cshow :: UcmLine -> String
show :: UcmLine -> String
$cshowList :: [UcmLine] -> ShowS
showList :: [UcmLine] -> ShowS
Show)

-- | Where a command is run: a project branch (myproject/mybranch>).
data UcmContext
  = -- | Use the current project & branch
    UcmContextEmpty
  | -- | Explicit project & branch
    UcmContextProject (ProjectAndBranch ProjectName ProjectBranchName)
  deriving (UcmContext -> UcmContext -> Bool
(UcmContext -> UcmContext -> Bool)
-> (UcmContext -> UcmContext -> Bool) -> Eq UcmContext
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UcmContext -> UcmContext -> Bool
== :: UcmContext -> UcmContext -> Bool
$c/= :: UcmContext -> UcmContext -> Bool
/= :: UcmContext -> UcmContext -> Bool
Eq, Int -> UcmContext -> ShowS
[UcmContext] -> ShowS
UcmContext -> String
(Int -> UcmContext -> ShowS)
-> (UcmContext -> String)
-> ([UcmContext] -> ShowS)
-> Show UcmContext
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UcmContext -> ShowS
showsPrec :: Int -> UcmContext -> ShowS
$cshow :: UcmContext -> String
show :: UcmContext -> String
$cshowList :: [UcmContext] -> ShowS
showList :: [UcmContext] -> ShowS
Show)

data APIRequest
  = -- URL
    GetRequest Text
  | -- | URL, Body
    PostRequest Text Text
  | APIComment Text
  | APIResponse Text
  deriving (APIRequest -> APIRequest -> Bool
(APIRequest -> APIRequest -> Bool)
-> (APIRequest -> APIRequest -> Bool) -> Eq APIRequest
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: APIRequest -> APIRequest -> Bool
== :: APIRequest -> APIRequest -> Bool
$c/= :: APIRequest -> APIRequest -> Bool
/= :: APIRequest -> APIRequest -> Bool
Eq, Int -> APIRequest -> ShowS
[APIRequest] -> ShowS
APIRequest -> String
(Int -> APIRequest -> ShowS)
-> (APIRequest -> String)
-> ([APIRequest] -> ShowS)
-> Show APIRequest
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> APIRequest -> ShowS
showsPrec :: Int -> APIRequest -> ShowS
$cshow :: APIRequest -> String
show :: APIRequest -> String
$cshowList :: [APIRequest] -> ShowS
showList :: [APIRequest] -> ShowS
Show)

pattern CMarkCodeBlock :: (Maybe CMark.PosInfo) -> Text -> Text -> CMark.Node
pattern $mCMarkCodeBlock :: forall {r}.
Node -> (Maybe PosInfo -> Text -> Text -> r) -> ((# #) -> r) -> r
$bCMarkCodeBlock :: Maybe PosInfo -> Text -> Text -> Node
CMarkCodeBlock pos info body = CMark.Node pos (CMark.CODE_BLOCK info body) []

type Stanza = Either CMark.Node ProcessedBlock

data InfoTags a = InfoTags
  { -- | `Nothing` represents the default value, which differs depending on the `TranscriptType` and `ProcessedBlock`
    --   tag.
    forall a. InfoTags a -> Maybe Hidden
hidden :: Maybe Hidden,
    forall a. InfoTags a -> Bool
expectingError :: ExpectingError,
    forall a. InfoTags a -> Bool
hasBug :: HasBug,
    forall a. InfoTags a -> Bool
generated :: Bool,
    forall a. InfoTags a -> a
additionalTags :: a
  }
  deriving (InfoTags a -> InfoTags a -> Bool
(InfoTags a -> InfoTags a -> Bool)
-> (InfoTags a -> InfoTags a -> Bool) -> Eq (InfoTags a)
forall a. Eq a => InfoTags a -> InfoTags a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => InfoTags a -> InfoTags a -> Bool
== :: InfoTags a -> InfoTags a -> Bool
$c/= :: forall a. Eq a => InfoTags a -> InfoTags a -> Bool
/= :: InfoTags a -> InfoTags a -> Bool
Eq, Eq (InfoTags a)
Eq (InfoTags a) =>
(InfoTags a -> InfoTags a -> Ordering)
-> (InfoTags a -> InfoTags a -> Bool)
-> (InfoTags a -> InfoTags a -> Bool)
-> (InfoTags a -> InfoTags a -> Bool)
-> (InfoTags a -> InfoTags a -> Bool)
-> (InfoTags a -> InfoTags a -> InfoTags a)
-> (InfoTags a -> InfoTags a -> InfoTags a)
-> Ord (InfoTags a)
InfoTags a -> InfoTags a -> Bool
InfoTags a -> InfoTags a -> Ordering
InfoTags a -> InfoTags a -> InfoTags a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (InfoTags a)
forall a. Ord a => InfoTags a -> InfoTags a -> Bool
forall a. Ord a => InfoTags a -> InfoTags a -> Ordering
forall a. Ord a => InfoTags a -> InfoTags a -> InfoTags a
$ccompare :: forall a. Ord a => InfoTags a -> InfoTags a -> Ordering
compare :: InfoTags a -> InfoTags a -> Ordering
$c< :: forall a. Ord a => InfoTags a -> InfoTags a -> Bool
< :: InfoTags a -> InfoTags a -> Bool
$c<= :: forall a. Ord a => InfoTags a -> InfoTags a -> Bool
<= :: InfoTags a -> InfoTags a -> Bool
$c> :: forall a. Ord a => InfoTags a -> InfoTags a -> Bool
> :: InfoTags a -> InfoTags a -> Bool
$c>= :: forall a. Ord a => InfoTags a -> InfoTags a -> Bool
>= :: InfoTags a -> InfoTags a -> Bool
$cmax :: forall a. Ord a => InfoTags a -> InfoTags a -> InfoTags a
max :: InfoTags a -> InfoTags a -> InfoTags a
$cmin :: forall a. Ord a => InfoTags a -> InfoTags a -> InfoTags a
min :: InfoTags a -> InfoTags a -> InfoTags a
Ord, ReadPrec [InfoTags a]
ReadPrec (InfoTags a)
Int -> ReadS (InfoTags a)
ReadS [InfoTags a]
(Int -> ReadS (InfoTags a))
-> ReadS [InfoTags a]
-> ReadPrec (InfoTags a)
-> ReadPrec [InfoTags a]
-> Read (InfoTags a)
forall a. Read a => ReadPrec [InfoTags a]
forall a. Read a => ReadPrec (InfoTags a)
forall a. Read a => Int -> ReadS (InfoTags a)
forall a. Read a => ReadS [InfoTags a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Read a => Int -> ReadS (InfoTags a)
readsPrec :: Int -> ReadS (InfoTags a)
$creadList :: forall a. Read a => ReadS [InfoTags a]
readList :: ReadS [InfoTags a]
$creadPrec :: forall a. Read a => ReadPrec (InfoTags a)
readPrec :: ReadPrec (InfoTags a)
$creadListPrec :: forall a. Read a => ReadPrec [InfoTags a]
readListPrec :: ReadPrec [InfoTags a]
Read, Int -> InfoTags a -> ShowS
[InfoTags a] -> ShowS
InfoTags a -> String
(Int -> InfoTags a -> ShowS)
-> (InfoTags a -> String)
-> ([InfoTags a] -> ShowS)
-> Show (InfoTags a)
forall a. Show a => Int -> InfoTags a -> ShowS
forall a. Show a => [InfoTags a] -> ShowS
forall a. Show a => InfoTags a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> InfoTags a -> ShowS
showsPrec :: Int -> InfoTags a -> ShowS
$cshow :: forall a. Show a => InfoTags a -> String
show :: InfoTags a -> String
$cshowList :: forall a. Show a => [InfoTags a] -> ShowS
showList :: [InfoTags a] -> ShowS
Show, (forall m. Monoid m => InfoTags m -> m)
-> (forall m a. Monoid m => (a -> m) -> InfoTags a -> m)
-> (forall m a. Monoid m => (a -> m) -> InfoTags a -> m)
-> (forall a b. (a -> b -> b) -> b -> InfoTags a -> b)
-> (forall a b. (a -> b -> b) -> b -> InfoTags a -> b)
-> (forall b a. (b -> a -> b) -> b -> InfoTags a -> b)
-> (forall b a. (b -> a -> b) -> b -> InfoTags a -> b)
-> (forall a. (a -> a -> a) -> InfoTags a -> a)
-> (forall a. (a -> a -> a) -> InfoTags a -> a)
-> (forall a. InfoTags a -> [a])
-> (forall a. InfoTags a -> Bool)
-> (forall a. InfoTags a -> Int)
-> (forall a. Eq a => a -> InfoTags a -> Bool)
-> (forall a. Ord a => InfoTags a -> a)
-> (forall a. Ord a => InfoTags a -> a)
-> (forall a. Num a => InfoTags a -> a)
-> (forall a. Num a => InfoTags a -> a)
-> Foldable InfoTags
forall a. Eq a => a -> InfoTags a -> Bool
forall a. Num a => InfoTags a -> a
forall a. Ord a => InfoTags a -> a
forall m. Monoid m => InfoTags m -> m
forall a. InfoTags a -> Bool
forall a. InfoTags a -> Int
forall a. InfoTags a -> [a]
forall a. (a -> a -> a) -> InfoTags a -> a
forall m a. Monoid m => (a -> m) -> InfoTags a -> m
forall b a. (b -> a -> b) -> b -> InfoTags a -> b
forall a b. (a -> b -> b) -> b -> InfoTags a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => InfoTags m -> m
fold :: forall m. Monoid m => InfoTags m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> InfoTags a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> InfoTags a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> InfoTags a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> InfoTags a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> InfoTags a -> b
foldr :: forall a b. (a -> b -> b) -> b -> InfoTags a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> InfoTags a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> InfoTags a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> InfoTags a -> b
foldl :: forall b a. (b -> a -> b) -> b -> InfoTags a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> InfoTags a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> InfoTags a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> InfoTags a -> a
foldr1 :: forall a. (a -> a -> a) -> InfoTags a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> InfoTags a -> a
foldl1 :: forall a. (a -> a -> a) -> InfoTags a -> a
$ctoList :: forall a. InfoTags a -> [a]
toList :: forall a. InfoTags a -> [a]
$cnull :: forall a. InfoTags a -> Bool
null :: forall a. InfoTags a -> Bool
$clength :: forall a. InfoTags a -> Int
length :: forall a. InfoTags a -> Int
$celem :: forall a. Eq a => a -> InfoTags a -> Bool
elem :: forall a. Eq a => a -> InfoTags a -> Bool
$cmaximum :: forall a. Ord a => InfoTags a -> a
maximum :: forall a. Ord a => InfoTags a -> a
$cminimum :: forall a. Ord a => InfoTags a -> a
minimum :: forall a. Ord a => InfoTags a -> a
$csum :: forall a. Num a => InfoTags a -> a
sum :: forall a. Num a => InfoTags a -> a
$cproduct :: forall a. Num a => InfoTags a -> a
product :: forall a. Num a => InfoTags a -> a
Foldable, (forall a b. (a -> b) -> InfoTags a -> InfoTags b)
-> (forall a b. a -> InfoTags b -> InfoTags a) -> Functor InfoTags
forall a b. a -> InfoTags b -> InfoTags a
forall a b. (a -> b) -> InfoTags a -> InfoTags b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> InfoTags a -> InfoTags b
fmap :: forall a b. (a -> b) -> InfoTags a -> InfoTags b
$c<$ :: forall a b. a -> InfoTags b -> InfoTags a
<$ :: forall a b. a -> InfoTags b -> InfoTags a
Functor, Functor InfoTags
Foldable InfoTags
(Functor InfoTags, Foldable InfoTags) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> InfoTags a -> f (InfoTags b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    InfoTags (f a) -> f (InfoTags a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> InfoTags a -> m (InfoTags b))
-> (forall (m :: * -> *) a.
    Monad m =>
    InfoTags (m a) -> m (InfoTags a))
-> Traversable InfoTags
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => InfoTags (m a) -> m (InfoTags a)
forall (f :: * -> *) a.
Applicative f =>
InfoTags (f a) -> f (InfoTags a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> InfoTags a -> m (InfoTags b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> InfoTags a -> f (InfoTags b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> InfoTags a -> f (InfoTags b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> InfoTags a -> f (InfoTags b)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
InfoTags (f a) -> f (InfoTags a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
InfoTags (f a) -> f (InfoTags a)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> InfoTags a -> m (InfoTags b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> InfoTags a -> m (InfoTags b)
$csequence :: forall (m :: * -> *) a. Monad m => InfoTags (m a) -> m (InfoTags a)
sequence :: forall (m :: * -> *) a. Monad m => InfoTags (m a) -> m (InfoTags a)
Traversable)

-- | A set of customizable settings for a transcript.
data Settings = Settings
  { Settings -> Maybe TranscriptType
transcriptType :: Maybe TranscriptType,
    Settings -> Behaviors Maybe
behaviors :: Behaviors Maybe
  }
  deriving (Int -> Settings -> ShowS
[Settings] -> ShowS
Settings -> String
(Int -> Settings -> ShowS)
-> (Settings -> String) -> ([Settings] -> ShowS) -> Show Settings
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Settings -> ShowS
showsPrec :: Int -> Settings -> ShowS
$cshow :: Settings -> String
show :: Settings -> String
$cshowList :: [Settings] -> ShowS
showList :: [Settings] -> ShowS
Show)

instance Aeson.FromJSON Settings where
  parseJSON :: Value -> Parser Settings
parseJSON = \case
    Aeson.Object Object
v ->
      Maybe TranscriptType -> Behaviors Maybe -> Settings
Settings
        (Maybe TranscriptType -> Behaviors Maybe -> Settings)
-> Parser (Maybe TranscriptType)
-> Parser (Behaviors Maybe -> Settings)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe Text -> Maybe TranscriptType)
-> Parser (Maybe Text) -> Parser (Maybe TranscriptType)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> Maybe TranscriptType
resolveType (Text -> Maybe TranscriptType)
-> Maybe Text -> Maybe TranscriptType
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"type")
        Parser (Behaviors Maybe -> Settings)
-> Parser (Behaviors Maybe) -> Parser Settings
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser (Behaviors Maybe)
-> (Value -> Parser (Behaviors Maybe))
-> Maybe Value
-> Parser (Behaviors Maybe)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Behaviors Maybe -> Parser (Behaviors Maybe)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Behaviors Maybe
forall a. Monoid a => a
mempty) ((Maybe Bool -> Behaviors Maybe)
-> Parser (Maybe Bool) -> Parser (Behaviors Maybe)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe)
-> Maybe (ProcessedBlock -> Hidden)
-> Maybe Bool
-> Behaviors Maybe
forall a b c. (a -> b -> c) -> b -> a -> c
flip Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors Maybe (ProcessedBlock -> Hidden)
forall a. Maybe a
Nothing) (Parser (Maybe Bool) -> Parser (Behaviors Maybe))
-> (Value -> Parser (Maybe Bool))
-> Value
-> Parser (Behaviors Maybe)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser (Maybe Bool)
forall a. FromJSON a => Value -> Parser a
Aeson.parseJSON) (Maybe Value -> Parser (Behaviors Maybe))
-> Parser (Maybe Value) -> Parser (Behaviors Maybe)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Object
v Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"autoupdate")
    Value
invalid -> String -> Value -> Parser Settings
forall a. String -> Value -> Parser a
Aeson.typeMismatch String
"Settings" Value
invalid

instance Aeson.ToJSON Settings where
  toJSON :: Settings -> Value
toJSON Settings {Maybe TranscriptType
$sel:transcriptType:Settings :: Settings -> Maybe TranscriptType
transcriptType :: Maybe TranscriptType
transcriptType, Behaviors Maybe
$sel:behaviors:Settings :: Settings -> Behaviors Maybe
behaviors :: Behaviors Maybe
behaviors} =
    [Pair] -> Value
Aeson.object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$
      [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
        [ (Key
"type" Key -> TranscriptType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.=) (TranscriptType -> Pair) -> Maybe TranscriptType -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe TranscriptType
transcriptType,
          (Key
"autoupdate" Key -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
.=) (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Behaviors Maybe -> Maybe Bool
forall (f :: * -> *). Behaviors f -> f Bool
autoupdate Behaviors Maybe
behaviors
        ]

instance Semigroup Settings where
  Settings Maybe TranscriptType
t Behaviors Maybe
b <> :: Settings -> Settings -> Settings
<> Settings Maybe TranscriptType
t' Behaviors Maybe
b' = Maybe TranscriptType -> Behaviors Maybe -> Settings
Settings (Maybe TranscriptType
t Maybe TranscriptType
-> Maybe TranscriptType -> Maybe TranscriptType
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe TranscriptType
t') (Behaviors Maybe -> Settings) -> Behaviors Maybe -> Settings
forall a b. (a -> b) -> a -> b
$ Behaviors Maybe
b Behaviors Maybe -> Behaviors Maybe -> Behaviors Maybe
forall a. Semigroup a => a -> a -> a
<> Behaviors Maybe
b'

instance Monoid Settings where
  mempty :: Settings
mempty = Maybe TranscriptType -> Behaviors Maybe -> Settings
Settings Maybe TranscriptType
forall a. Maybe a
Nothing Behaviors Maybe
forall a. Monoid a => a
mempty

settings :: Transcript -> Settings
settings :: Transcript -> Settings
settings = (Settings -> Settings) -> Result Settings -> Settings
forall m a. Monoid m => (a -> m) -> Result a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Settings -> Settings
forall a. a -> a
id (Result Settings -> Settings)
-> (Transcript -> Result Settings) -> Transcript -> Settings
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Result Settings
forall a. FromJSON a => Value -> Result a
Aeson.fromJSON (Value -> Result Settings)
-> (Transcript -> Value) -> Transcript -> Result Settings
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Transcript -> Value
frontmatter

-- | The atomic behaviors that can be controlled by settings. They may be set individually, or implied by some aggregate
--   setting.
data Behaviors f = Behaviors
  { forall (f :: * -> *). Behaviors f -> f Bool
autoupdate :: f Bool,
    forall (f :: * -> *). Behaviors f -> f (ProcessedBlock -> Hidden)
getHidden :: f (ProcessedBlock -> Hidden)
  }

-- | `Behaviors` _may_ contain functions, so this instance outputs “_” in place of any functions.
instance (Show1 f) => Show (Behaviors f) where
  showsPrec :: Int -> Behaviors f -> ShowS
showsPrec Int
p Behaviors {f Bool
$sel:autoupdate:Behaviors :: forall (f :: * -> *). Behaviors f -> f Bool
autoupdate :: f Bool
autoupdate, f (ProcessedBlock -> Hidden)
$sel:getHidden:Behaviors :: forall (f :: * -> *). Behaviors f -> f (ProcessedBlock -> Hidden)
getHidden :: f (ProcessedBlock -> Hidden)
getHidden} =
    let appPrec :: Int
appPrec = Int
10
        nextPrec :: Int
nextPrec = Int
appPrec Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
     in Bool -> ShowS -> ShowS
showParen (Int
nextPrec Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
p) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
          String -> ShowS
showString String
"Behaviors"
            ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> f Bool -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
nextPrec f Bool
autoupdate
            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 -> (ProcessedBlock -> Hidden) -> ShowS)
-> ([ProcessedBlock -> Hidden] -> ShowS)
-> Int
-> f (ProcessedBlock -> Hidden)
-> ShowS
forall a.
(Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS
forall (f :: * -> *) a.
Show1 f =>
(Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> f a -> ShowS
liftShowsPrec (\Int
_ ProcessedBlock -> Hidden
_ -> (String
"_" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>)) (((ProcessedBlock -> Hidden) -> ShowS)
-> [ProcessedBlock -> Hidden] -> ShowS
forall a. (a -> ShowS) -> [a] -> ShowS
showList__ (ShowS -> (ProcessedBlock -> Hidden) -> ShowS
forall a b. a -> b -> a
const (String
"_" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>))) Int
nextPrec f (ProcessedBlock -> Hidden)
getHidden

instance Semigroup (Behaviors Maybe) where
  Behaviors Maybe Bool
a Maybe (ProcessedBlock -> Hidden)
h <> :: Behaviors Maybe -> Behaviors Maybe -> Behaviors Maybe
<> Behaviors Maybe Bool
a' Maybe (ProcessedBlock -> Hidden)
h' = Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors (Maybe Bool
a Maybe Bool -> Maybe Bool -> Maybe Bool
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Bool
a') (Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe)
-> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall a b. (a -> b) -> a -> b
$ Maybe (ProcessedBlock -> Hidden)
h Maybe (ProcessedBlock -> Hidden)
-> Maybe (ProcessedBlock -> Hidden)
-> Maybe (ProcessedBlock -> Hidden)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe (ProcessedBlock -> Hidden)
h'

instance Monoid (Behaviors Maybe) where
  mempty :: Behaviors Maybe
mempty = Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors Maybe Bool
forall a. Maybe a
Nothing Maybe (ProcessedBlock -> Hidden)
forall a. Maybe a
Nothing

extractBehaviors :: Settings -> Behaviors Identity
extractBehaviors :: Settings -> Behaviors Identity
extractBehaviors Settings {Maybe TranscriptType
$sel:transcriptType:Settings :: Settings -> Maybe TranscriptType
transcriptType :: Maybe TranscriptType
transcriptType, Behaviors Maybe
$sel:behaviors:Settings :: Settings -> Behaviors Maybe
behaviors :: Behaviors Maybe
behaviors} =
  let unified :: Behaviors Maybe
unified = Behaviors Maybe
behaviors Behaviors Maybe -> Behaviors Maybe -> Behaviors Maybe
forall a. Semigroup a => a -> a -> a
<> TranscriptType -> Behaviors Maybe
transcriptBehaviors (TranscriptType -> Maybe TranscriptType -> TranscriptType
forall a. a -> Maybe a -> a
fromMaybe TranscriptType
Standard Maybe TranscriptType
transcriptType)
      determineBehavior :: (forall f. Behaviors f -> f a) -> Identity a
      determineBehavior :: forall a. (forall (f :: * -> *). Behaviors f -> f a) -> Identity a
determineBehavior forall (f :: * -> *). Behaviors f -> f a
field = Identity a -> (a -> Identity a) -> Maybe a -> Identity a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Behaviors Identity -> Identity a
forall (f :: * -> *). Behaviors f -> f a
field Behaviors Identity
defaultBehaviors) a -> Identity a
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe a -> Identity a) -> Maybe a -> Identity a
forall a b. (a -> b) -> a -> b
$ Behaviors Maybe -> Maybe a
forall (f :: * -> *). Behaviors f -> f a
field Behaviors Maybe
unified
   in Identity Bool
-> Identity (ProcessedBlock -> Hidden) -> Behaviors Identity
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors ((forall (f :: * -> *). Behaviors f -> f Bool) -> Identity Bool
forall a. (forall (f :: * -> *). Behaviors f -> f a) -> Identity a
determineBehavior Behaviors f -> f Bool
forall (f :: * -> *). Behaviors f -> f Bool
autoupdate) (Identity (ProcessedBlock -> Hidden) -> Behaviors Identity)
-> Identity (ProcessedBlock -> Hidden) -> Behaviors Identity
forall a b. (a -> b) -> a -> b
$ (forall (f :: * -> *). Behaviors f -> f (ProcessedBlock -> Hidden))
-> Identity (ProcessedBlock -> Hidden)
forall a. (forall (f :: * -> *). Behaviors f -> f a) -> Identity a
determineBehavior Behaviors f -> f (ProcessedBlock -> Hidden)
forall (f :: * -> *). Behaviors f -> f (ProcessedBlock -> Hidden)
getHidden

defaultBehaviors :: Behaviors Identity
defaultBehaviors :: Behaviors Identity
defaultBehaviors = Identity Bool
-> Identity (ProcessedBlock -> Hidden) -> Behaviors Identity
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors (Bool -> Identity Bool
forall a. a -> Identity a
Identity Bool
False) (Identity (ProcessedBlock -> Hidden) -> Behaviors Identity)
-> ((ProcessedBlock -> Hidden)
    -> Identity (ProcessedBlock -> Hidden))
-> (ProcessedBlock -> Hidden)
-> Behaviors Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProcessedBlock -> Hidden) -> Identity (ProcessedBlock -> Hidden)
forall a. a -> Identity a
Identity ((ProcessedBlock -> Hidden) -> Behaviors Identity)
-> (ProcessedBlock -> Hidden) -> Behaviors Identity
forall a b. (a -> b) -> a -> b
$ Hidden -> Maybe Hidden -> Hidden
forall a. a -> Maybe a -> a
fromMaybe Hidden
Shown (Maybe Hidden -> Hidden)
-> (ProcessedBlock -> Maybe Hidden) -> ProcessedBlock -> Hidden
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InfoTags () -> Maybe Hidden
forall a. InfoTags a -> Maybe Hidden
hidden (InfoTags () -> Maybe Hidden)
-> (ProcessedBlock -> InfoTags ())
-> ProcessedBlock
-> Maybe Hidden
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProcessedBlock -> InfoTags ()
getCommonInfoTags

-- | Different types make various settingal changes.
data TranscriptType
  = -- | The default type, nothing changed from the default setting.
    Standard
  | -- | Enables auto-update and changes the default hidden value for `Unison` blocks to `HideOutput`.
    Tutorial
  deriving (TranscriptType -> TranscriptType -> Bool
(TranscriptType -> TranscriptType -> Bool)
-> (TranscriptType -> TranscriptType -> Bool) -> Eq TranscriptType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TranscriptType -> TranscriptType -> Bool
== :: TranscriptType -> TranscriptType -> Bool
$c/= :: TranscriptType -> TranscriptType -> Bool
/= :: TranscriptType -> TranscriptType -> Bool
Eq, Eq TranscriptType
Eq TranscriptType =>
(TranscriptType -> TranscriptType -> Ordering)
-> (TranscriptType -> TranscriptType -> Bool)
-> (TranscriptType -> TranscriptType -> Bool)
-> (TranscriptType -> TranscriptType -> Bool)
-> (TranscriptType -> TranscriptType -> Bool)
-> (TranscriptType -> TranscriptType -> TranscriptType)
-> (TranscriptType -> TranscriptType -> TranscriptType)
-> Ord TranscriptType
TranscriptType -> TranscriptType -> Bool
TranscriptType -> TranscriptType -> Ordering
TranscriptType -> TranscriptType -> TranscriptType
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TranscriptType -> TranscriptType -> Ordering
compare :: TranscriptType -> TranscriptType -> Ordering
$c< :: TranscriptType -> TranscriptType -> Bool
< :: TranscriptType -> TranscriptType -> Bool
$c<= :: TranscriptType -> TranscriptType -> Bool
<= :: TranscriptType -> TranscriptType -> Bool
$c> :: TranscriptType -> TranscriptType -> Bool
> :: TranscriptType -> TranscriptType -> Bool
$c>= :: TranscriptType -> TranscriptType -> Bool
>= :: TranscriptType -> TranscriptType -> Bool
$cmax :: TranscriptType -> TranscriptType -> TranscriptType
max :: TranscriptType -> TranscriptType -> TranscriptType
$cmin :: TranscriptType -> TranscriptType -> TranscriptType
min :: TranscriptType -> TranscriptType -> TranscriptType
Ord, ReadPrec [TranscriptType]
ReadPrec TranscriptType
Int -> ReadS TranscriptType
ReadS [TranscriptType]
(Int -> ReadS TranscriptType)
-> ReadS [TranscriptType]
-> ReadPrec TranscriptType
-> ReadPrec [TranscriptType]
-> Read TranscriptType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS TranscriptType
readsPrec :: Int -> ReadS TranscriptType
$creadList :: ReadS [TranscriptType]
readList :: ReadS [TranscriptType]
$creadPrec :: ReadPrec TranscriptType
readPrec :: ReadPrec TranscriptType
$creadListPrec :: ReadPrec [TranscriptType]
readListPrec :: ReadPrec [TranscriptType]
Read, Int -> TranscriptType -> ShowS
[TranscriptType] -> ShowS
TranscriptType -> String
(Int -> TranscriptType -> ShowS)
-> (TranscriptType -> String)
-> ([TranscriptType] -> ShowS)
-> Show TranscriptType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TranscriptType -> ShowS
showsPrec :: Int -> TranscriptType -> ShowS
$cshow :: TranscriptType -> String
show :: TranscriptType -> String
$cshowList :: [TranscriptType] -> ShowS
showList :: [TranscriptType] -> ShowS
Show)

resolveType :: Text -> Maybe TranscriptType
resolveType :: Text -> Maybe TranscriptType
resolveType = \case
  Text
"standard" -> TranscriptType -> Maybe TranscriptType
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TranscriptType
Standard
  Text
"tutorial" -> TranscriptType -> Maybe TranscriptType
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TranscriptType
Tutorial
  Text
_ -> Maybe TranscriptType
forall a. Maybe a
Nothing

instance Aeson.ToJSON TranscriptType where
  toJSON :: TranscriptType -> Value
toJSON = \case
    TranscriptType
Standard -> Value
"standard"
    TranscriptType
Tutorial -> Value
"tutorial"

transcriptBehaviors :: TranscriptType -> Behaviors Maybe
transcriptBehaviors :: TranscriptType -> Behaviors Maybe
transcriptBehaviors = \case
  TranscriptType
Standard -> Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors Maybe Bool
forall a. Maybe a
Nothing Maybe (ProcessedBlock -> Hidden)
forall a. Maybe a
Nothing
  TranscriptType
Tutorial -> Maybe Bool -> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall (f :: * -> *).
f Bool -> f (ProcessedBlock -> Hidden) -> Behaviors f
Behaviors (Bool -> Maybe Bool
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True) (Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe)
-> Maybe (ProcessedBlock -> Hidden) -> Behaviors Maybe
forall a b. (a -> b) -> a -> b
$ (ProcessedBlock -> Hidden) -> Maybe (ProcessedBlock -> Hidden)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure \case
    Unison InfoTags (Maybe Text)
tags Text
_ -> Hidden -> Maybe Hidden -> Hidden
forall a. a -> Maybe a -> a
fromMaybe Hidden
HideOutput (Maybe Hidden -> Hidden) -> Maybe Hidden -> Hidden
forall a b. (a -> b) -> a -> b
$ InfoTags (Maybe Text) -> Maybe Hidden
forall a. InfoTags a -> Maybe Hidden
hidden InfoTags (Maybe Text)
tags
    ProcessedBlock
block -> Hidden -> Maybe Hidden -> Hidden
forall a. a -> Maybe a -> a
fromMaybe Hidden
Shown (Maybe Hidden -> Hidden)
-> (InfoTags () -> Maybe Hidden) -> InfoTags () -> Hidden
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InfoTags () -> Maybe Hidden
forall a. InfoTags a -> Maybe Hidden
hidden (InfoTags () -> Hidden) -> InfoTags () -> Hidden
forall a b. (a -> b) -> a -> b
$ ProcessedBlock -> InfoTags ()
getCommonInfoTags ProcessedBlock
block

defaultInfoTags :: a -> InfoTags a
defaultInfoTags :: forall a. a -> InfoTags a
defaultInfoTags = Maybe Hidden -> Bool -> Bool -> Bool -> a -> InfoTags a
forall a. Maybe Hidden -> Bool -> Bool -> Bool -> a -> InfoTags a
InfoTags Maybe Hidden
forall a. Maybe a
Nothing Bool
False Bool
False Bool
False

data ProcessedBlock
  = Ucm (InfoTags ()) [UcmLine]
  | Unison (InfoTags (Maybe ScratchFileName)) Text
  | API (InfoTags ()) [APIRequest]
  deriving (ProcessedBlock -> ProcessedBlock -> Bool
(ProcessedBlock -> ProcessedBlock -> Bool)
-> (ProcessedBlock -> ProcessedBlock -> Bool) -> Eq ProcessedBlock
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ProcessedBlock -> ProcessedBlock -> Bool
== :: ProcessedBlock -> ProcessedBlock -> Bool
$c/= :: ProcessedBlock -> ProcessedBlock -> Bool
/= :: ProcessedBlock -> ProcessedBlock -> Bool
Eq, Int -> ProcessedBlock -> ShowS
[ProcessedBlock] -> ShowS
ProcessedBlock -> String
(Int -> ProcessedBlock -> ShowS)
-> (ProcessedBlock -> String)
-> ([ProcessedBlock] -> ShowS)
-> Show ProcessedBlock
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ProcessedBlock -> ShowS
showsPrec :: Int -> ProcessedBlock -> ShowS
$cshow :: ProcessedBlock -> String
show :: ProcessedBlock -> String
$cshowList :: [ProcessedBlock] -> ShowS
showList :: [ProcessedBlock] -> ShowS
Show)

getCommonInfoTags :: ProcessedBlock -> InfoTags ()
getCommonInfoTags :: ProcessedBlock -> InfoTags ()
getCommonInfoTags = \case
  Ucm InfoTags ()
tags [UcmLine]
_ -> InfoTags ()
tags
  Unison InfoTags (Maybe Text)
tags Text
_ -> () () -> InfoTags (Maybe Text) -> InfoTags ()
forall a b. a -> InfoTags b -> InfoTags a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ InfoTags (Maybe Text)
tags
  API InfoTags ()
tags [APIRequest]
_ -> InfoTags ()
tags