-------------------------------------------------------------------------------
-- Schmitty the Solver
--
-- Defines the `Printable` class, which  provides pretty-printers that print
-- the sorts, literals, and identifiers to their corresponding SMT-LIB terms.
-- To help define these functions, this module also exports `mkSTerm`, which
-- prints a list of strings as an S-expression.
--------------------------------------------------------------------------------

module SMT.Theory.Class.Printable where

open import Data.List using (List)
open import Data.String as String using (String)
open import Function using (_∘_)
open import SMT.Theory.Base


record Printable (theory : Theory) : Set where
  open Theory theory
  field
    showSort       : Sort  String
    showLiteral    : {σ : Sort}  Literal σ  String
    showIdentifier : {σ : Sort} {Σ : Signature σ}  Identifier Σ  String


-----------------------
-- Printer utilities --
-----------------------

-- |Create an S-expression from a list of strings.
--
-- @
--   mkSTerm ("*" ∷ "4" ∷ "5") ≡ "(* 4 5)"
-- @
--
mkSTerm : List String  String
mkSTerm = String.parens  String.unwords