diff --git a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Constraint.hs b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Constraint.hs index adca463d0..565bf7f01 100644 --- a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Constraint.hs +++ b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Constraint.hs @@ -14,7 +14,6 @@ where import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey) import GHC.Generics (Generic) import qualified Prettyprinter as PP -import Smol.Core.Printer import Smol.Core.Typecheck.Typeclass.Types.TypeclassName import Smol.Core.Types @@ -88,13 +87,13 @@ deriving anyclass instance FromJSONKey (Constraint dep ann) instance - ( Printer (dep Identifier), - Printer (dep TypeName) + ( PP.Pretty (dep Identifier), + PP.Pretty (dep TypeName) ) => - Printer (Constraint dep ann) + PP.Pretty (Constraint dep ann) where - prettyDoc (Constraint tcn tys) = - prettyDoc tcn + pretty (Constraint tcn tys) = + PP.pretty tcn PP.<+> PP.concatWith (\a b -> a <> " " <> b) - (prettyDoc <$> tys) + (PP.pretty <$> tys) diff --git a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Typeclass.hs b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Typeclass.hs index 112dd7389..d52c53896 100644 --- a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Typeclass.hs +++ b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/Typeclass.hs @@ -73,15 +73,15 @@ deriving anyclass instance ) => FromJSON (Typeclass dep ann) -instance Printer (Typeclass ParseDep ann) where - prettyDoc (Typeclass {tcName, tcArgs, tcFuncName, tcFuncType}) = +instance PP.Pretty (Typeclass ParseDep ann) where + pretty (Typeclass {tcName, tcArgs, tcFuncName, tcFuncType}) = "class" - <+> prettyDoc tcName + <+> PP.pretty tcName <+> PP.concatWith (\a b -> a <> ", " <> b) - (prettyDoc <$> tcArgs) + (PP.pretty <$> tcArgs) <+> "{" - <+> prettyDoc tcFuncName + <+> PP.pretty tcFuncName <> ":" - <+> prettyDoc tcFuncType + <+> PP.pretty tcFuncType <+> "}" diff --git a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/TypeclassName.hs b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/TypeclassName.hs index 4f7a6b1ab..2f42cd249 100644 --- a/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/TypeclassName.hs +++ b/smol-core/src/Smol/Core/Typecheck/Typeclass/Types/TypeclassName.hs @@ -17,8 +17,7 @@ import Data.String import Data.Text (Text) import qualified Data.Text as T import GHC.Generics -import Prettyprinter -import Smol.Core.Printer +import qualified Prettyprinter as PP -- | A TypeclassName is like `Either` or `Maybe`. -- It must start with a capital letter. @@ -62,5 +61,5 @@ safeMkTypeclassName a = then Just (TypeclassName a) else Nothing -instance Printer TypeclassName where - prettyDoc = pretty . getTypeclassName +instance PP.Pretty TypeclassName where + pretty = PP.pretty . getTypeclassName diff --git a/smol-core/src/Smol/Core/Types/Constructor.hs b/smol-core/src/Smol/Core/Types/Constructor.hs index f8f8d2ada..c2c291e3e 100644 --- a/smol-core/src/Smol/Core/Types/Constructor.hs +++ b/smol-core/src/Smol/Core/Types/Constructor.hs @@ -16,7 +16,6 @@ import Data.String import Data.Text (Text) import qualified Data.Text as T import qualified Prettyprinter as PP -import Smol.Core.Printer newtype Constructor = Constructor Text deriving newtype @@ -30,8 +29,8 @@ newtype Constructor = Constructor Text Semigroup ) -instance Printer Constructor where - prettyDoc (Constructor c) = PP.pretty c +instance PP.Pretty Constructor where + pretty (Constructor c) = PP.pretty c instance IsString Constructor where fromString = Constructor . T.pack diff --git a/smol-core/src/Smol/Core/Types/Identifier.hs b/smol-core/src/Smol/Core/Types/Identifier.hs index feb606f00..b32506b61 100644 --- a/smol-core/src/Smol/Core/Types/Identifier.hs +++ b/smol-core/src/Smol/Core/Types/Identifier.hs @@ -16,7 +16,6 @@ import Data.String import Data.Text (Text) import qualified Data.Text as T import qualified Prettyprinter as PP -import Smol.Core.Printer newtype Identifier = Identifier Text deriving newtype @@ -30,8 +29,8 @@ newtype Identifier = Identifier Text Semigroup ) -instance Printer Identifier where - prettyDoc (Identifier i) = PP.pretty i +instance PP.Pretty Identifier where + pretty (Identifier i) = PP.pretty i instance IsString Identifier where fromString = Identifier . T.pack diff --git a/smol-core/src/Smol/Core/Types/Op.hs b/smol-core/src/Smol/Core/Types/Op.hs index a2be4e3ac..95bb9dbf5 100644 --- a/smol-core/src/Smol/Core/Types/Op.hs +++ b/smol-core/src/Smol/Core/Types/Op.hs @@ -10,12 +10,12 @@ where import Data.Aeson (FromJSON, ToJSON) import GHC.Generics (Generic) -import Smol.Core.Printer +import qualified Prettyprinter as PP data Op = OpAdd | OpEquals deriving stock (Eq, Ord, Show, Generic) deriving anyclass (FromJSON, ToJSON) -instance Printer Op where - prettyDoc OpAdd = "+" - prettyDoc OpEquals = "==" +instance PP.Pretty Op where + pretty OpAdd = "+" + pretty OpEquals = "==" diff --git a/smol-core/src/Smol/Core/Types/Pattern.hs b/smol-core/src/Smol/Core/Types/Pattern.hs index 6aefb69bb..00d014d2a 100644 --- a/smol-core/src/Smol/Core/Types/Pattern.hs +++ b/smol-core/src/Smol/Core/Types/Pattern.hs @@ -17,7 +17,6 @@ import Data.Aeson (FromJSON, ToJSON) import qualified Data.List.NonEmpty as NE import GHC.Generics (Generic) import qualified Prettyprinter as PP -import Smol.Core.Printer import Smol.Core.Types.Constructor import Smol.Core.Types.Identifier import Smol.Core.Types.Prim @@ -67,70 +66,41 @@ deriving anyclass instance ) => ToJSON (Pattern dep ann) -_inParens :: (Printer a) => a -> PP.Doc style -_inParens = PP.parens . prettyDoc +_inParens :: (PP.Pretty a) => a -> PP.Doc style +_inParens = PP.parens . PP.pretty -- print simple things with no brackets, and complex things inside brackets printSubPattern :: - ( Printer (dep Constructor), - Printer (dep Identifier) + ( PP.Pretty (dep Constructor), + PP.Pretty (dep Identifier) ) => Pattern dep ann -> PP.Doc style printSubPattern pat = case pat of - all'@PConstructor {} -> prettyDoc all' -- inParens all' - a -> prettyDoc a + all'@PConstructor {} -> PP.pretty all' -- inParens all' + a -> PP.pretty a instance - ( Printer (dep Constructor), - Printer (dep Identifier) + ( PP.Pretty (dep Constructor), + PP.Pretty (dep Identifier) ) => - Printer (Pattern dep ann) + PP.Pretty (Pattern dep ann) where - prettyDoc (PWildcard _) = "_" - prettyDoc (PVar _ a) = prettyDoc a - prettyDoc (PLiteral _ lit) = prettyDoc lit - prettyDoc (PConstructor _ tyCon args) = + pretty (PWildcard _) = "_" + pretty (PVar _ a) = PP.pretty a + pretty (PLiteral _ lit) = PP.pretty lit + pretty (PConstructor _ tyCon args) = let prettyArgs = case args of [] -> mempty _ -> foldr ((\a b -> " " <> a <> b) . printSubPattern) mempty args - in prettyDoc tyCon <> prettyArgs - prettyDoc (PTuple _ a as) = - "(" <> PP.hsep (PP.punctuate "," (prettyDoc <$> ([a] <> NE.toList as))) <> ")" - prettyDoc (PArray _ as spread) = + in PP.pretty tyCon <> prettyArgs + pretty (PTuple _ a as) = + "(" <> PP.hsep (PP.punctuate "," (PP.pretty <$> ([a] <> NE.toList as))) <> ")" + pretty (PArray _ as spread) = "[" <> PP.concatWith (\a b -> a <> ", " <> b) - (prettyDoc <$> as) - <> prettyDoc spread + (PP.pretty <$> as) + <> PP.pretty spread <> "]" -{- - prettyDoc (PRecord _ map') = - let items = M.toList map' - printRow i (name, val) = - let item = case val of - (PVar _ vName) | vName == name -> prettyDoc name - _ -> - prettyDoc name - <> ":" - <+> printSubPattern val - in item <> if i < length items then "," else "" - in case items of - [] -> "{}" - rows -> - let prettyRows = mapWithIndex printRow rows - in group - ( "{" - <+> align - ( vsep - prettyRows - ) - <+> "}" - ) - --} -{- - prettyDoc (PString _ a as) = - prettyDoc a <> " ++ " <> prettyDoc as --} diff --git a/smol-core/src/Smol/Core/Types/PatternMatchError.hs b/smol-core/src/Smol/Core/Types/PatternMatchError.hs index 2d731fe83..d955e8725 100644 --- a/smol-core/src/Smol/Core/Types/PatternMatchError.hs +++ b/smol-core/src/Smol/Core/Types/PatternMatchError.hs @@ -13,8 +13,7 @@ where import Data.Set (Set) import qualified Data.Text as T -import Prettyprinter -import Smol.Core.Printer +import qualified Prettyprinter as PP import Smol.Core.Types import Text.Megaparsec @@ -38,11 +37,11 @@ data PatternMatchError ann instance Semigroup (PatternMatchError ann) where a <> _ = a -instance Printer (PatternMatchError ann) where - prettyDoc = vsep . renderPatternMatchError +instance PP.Pretty (PatternMatchError ann) where + pretty = vsep . renderPatternMatchError instance ShowErrorComponent (PatternMatchError Annotation) where - showErrorComponent = T.unpack . renderWithWidth 40 . prettyDoc + showErrorComponent = T.unpack . renderWithWidth 40 . PP.pretty errorComponentLen pmErr = let (_, len) = getErrorPos pmErr in len type Start = Int diff --git a/smol-core/src/Smol/Core/Types/Prim.hs b/smol-core/src/Smol/Core/Types/Prim.hs index a2f7e9d1f..e8fbdb401 100644 --- a/smol-core/src/Smol/Core/Types/Prim.hs +++ b/smol-core/src/Smol/Core/Types/Prim.hs @@ -13,7 +13,6 @@ import Data.Aeson (FromJSON, ToJSON) import Data.Text (Text) import GHC.Generics (Generic) import qualified Prettyprinter as PP -import Smol.Core.Printer data Prim = PUnit @@ -23,8 +22,8 @@ data Prim deriving stock (Eq, Ord, Show, Generic) deriving anyclass (FromJSON, ToJSON) -instance Printer Prim where - prettyDoc = renderPrim +instance PP.Pretty Prim where + pretty = renderPrim renderPrim :: Prim -> PP.Doc doc renderPrim (PInt i) = PP.pretty i diff --git a/smol-core/src/Smol/Core/Types/Spread.hs b/smol-core/src/Smol/Core/Types/Spread.hs index 9b2d7d885..73aaf047a 100644 --- a/smol-core/src/Smol/Core/Types/Spread.hs +++ b/smol-core/src/Smol/Core/Types/Spread.hs @@ -12,8 +12,8 @@ where import qualified Data.Aeson as JSON import GHC.Generics -import Smol.Core.Printer import Smol.Core.Types.Identifier +import qualified Prettyprinter as PP data Spread dep ann = NoSpread @@ -51,7 +51,7 @@ deriving anyclass instance (JSON.ToJSON ann, JSON.ToJSON (dep Identifier)) => JSON.ToJSON (Spread dep ann) -instance (Printer (dep Identifier)) => Printer (Spread dep ann) where - prettyDoc NoSpread = "" - prettyDoc (SpreadWildcard _) = ", ..." - prettyDoc (SpreadValue _ a) = ", ..." <> prettyDoc a +instance (PP.Pretty (dep Identifier)) => PP.Pretty (Spread dep ann) where + pretty NoSpread = "" + pretty (SpreadWildcard _) = ", ..." + pretty (SpreadValue _ a) = ", ..." <> PP.pretty a diff --git a/smol-core/src/Smol/Core/Types/Type.hs b/smol-core/src/Smol/Core/Types/Type.hs index f6977ccd1..7f70e91e8 100644 --- a/smol-core/src/Smol/Core/Types/Type.hs +++ b/smol-core/src/Smol/Core/Types/Type.hs @@ -18,6 +18,7 @@ module Smol.Core.Types.Type ) where +import qualified Prettyprinter as PP import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey) import qualified Data.List.NonEmpty as NE import Data.Map.Strict @@ -29,7 +30,6 @@ import Data.Word (Word64) import GHC.Generics (Generic) import Prettyprinter ((<+>)) import qualified Prettyprinter as PP -import Smol.Core.Printer import Smol.Core.Types.Identifier import Smol.Core.Types.Op import Smol.Core.Types.ParseDep @@ -44,10 +44,10 @@ data TypePrim = TPInt | TPBool | TPString deriving stock (Eq, Ord, Show, Generic) deriving anyclass (FromJSON, ToJSON) -instance Printer TypePrim where - prettyDoc TPInt = "Int" - prettyDoc TPBool = "Bool" - prettyDoc TPString = "String" +instance PP.Pretty TypePrim where + pretty TPInt = "Int" + pretty TPBool = "Bool" + pretty TPString = "String" data TypeLiteral = TLBool Bool @@ -57,13 +57,13 @@ data TypeLiteral deriving stock (Eq, Ord, Show, Generic) deriving anyclass (FromJSON, ToJSON) -instance Printer TypeLiteral where - prettyDoc (TLBool b) = PP.pretty b - prettyDoc (TLInt neInts) = +instance PP.Pretty TypeLiteral where + pretty (TLBool b) = PP.pretty b + pretty (TLInt neInts) = PP.hsep (PP.punctuate "| " (PP.pretty <$> S.toList (NES.toSet neInts))) - prettyDoc (TLString neStrs) = + pretty (TLString neStrs) = PP.hsep (PP.punctuate "| " (PP.pretty <$> S.toList (NES.toSet neStrs))) - prettyDoc TLUnit = "Unit" + pretty TLUnit = "Unit" data Type dep ann = TLiteral ann TypeLiteral @@ -128,20 +128,21 @@ deriving anyclass instance ) => FromJSONKey (Type dep ann) -instance (Printer (dep Identifier), Printer (dep TypeName)) => Printer (Type dep ann) where - prettyDoc = renderType +instance (PP.Pretty (dep Identifier), PP.Pretty (dep TypeName)) => + PP.Pretty (Type dep ann) where + pretty = renderType renderType :: - ( Printer (dep Identifier), - Printer (dep TypeName) + ( PP.Pretty (dep Identifier), + PP.Pretty (dep TypeName) ) => Type dep ann -> PP.Doc style -renderType (TPrim _ a) = prettyDoc a -renderType (TInfix _ op a b) = prettyDoc a <+> prettyDoc op <+> prettyDoc b -renderType (TLiteral _ l) = prettyDoc l +renderType (TPrim _ a) = PP.pretty a +renderType (TInfix _ op a b) = PP.pretty a <+> PP.pretty op <+> PP.pretty b +renderType (TLiteral _ l) = PP.pretty l renderType (TUnknown _ i) = "U" <> PP.pretty i -renderType (TArray _ _ as) = "[" <> prettyDoc as <> "]" +renderType (TArray _ _ as) = "[" <> PP.pretty as <> "]" renderType (TFunc _ _ a b) = withParens a <+> "->" <+> renderType b renderType (TTuple _ a as) = @@ -149,19 +150,19 @@ renderType (TTuple _ a as) = renderType (TRecord _ as) = renderRecord as -- renderType (TArray _ a) = "[" <+> renderType a <+> "]" -renderType (TVar _ a) = prettyDoc a +renderType (TVar _ a) = PP.pretty a renderType (TConstructor _ tyCon) = - prettyDoc tyCon + PP.pretty tyCon renderType mt@(TApp _ func arg) = case varsFromDataType mt of Just (tyCon, vars) -> - let typeName = prettyDoc tyCon + let typeName = PP.pretty tyCon in PP.align $ PP.sep ([typeName] <> (withParens <$> vars)) Nothing -> PP.align $ PP.sep [renderType func, renderType arg] renderRecord :: - (Printer (dep Identifier), Printer (dep TypeName)) => + (PP.Pretty (dep Identifier), PP.Pretty (dep TypeName)) => Map Identifier (Type dep ann) -> PP.Doc style renderRecord as = @@ -181,7 +182,7 @@ renderRecord as = <> PP.line <> "}" where - renderItem (k, v) = prettyDoc k <> ":" <+> withParens v + renderItem (k, v) = PP.pretty k <> ":" <+> withParens v -- turn nested shit back into something easy to pretty print (ie, easy to -- bracket) @@ -199,7 +200,7 @@ varsFromDataType mt = _ -> Nothing in getInner mt -withParens :: (Printer (dep Identifier), Printer (dep TypeName)) => Type dep ann -> PP.Doc a +withParens :: (PP.Pretty (dep Identifier), PP.Pretty (dep TypeName)) => Type dep ann -> PP.Doc a withParens ma@TFunc {} = PP.parens (renderType ma) withParens mta@TApp {} = PP.parens (renderType mta) withParens other = renderType other diff --git a/smol-core/src/Smol/Core/Types/TypeName.hs b/smol-core/src/Smol/Core/Types/TypeName.hs index 856509b4f..9c6032f08 100644 --- a/smol-core/src/Smol/Core/Types/TypeName.hs +++ b/smol-core/src/Smol/Core/Types/TypeName.hs @@ -10,8 +10,8 @@ where import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey) import Data.String import qualified Data.Text as T -import Smol.Core.Printer import Smol.Core.Types.Constructor +import qualified Prettyprinter as PP newtype TypeName = TypeName Constructor deriving newtype @@ -24,8 +24,8 @@ newtype TypeName = TypeName Constructor FromJSONKey ) -instance Printer TypeName where - prettyDoc (TypeName n) = prettyDoc n +instance PP.Pretty TypeName where + pretty (TypeName n) = PP.pretty n instance IsString TypeName where fromString = TypeName . Constructor . T.pack diff --git a/smol-interpreter/src/Smol/Interpreter/Types/Stack.hs b/smol-interpreter/src/Smol/Interpreter/Types/Stack.hs index 0526b7490..f7b621529 100644 --- a/smol-interpreter/src/Smol/Interpreter/Types/Stack.hs +++ b/smol-interpreter/src/Smol/Interpreter/Types/Stack.hs @@ -7,9 +7,11 @@ import Smol.Core.Printer import Smol.Core.Types.Expr import Smol.Core.Types.Identifier import Smol.Core.Types.ResolvedDep +import qualified Prettyprinter as PP newtype StackFrame ann = StackFrame - { sfVariables :: Map (ResolvedDep Identifier) (Expr ResolvedDep (ExprData ann)) + { sfVariables :: Map (ResolvedDep Identifier) + (Expr ResolvedDep (ExprData ann)) } deriving stock (Eq, Ord, Show) @@ -20,8 +22,8 @@ instance Semigroup (StackFrame ann) where instance Monoid (StackFrame ann) where mempty = StackFrame mempty -instance Printer (StackFrame ann) where - prettyDoc (StackFrame sfVars) = prettyDoc sfVars +instance PP.Pretty (StackFrame ann) where + pretty (StackFrame sfVars) = PP.pretty sfVars -- carried around in each node when interpreting data ExprData ann = ExprData diff --git a/smol-modules/src/Smol/Modules/Types/Entity.hs b/smol-modules/src/Smol/Modules/Types/Entity.hs index f87071e12..c99c0d144 100644 --- a/smol-modules/src/Smol/Modules/Types/Entity.hs +++ b/smol-modules/src/Smol/Modules/Types/Entity.hs @@ -9,11 +9,11 @@ module Smol.Modules.Types.Entity where -- terrible, pls improve import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey) import GHC.Generics (Generic) -import Smol.Core.Printer import Smol.Core.Types.Constructor import Smol.Core.Types.Identifier import Smol.Core.Types.ModuleName import Smol.Core.Types.TypeName +import qualified Prettyprinter as PP data Entity = -- | a variable, `dog` @@ -40,14 +40,14 @@ data Entity FromJSONKey ) -instance Printer Entity where - prettyDoc (EVar name) = prettyDoc name - prettyDoc (ENamespacedVar modName name) = - prettyDoc modName <> "." <> prettyDoc name - prettyDoc (EType typeName) = prettyDoc typeName - prettyDoc (ENamespacedType modName typeName) = - prettyDoc modName <> "." <> prettyDoc typeName - prettyDoc (EConstructor tyCon) = - prettyDoc tyCon - prettyDoc (ENamespacedConstructor modName tyCon) = - prettyDoc modName <> "." <> prettyDoc tyCon +instance PP.Pretty Entity where + pretty (EVar name) = PP.pretty name + pretty (ENamespacedVar modName name) = + PP.pretty modName <> "." <> PP.pretty name + pretty (EType typeName) = PP.pretty typeName + pretty (ENamespacedType modName typeName) = + PP.pretty modName <> "." <> PP.pretty typeName + pretty (EConstructor tyCon) = + PP.pretty tyCon + pretty (ENamespacedConstructor modName tyCon) = + PP.pretty modName <> "." <> PP.pretty tyCon diff --git a/smol-modules/src/Smol/Modules/Types/Module.hs b/smol-modules/src/Smol/Modules/Types/Module.hs index 8471f1df9..4ff7ad78c 100644 --- a/smol-modules/src/Smol/Modules/Types/Module.hs +++ b/smol-modules/src/Smol/Modules/Types/Module.hs @@ -19,8 +19,7 @@ import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey) import Data.Map.Strict (Map) import qualified Data.Map.Strict as M import GHC.Generics (Generic) -import Prettyprinter -import Smol.Core.Printer +import qualified Prettyprinter as PP import Smol.Core.Typecheck.Typeclass.Types import Smol.Core.Types.Constructor import Smol.Core.Types.DataType