-- | A module for miscellaneous tier-3 functions and constants.

module Hydra.Tier3 where

import qualified Hydra.Compute as Compute
import qualified Hydra.Core as Core
import qualified Hydra.Lib.Io as Io
import qualified Hydra.Lib.Lists as Lists
import qualified Hydra.Lib.Logic as Logic
import qualified Hydra.Lib.Maps as Maps
import qualified Hydra.Lib.Strings as Strings
import Data.Int
import Data.List as L
import Data.Map as M
import Data.Set as S

-- | Summarize a trace as a string
traceSummary :: (Compute.Trace -> String)
traceSummary :: Trace -> String
traceSummary Trace
t =  
  let messageLines :: [String]
messageLines = ([String] -> [String]
forall a. Eq a => [a] -> [a]
Lists.nub (Trace -> [String]
Compute.traceMessages Trace
t)) 
      keyvalLines :: [String]
keyvalLines = ([String] -> [String] -> Bool -> [String]
forall a. a -> a -> Bool -> a
Logic.ifElse [] (String -> [String] -> [String]
forall a. a -> [a] -> [a]
Lists.cons String
"key/value pairs: " (((Name, Term) -> String) -> [(Name, Term)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
Lists.map (Name, Term) -> String
toLine (Map Name Term -> [(Name, Term)]
forall k v. Map k v -> [(k, v)]
Maps.toList (Trace -> Map Name Term
Compute.traceOther Trace
t)))) (Map Name Term -> Bool
forall k v. Map k v -> Bool
Maps.isEmpty (Trace -> Map Name Term
Compute.traceOther Trace
t)))
      toLine :: (Name, Term) -> String
toLine = (\(Name, Term)
pair -> [String] -> String
Strings.cat [
              [String] -> String
Strings.cat [
                [String] -> String
Strings.cat [
                  String
"\t",
                  (Name -> String
Core.unName ((Name, Term) -> Name
forall a b. (a, b) -> a
fst (Name, Term)
pair))],
                String
": "],
              (Term -> String
Io.showTerm ((Name, Term) -> Term
forall a b. (a, b) -> b
snd (Name, Term)
pair))])
  in (String -> [String] -> String
Strings.intercalate String
"\n" ([String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
Lists.concat2 [String]
messageLines [String]
keyvalLines))