diff --git a/rlp.cabal b/rlp.cabal index c8fccb2..46d6e51 100644 --- a/rlp.cabal +++ b/rlp.cabal @@ -67,7 +67,7 @@ library , array >= 0.5.5 && < 0.6 , containers >= 0.6.7 && < 0.7 , template-haskell >= 2.20.0 && < 2.21 - , pretty >= 1.1.3 && < 1.2 + , prettyprinter , data-default >= 0.7.1 && < 0.8 , data-default-class >= 0.1.2 && < 0.2 , hashable >= 1.4.3 && < 1.5 diff --git a/src/Compiler/JustRun.hs b/src/Compiler/JustRun.hs index edb276b..16b006c 100644 --- a/src/Compiler/JustRun.hs +++ b/src/Compiler/JustRun.hs @@ -65,11 +65,11 @@ justTypeCheckCore s = typechk (T.pack s) & rlpcToEither where typechk = lexCoreR >=> parseCoreProgR >=> checkCoreProgR -makeItPretty :: (Pretty a) => Either e a -> Either e Doc -makeItPretty = fmap pretty +makeItPretty :: (Out a) => Either e a -> Either e (Doc ann) +makeItPretty = fmap out -makeItPretty' :: (Pretty (WithTerseBinds a)) => Either e a -> Either e Doc -makeItPretty' = fmap (pretty . WithTerseBinds) +makeItPretty' :: (Out (WithTerseBinds a)) => Either e a -> Either e (Doc ann) +makeItPretty' = fmap (out . WithTerseBinds) rlpcToEither :: RLPC a -> Either [MsgEnvelope RlpcError] a rlpcToEither r = case evalRLPC def r of diff --git a/src/Compiler/RLPC.hs b/src/Compiler/RLPC.hs index 7068e5d..bffe6e9 100644 --- a/src/Compiler/RLPC.hs +++ b/src/Compiler/RLPC.hs @@ -54,6 +54,7 @@ import Data.Default.Class import Data.Foldable import GHC.Generics (Generic) import Data.Maybe +import Data.Pretty import Data.Hashable (Hashable) import Data.HashSet (HashSet) import Data.HashSet qualified as S @@ -63,7 +64,6 @@ import Data.Text qualified as T import Data.Text.IO qualified as T import System.IO import Text.ANSI qualified as Ansi -import Text.PrettyPrint hiding ((<>)) import Control.Lens import Data.Text.Lens (packed, unpacked, IsText) import System.Exit @@ -203,7 +203,7 @@ renderRlpcErrs opts = (if don'tBother then id else filter byTag) prettyRlpcMsg :: MsgEnvelope RlpcError -> String prettyRlpcMsg m@(view msgSeverity -> SevDebug _) = prettyRlpcDebugMsg m -prettyRlpcMsg m = render $ docRlpcErr m +prettyRlpcMsg m = show $ docRlpcErr m prettyRlpcDebugMsg :: MsgEnvelope RlpcError -> String prettyRlpcDebugMsg msg = @@ -213,10 +213,10 @@ prettyRlpcDebugMsg msg = Text ts = msg ^. msgDiagnostic SevDebug tag = msg ^. msgSeverity -docRlpcErr :: MsgEnvelope RlpcError -> Doc -docRlpcErr msg = header - $$ nest 2 bullets - $$ source +docRlpcErr :: MsgEnvelope RlpcError -> Doc ann +docRlpcErr msg = vcat [ header + , nest 2 bullets + , source ] where source = vcat $ zipWith (<+>) rule srclines where @@ -231,11 +231,10 @@ docRlpcErr msg = header <> errorColour "error" <> msgColour ":" bullets = let Text ts = msg ^. msgDiagnostic - in vcat $ hang "•" 2 . ttext . msgColour <$> ts + in vcat $ ("•" <>) . hang 2 . ttext . msgColour <$> ts msgColour = Ansi.white . Ansi.bold errorColour = Ansi.red . Ansi.bold - ttext = text . T.unpack tshow :: (Show a) => a -> Text tshow = T.pack . show diff --git a/src/Core/HindleyMilner.hs b/src/Core/HindleyMilner.hs index ecee654..9fcbd61 100644 --- a/src/Core/HindleyMilner.hs +++ b/src/Core/HindleyMilner.hs @@ -16,22 +16,9 @@ module Core.HindleyMilner ) where ---------------------------------------------------------------------------------- -import Control.Lens hiding (Context', Context) -import Data.Maybe (fromMaybe) -import Data.Text qualified as T -import Data.Pretty (rpretty) -import Data.HashMap.Strict qualified as H -import Data.Foldable (traverse_) -import Data.Functor -import Data.Functor.Identity import Compiler.RLPC -import Compiler.Types -import Compiler.RlpcError -import Control.Monad (foldM, void, forM) +import Data.Text qualified as T import Control.Monad.Errorful -import Control.Monad.State -import Control.Monad.Utils (mapAccumLM, generalise) -import Text.Printf import Core.Syntax ---------------------------------------------------------------------------------- @@ -60,21 +47,7 @@ data TypeError deriving (Show, Eq) instance IsRlpcError TypeError where - liftRlpcError = \case - -- todo: use anti-parser instead of show - TyErrCouldNotUnify t u -> Text - [ T.pack $ printf "Could not match type `%s` with `%s`." - (rpretty @String t) (rpretty @String u) - , "Expected: " <> rpretty t - , "Got: " <> rpretty u - ] - TyErrUntypedVariable n -> Text - [ "Untyped (likely undefined) variable `" <> n <> "`" - ] - TyErrRecursiveType t x -> Text - [ T.pack $ printf "Recursive type: `%s' occurs in `%s'" - (rpretty @String t) (rpretty @String x) - ] + liftRlpcError = undefined -- | Synonym for @Errorful [TypeError]@. This means an @HMError@ action may -- throw any number of fatal or nonfatal errors. Run with @runErrorful@. diff --git a/src/Core/Syntax.hs b/src/Core/Syntax.hs index 1432c93..3bcfada 100644 --- a/src/Core/Syntax.hs +++ b/src/Core/Syntax.hs @@ -29,8 +29,8 @@ module Core.Syntax , pattern Con, pattern Var, pattern App, pattern Lam, pattern Let , pattern Case, pattern Type, pattern Lit - -- * Pretty-printing - , Pretty(pretty), WithTerseBinds(..) + -- * pretty-printing + , Out(out), WithTerseBinds(..) -- * Optics , HasArrowSyntax(..) @@ -335,11 +335,11 @@ instance MakeTerse Var where type AsTerse Var = Name asTerse (MkVar n _) = n -instance (Hashable b, Pretty b, Pretty (AsTerse b), MakeTerse b) - => Pretty (WithTerseBinds (Program b)) where - pretty (WithTerseBinds p) - = (datatags <> "\n") - $+$ defs +instance (Hashable b, Out b, Out (AsTerse b), MakeTerse b) + => Out (WithTerseBinds (Program b)) where + out (WithTerseBinds p) + = vsep [ (datatags <> "\n") + , defs ] where datatags = ifoldrOf (programDataTags . ifolded) cataDataTag mempty p defs = vlinesOf (programJoinedDefs . to prettyGroup) p @@ -355,17 +355,17 @@ instance (Hashable b, Pretty b, Pretty (AsTerse b), MakeTerse b) thatSc = foldMap $ \sc -> H.singleton (sc ^. _lhs . _1) (That sc) - prettyGroup :: These (b, Type) (ScDef b) -> Doc + prettyGroup :: These (b, Type) (ScDef b) -> Doc ann prettyGroup = bifoldr vs vs mempty . bimap (uncurry prettyTySig') - (pretty . WithTerseBinds) - where vs = vsepTerm ";" + (out . WithTerseBinds) + where vs a b = a <> ";" <> line <> b - cataDataTag n (t,a) acc = prettyDataTag n t a $+$ acc + cataDataTag n (t,a) acc = prettyDataTag n t a <> line <> acc -instance (Hashable b, Pretty b) => Pretty (Program b) where - pretty p = (datatags <> "\n") - $+$ defs +instance (Hashable b, Out b) => Out (Program b) where + out p = vsep [ datatags <> "\n" + , defs ] where datatags = ifoldrOf (programDataTags . ifolded) cataDataTag mempty p defs = vlinesOf (programJoinedDefs . to prettyGroup) p @@ -381,139 +381,139 @@ instance (Hashable b, Pretty b) => Pretty (Program b) where thatSc = foldMap $ \sc -> H.singleton (sc ^. _lhs . _1) (That sc) - prettyGroup :: These (b, Type) (ScDef b) -> Doc + prettyGroup :: These (b, Type) (ScDef b) -> Doc ann prettyGroup = bifoldr vs vs mempty - . bimap (uncurry prettyTySig) pretty - where vs = vsepTerm ";" + . bimap (uncurry prettyTySig) out + where vs a b = a <> ";" <> line <> b - cataDataTag n (t,a) acc = prettyDataTag n t a $+$ acc + cataDataTag n (t,a) acc = prettyDataTag n t a <> line <> acc unionThese :: These a b -> These a b -> These a b unionThese (This a) (That b) = These a b unionThese (That b) (This a) = These a b unionThese (These a b) _ = These a b -prettyDataTag :: (Pretty n, Pretty t, Pretty a) - => n -> t -> a -> Doc +prettyDataTag :: (Out n, Out t, Out a) + => n -> t -> a -> Doc ann prettyDataTag n t a = hsep ["{-#", "PackData", ttext n, ttext t, ttext a, "#-}"] -prettyTySig :: (Pretty n, Pretty t) => n -> t -> Doc -prettyTySig n t = hsep [ttext n, ":", pretty t] +prettyTySig :: (Out n, Out t) => n -> t -> Doc ann +prettyTySig n t = hsep [ttext n, ":", out t] -prettyTySig' :: (MakeTerse n, Pretty (AsTerse n), Pretty t) => n -> t -> Doc -prettyTySig' n t = hsep [ttext (asTerse n), ":", pretty t] +prettyTySig' :: (MakeTerse n, Out (AsTerse n), Out t) => n -> t -> Doc ann +prettyTySig' n t = hsep [ttext (asTerse n), ":", out t] --- Pretty Type +-- out Type -- TyApp | appPrec | left -- (:->) | appPrec-1 | right -instance Pretty Type where - prettyPrec _ (TyVar n) = ttext n - prettyPrec _ TyFun = "(->)" - prettyPrec _ (TyCon n) = ttext n - prettyPrec p (a :-> b) = maybeParens (p>appPrec-1) $ - hsep [prettyPrec appPrec a, "->", prettyPrec (appPrec-1) b] - prettyPrec p (TyApp f x) = maybeParens (p>appPrec) $ - prettyPrec appPrec f <+> prettyPrec appPrec1 x - prettyPrec p (TyForall a m) = maybeParens (p>appPrec-2) $ - "∀" <+> (prettyPrec appPrec1 a <> ".") <+> pretty m - prettyPrec _ TyKindType = "Type" +instance Out Type where + outPrec _ (TyVar n) = ttext n + outPrec _ TyFun = "(->)" + outPrec _ (TyCon n) = ttext n + outPrec p (a :-> b) = maybeParens (p>appPrec-1) $ + hsep [outPrec appPrec a, "->", outPrec (appPrec-1) b] + outPrec p (TyApp f x) = maybeParens (p>appPrec) $ + outPrec appPrec f <+> outPrec appPrec1 x + outPrec p (TyForall a m) = maybeParens (p>appPrec-2) $ + "∀" <+> (outPrec appPrec1 a <> ".") <+> out m + outPrec _ TyKindType = "Type" -instance (Pretty b, Pretty (AsTerse b), MakeTerse b) - => Pretty (WithTerseBinds (ScDef b)) where - pretty (WithTerseBinds sc) = hsep [name, as, "=", hang empty 1 e] +instance (Out b, Out (AsTerse b), MakeTerse b) + => Out (WithTerseBinds (ScDef b)) where + out (WithTerseBinds sc) = hsep [name, as, "=", hang 1 e] where name = ttext $ sc ^. _lhs . _1 . to asTerse as = sc & hsepOf (_lhs . _2 . each . to asTerse . to ttext) - e = pretty $ sc ^. _rhs + e = out $ sc ^. _rhs -instance (Pretty b) => Pretty (ScDef b) where - pretty sc = hsep [name, as, "=", hang empty 1 e] +instance (Out b) => Out (ScDef b) where + out sc = hsep [name, as, "=", hang 1 e] where name = ttext $ sc ^. _lhs . _1 as = sc & hsepOf (_lhs . _2 . each . to ttext) - e = pretty $ sc ^. _rhs + e = out $ sc ^. _rhs --- Pretty Expr +-- out Expr -- LamF | appPrec1 | right -- AppF | appPrec | left -instance (Pretty b, Pretty a) => Pretty (ExprF b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (ExprF b a) where + outPrec = outPrec1 - -- prettyPrec _ (VarF n) = ttext n - -- prettyPrec _ (ConF t a) = "Pack{" <> (ttext t <+> ttext a) <> "}" - -- prettyPrec p (LamF bs e) = maybeParens (p>0) $ - -- hsep ["λ", hsep (prettyPrec appPrec1 <$> bs), "->", pretty e] - -- prettyPrec p (LetF r bs e) = maybeParens (p>0) - -- $ hsep [pretty r, explicitLayout bs] - -- $+$ hsep ["in", pretty e] - -- prettyPrec p (AppF f x) = maybeParens (p>appPrec) $ - -- prettyPrec appPrec f <+> prettyPrec appPrec1 x - -- prettyPrec p (LitF l) = prettyPrec p l - -- prettyPrec p (CaseF e as) = maybeParens (p>0) $ - -- "case" <+> pretty e <+> "of" + -- outPrec _ (VarF n) = ttext n + -- outPrec _ (ConF t a) = "Pack{" <> (ttext t <+> ttext a) <> "}" + -- outPrec p (LamF bs e) = maybeParens (p>0) $ + -- hsep ["λ", hsep (outPrec appPrec1 <$> bs), "->", out e] + -- outPrec p (LetF r bs e) = maybeParens (p>0) + -- $ hsep [out r, explicitLayout bs] + -- $+$ hsep ["in", out e] + -- outPrec p (AppF f x) = maybeParens (p>appPrec) $ + -- outPrec appPrec f <+> outPrec appPrec1 x + -- outPrec p (LitF l) = outPrec p l + -- outPrec p (CaseF e as) = maybeParens (p>0) $ + -- "case" <+> out e <+> "of" -- $+$ nest 2 (explicitLayout as) - -- prettyPrec p (TypeF t) = "@" <> prettyPrec appPrec1 t + -- outPrec p (TypeF t) = "@" <> outPrec appPrec1 t -instance (Pretty b) => Pretty1 (ExprF b) where - liftPrettyPrec pr _ (VarF n) = ttext n - liftPrettyPrec pr _ (ConF t a) = "Pack{" <> (ttext t <+> ttext a) <> "}" - liftPrettyPrec pr p (LamF bs e) = maybeParens (p>0) $ - hsep ["λ", hsep (prettyPrec appPrec1 <$> bs), "->", pr 0 e] - liftPrettyPrec pr p (LetF r bs e) = maybeParens (p>0) - $ hsep [pretty r, bs'] - $+$ hsep ["in", pr 0 e] - where bs' = liftExplicitLayout (liftPrettyPrec pr 0) bs - liftPrettyPrec pr p (AppF f x) = maybeParens (p>appPrec) $ +instance (Out b) => Out1 (ExprF b) where + liftOutPrec pr _ (VarF n) = ttext n + liftOutPrec pr _ (ConF t a) = "Pack{" <> (ttext t <+> ttext a) <> "}" + liftOutPrec pr p (LamF bs e) = maybeParens (p>0) $ + hsep ["λ", hsep (outPrec appPrec1 <$> bs), "->", pr 0 e] + liftOutPrec pr p (LetF r bs e) = maybeParens (p>0) + $ vsep [ hsep [out r, bs'] + , hsep ["in", pr 0 e] ] + where bs' = liftExplicitLayout (liftOutPrec pr 0) bs + liftOutPrec pr p (AppF f x) = maybeParens (p>appPrec) $ pr appPrec f <+> pr appPrec1 x - liftPrettyPrec pr p (LitF l) = prettyPrec p l - liftPrettyPrec pr p (CaseF e as) = maybeParens (p>0) $ - "case" <+> pr 0 e <+> "of" - $+$ nest 2 as' - where as' = liftExplicitLayout (liftPrettyPrec pr 0) as - liftPrettyPrec pr p (TypeF t) = "@" <> prettyPrec appPrec1 t + liftOutPrec pr p (LitF l) = outPrec p l + liftOutPrec pr p (CaseF e as) = maybeParens (p>0) $ + vsep [ "case" <+> pr 0 e <+> "of" + , nest 2 as' ] + where as' = liftExplicitLayout (liftOutPrec pr 0) as + liftOutPrec pr p (TypeF t) = "@" <> outPrec appPrec1 t -instance Pretty Rec where - pretty Rec = "letrec" - pretty NonRec = "let" +instance Out Rec where + out Rec = "letrec" + out NonRec = "let" -instance (Pretty b, Pretty a) => Pretty (AlterF b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (AlterF b a) where + outPrec = outPrec1 -instance (Pretty b) => Pretty1 (AlterF b) where - liftPrettyPrec pr _ (AlterF c as e) = - hsep [pretty c, hsep (pretty <$> as), "->", liftPrettyPrec pr 0 e] +instance (Out b) => Out1 (AlterF b) where + liftOutPrec pr _ (AlterF c as e) = + hsep [out c, hsep (out <$> as), "->", liftOutPrec pr 0 e] -instance Pretty AltCon where - pretty (AltData n) = ttext n - pretty (AltLit l) = pretty l - pretty (AltTag t) = "<" <> ttext t <> ">" - pretty AltDefault = "_" +instance Out AltCon where + out (AltData n) = ttext n + out (AltLit l) = out l + out (AltTag t) = "<" <> ttext t <> ">" + out AltDefault = "_" -instance Pretty Lit where - pretty (IntL n) = ttext n +instance Out Lit where + out (IntL n) = ttext n -instance (Pretty b, Pretty a) => Pretty (BindingF b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (BindingF b a) where + outPrec = outPrec1 -instance Pretty b => Pretty1 (BindingF b) where - liftPrettyPrec pr _ (BindingF k v) = hsep [pretty k, "=", liftPrettyPrec pr 0 v] +instance Out b => Out1 (BindingF b) where + liftOutPrec pr _ (BindingF k v) = hsep [out k, "=", liftOutPrec pr 0 v] -liftExplicitLayout :: (a -> Doc) -> [a] -> Doc +liftExplicitLayout :: (a -> Doc ann) -> [a] -> Doc ann liftExplicitLayout pr as = vcat inner <+> "}" where inner = zipWith (<+>) delims (pr <$> as) delims = "{" : repeat ";" -explicitLayout :: (Pretty a) => [a] -> Doc +explicitLayout :: (Out a) => [a] -> Doc ann explicitLayout as = vcat inner <+> "}" where - inner = zipWith (<+>) delims (pretty <$> as) + inner = zipWith (<+>) delims (out <$> as) delims = "{" : repeat ";" -instance Pretty Var where - prettyPrec p (MkVar n t) = maybeParens (p>0) $ - hsep [pretty n, ":", pretty t] +instance Out Var where + outPrec p (MkVar n t) = maybeParens (p>0) $ + hsep [out n, ":", out t] -------------------------------------------------------------------------------- diff --git a/src/Core/SystemF.hs b/src/Core/SystemF.hs index a52d9d4..0e8c17d 100644 --- a/src/Core/SystemF.hs +++ b/src/Core/SystemF.hs @@ -91,14 +91,14 @@ instance IsRlpcError SystemFError where undefinedVariableErr n SystemFErrorKindMismatch k k' -> Text [ T.pack $ printf "Could not match kind `%s' with `%s'" - (pretty k) (pretty k') + (out k) (out k') ] SystemFErrorCouldNotMatch t t' -> Text [ T.pack $ printf "Could not match type `%s' with `%s'" - (pretty t) (pretty t') + (out t) (out t') ] -justLintCoreExpr = fmap (fmap (prettyPrec appPrec1)) . lintE demoContext +justLintCoreExpr = fmap (fmap (outPrec appPrec1)) . lintE demoContext lintE :: Gamma -> Expr Var -> SysF ET lintE g = \case diff --git a/src/Core2Core.hs b/src/Core2Core.hs index e5c7401..4f49281 100644 --- a/src/Core2Core.hs +++ b/src/Core2Core.hs @@ -37,7 +37,7 @@ core2core p = undefined gmPrepR :: (Monad m) => Program' -> RLPCT m Program' gmPrepR p = do let p' = gmPrep p - addDebugMsg "dump-gm-preprocessed" $ render . pretty $ p' + addDebugMsg "dump-gm-preprocessed" $ show . out $ p' pure p' -- | G-machine-specific preprocessing. diff --git a/src/Data/Pretty.hs b/src/Data/Pretty.hs index 44902e7..1138d30 100644 --- a/src/Data/Pretty.hs +++ b/src/Data/Pretty.hs @@ -1,26 +1,26 @@ +{-# LANGUAGE PartialTypeSignatures #-} {-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-} module Data.Pretty - ( Pretty(..), Pretty1(..) - , prettyPrec1 - , rpretty + ( Out(..), Out1(..) + , outPrec1 + , rout , ttext , Showing(..) - -- * Pretty-printing lens combinators - , hsepOf, vsepOf, vcatOf, vlinesOf, vsepTerm - , vsep - , module Text.PrettyPrint + -- * Out-printing lens combinators + , hsepOf, vsepOf, vcatOf, vlinesOf + , module Prettyprinter , maybeParens , appPrec , appPrec1 ) where ---------------------------------------------------------------------------------- -import Text.PrettyPrint hiding ((<>)) -import Text.PrettyPrint.HughesPJ hiding ((<>)) +import Prettyprinter import Text.Printf import Data.String (IsString(..)) import Data.Text.Lens hiding ((:<)) import Data.Monoid hiding (Sum) +import Data.Bool import Control.Lens -- instances @@ -30,83 +30,80 @@ import Data.Functor.Sum import Data.Fix (Fix(..)) ---------------------------------------------------------------------------------- -class Pretty a where - pretty :: a -> Doc - prettyPrec :: Int -> a -> Doc +class Out a where + out :: a -> Doc ann + outPrec :: Int -> a -> Doc ann - {-# MINIMAL pretty | prettyPrec #-} - pretty = prettyPrec 0 - prettyPrec = const pretty + {-# MINIMAL out | outPrec #-} + out = outPrec 0 + outPrec = const out -rpretty :: (IsString s, Pretty a) => a -> s -rpretty = fromString . render . pretty +rout :: (IsString s, Out a) => a -> s +rout = fromString . show . out -instance Pretty Doc where - pretty = id +-- instance Out (Doc ann) where +-- out = id -instance Pretty String where - pretty = Text.PrettyPrint.text +instance Out String where + out = pretty -instance Pretty T.Text where - pretty = Text.PrettyPrint.text . view unpacked +instance Out T.Text where + out = pretty newtype Showing a = Showing a -instance (Show a) => Pretty (Showing a) where - prettyPrec p (Showing a) = fromString $ showsPrec p a "" +instance (Show a) => Out (Showing a) where + outPrec p (Showing a) = fromString $ showsPrec p a "" -deriving via Showing Int instance Pretty Int +deriving via Showing Int instance Out Int -class (forall a. Pretty a => Pretty (f a)) => Pretty1 f where - liftPrettyPrec :: (Int -> a -> Doc) -> Int -> f a -> Doc +class (forall a. Out a => Out (f a)) => Out1 f where + liftOutPrec :: (Int -> a -> Doc ann) -> Int -> f a -> Doc ann -prettyPrec1 :: (Pretty1 f, Pretty a) => Int -> f a -> Doc -prettyPrec1 = liftPrettyPrec prettyPrec +outPrec1 :: (Out1 f, Out a) => Int -> f a -> Doc ann +outPrec1 = liftOutPrec outPrec -instance (Pretty1 f, Pretty1 g, Pretty a) => Pretty (Sum f g a) where - prettyPrec p (InL fa) = prettyPrec1 p fa - prettyPrec p (InR ga) = prettyPrec1 p ga +instance (Out1 f, Out1 g, Out a) => Out (Sum f g a) where + outPrec p (InL fa) = outPrec1 p fa + outPrec p (InR ga) = outPrec1 p ga -instance (Pretty1 f, Pretty1 g) => Pretty1 (Sum f g) where - liftPrettyPrec pr p (InL fa) = liftPrettyPrec pr p fa - liftPrettyPrec pr p (InR ga) = liftPrettyPrec pr p ga +instance (Out1 f, Out1 g) => Out1 (Sum f g) where + liftOutPrec pr p (InL fa) = liftOutPrec pr p fa + liftOutPrec pr p (InR ga) = liftOutPrec pr p ga -instance (Pretty (f (Fix f))) => Pretty (Fix f) where - prettyPrec d (Fix f) = prettyPrec d f +instance (Out (f (Fix f))) => Out (Fix f) where + outPrec d (Fix f) = outPrec d f -------------------------------------------------------------------------------- -ttext :: Pretty t => t -> Doc -ttext = pretty +ttext :: Out t => t -> Doc ann +ttext = out -hsepOf :: Getting (Endo Doc) s Doc -> s -> Doc +hsepOf :: Getting (Endo (Doc ann)) s (Doc ann) -> s -> Doc ann hsepOf l = foldrOf l (<+>) mempty -vsepOf :: Getting (Endo Doc) s Doc -> s -> Doc -vsepOf l = foldrOf l ($+$) mempty +vsepOf :: _ -> s -> Doc ann +vsepOf l = vsep . toListOf l -vcatOf :: Getting (Endo Doc) s Doc -> s -> Doc -vcatOf l = foldrOf l ($$) mempty +vcatOf :: _ -> s -> Doc ann +vcatOf l = vcat . toListOf l -vlinesOf :: Getting (Endo Doc) s Doc -> s -> Doc -vlinesOf l = foldrOf l (\a b -> a $+$ "" $+$ b) mempty +vlinesOf :: Getting (Endo (Doc ann)) s (Doc ann) -> s -> Doc ann +vlinesOf l = foldrOf l (\a b -> a <> line <> b) mempty -- hack(?) to separate chunks with a blankline -vsepTerm :: Doc -> Doc -> Doc -> Doc -vsepTerm term a b = (a <> term) $+$ b - -vsep :: [Doc] -> Doc -vsep = foldr ($+$) mempty - -------------------------------------------------------------------------------- +maybeParens :: Bool -> Doc ann -> Doc ann +maybeParens = bool id parens + appPrec, appPrec1 :: Int appPrec = 10 appPrec1 = 11 -instance PrintfArg Doc where +instance PrintfArg (Doc ann) where formatArg d fmt - | fmtChar (vFmt 'D' fmt) == 'D' = formatString (render d) fmt' + | fmtChar (vFmt 'D' fmt) == 'D' = formatString (show d) fmt' | otherwise = errorBadFormat $ fmtChar fmt where fmt' = fmt { fmtChar = 's', fmtPrecision = Nothing } diff --git a/src/GM.hs b/src/GM.hs index a414ff7..58c8d61 100644 --- a/src/GM.hs +++ b/src/GM.hs @@ -29,9 +29,9 @@ import Data.Tuple (swap) import Control.Lens import Data.Text.Lens (IsText, packed, unpacked) import Text.Printf -import Text.PrettyPrint hiding ((<>)) -import Text.PrettyPrint.HughesPJ (maybeParens) import Data.Foldable (traverse_) +import Prettyprinter +import Data.Pretty import System.IO (Handle, hPutStrLn) -- TODO: an actual output system -- TODO: an actual output system @@ -165,7 +165,7 @@ hdbgProg p hio = do renderOut . showStats $ sts pure final where - renderOut r = hPutStrLn hio $ render r ++ "\n" + renderOut r = hPutStrLn hio $ show r ++ "\n" states = eval $ compile p final = last states @@ -182,7 +182,7 @@ evalProgR p = do renderOut . showStats $ sts pure (res, sts) where - renderOut r = addDebugMsg "dump-eval" $ render r ++ "\n" + renderOut r = addDebugMsg "dump-eval" $ show r ++ "\n" states = eval . compile $ p final = last states @@ -823,13 +823,13 @@ showCon t n = printf "Pack{%d %d}" t n ^. packed pprTabstop :: Int pprTabstop = 4 -qquotes :: Doc -> Doc +qquotes :: Doc ann -> Doc ann qquotes d = "`" <> d <> "'" -showStats :: Stats -> Doc -showStats sts = "==== Stats ============" $$ stats +showStats :: Stats -> Doc ann +showStats sts = "==== Stats ============" <> line <> stats where - stats = text $ printf + stats = textt @String $ printf "Reductions : %5d\n\ \Prim Reductions : %5d\n\ \Allocations : %5d\n\ @@ -839,10 +839,10 @@ showStats sts = "==== Stats ============" $$ stats (sts ^. stsAllocations) (sts ^. stsGCCycles) -showState :: GmState -> Doc +showState :: GmState -> Doc ann showState st = vcat [ "==== GmState " <> int stnum <> " " - <> text (replicate (28 - 13 - 1 - digitalWidth stnum) '=') + <> textt (replicate (28 - 13 - 1 - digitalWidth stnum) '=') , "-- Next instructions -------" , info $ showCodeShort c , "-- Stack -------------------" @@ -859,23 +859,23 @@ showState st = vcat -- indent data info = nest pprTabstop -showCodeShort :: Code -> Doc +showCodeShort :: Code -> Doc ann showCodeShort c = braces c' where c' | length c > 3 = list (showInstr <$> take 3 c) <> "; ..." | otherwise = list (showInstr <$> c) list = hcat . punctuate "; " -showStackShort :: Stack -> Doc +showStackShort :: Stack -> Doc ann showStackShort s = brackets s' where -- no access to heap, otherwise we'd use showNodeAt s' | length s > 3 = list (showEntry <$> take 3 s) <> ", ..." | otherwise = list (showEntry <$> s) list = hcat . punctuate ", " - showEntry = text . show + showEntry = textt . show -showStack :: GmState -> Doc +showStack :: GmState -> Doc ann showStack st = vcat $ uncurry showEntry <$> si where h = st ^. gmHeap @@ -887,10 +887,9 @@ showStack st = vcat $ uncurry showEntry <$> si w = maxWidth (addresses h) showIndex n = padInt w n <> ": " - showEntry :: Int -> Addr -> Doc showEntry n a = showIndex n <> showNodeAt st a -showDump :: GmState -> Doc +showDump :: GmState -> Doc ann showDump st = vcat $ uncurry showEntry <$> di where d = st ^. gmDump @@ -899,14 +898,13 @@ showDump st = vcat $ uncurry showEntry <$> di showIndex n = padInt w n <> ": " w = maxWidth (fst <$> di) - showEntry :: Int -> (Code, Stack) -> Doc showEntry n (c,s) = showIndex n <> nest pprTabstop entry where - entry = ("Stack : " <> showCodeShort c) - $$ ("Code : " <> showStackShort s) + entry = vsep [ "Stack : " <> showCodeShort c + , "Code : " <> showStackShort s ] -padInt :: Int -> Int -> Doc -padInt m n = text (replicate (m - digitalWidth n) ' ') <> int n +padInt :: Int -> Int -> Doc ann +padInt m n = textt (replicate (m - digitalWidth n) ' ') <> int n maxWidth :: [Int] -> Int maxWidth ns = digitalWidth $ maximum ns @@ -914,7 +912,7 @@ maxWidth ns = digitalWidth $ maximum ns digitalWidth :: Int -> Int digitalWidth = length . show -showHeap :: GmState -> Doc +showHeap :: GmState -> Doc ann showHeap st = vcat $ showEntry <$> addrs where showAddr n = padInt w n <> ": " @@ -923,13 +921,12 @@ showHeap st = vcat $ showEntry <$> addrs h = st ^. gmHeap addrs = addresses h - showEntry :: Addr -> Doc showEntry a = showAddr a <> showNodeAt st a -showNodeAt :: GmState -> Addr -> Doc +showNodeAt :: GmState -> Addr -> Doc ann showNodeAt = showNodeAtP 0 -showNodeAtP :: Int -> GmState -> Addr -> Doc +showNodeAtP :: Int -> GmState -> Addr -> Doc ann showNodeAtP p st a = case hLookup a h of Just (NNum n) -> int n <> "#" Just (NGlobal _ _) -> textt name @@ -953,9 +950,9 @@ showNodeAtP p st a = case hLookup a h of h = st ^. gmHeap pprec = maybeParens (p > 0) -showSc :: GmState -> (Name, Addr) -> Doc -showSc st (k,a) = "Supercomb " <> qquotes (textt k) <> colon - $$ code +showSc :: GmState -> (Name, Addr) -> Doc ann +showSc st (k,a) = vcat [ "Supercomb " <> qquotes (textt k) <> colon + , code ] where code = case hLookup a (st ^. gmHeap) of Just (NGlobal _ c) -> showCode c @@ -966,19 +963,21 @@ errTxtInvalidObject, errTxtInvalidAddress :: (IsString a) => a errTxtInvalidObject = "" errTxtInvalidAddress = "" -showCode :: Code -> Doc +showCode :: Code -> Doc ann showCode c = "Code" <+> braces instrs where instrs = vcat $ showInstr <$> c -showInstr :: Instr -> Doc -showInstr (CaseJump alts) = "CaseJump" $$ nest pprTabstop alternatives +showInstr :: Instr -> Doc ann +showInstr (CaseJump alts) = vcat [ "CaseJump", nest pprTabstop alternatives ] where showAlt (t,c) = "<" <> int t <> ">" <> showCodeShort c - alternatives = foldr (\a acc -> showAlt a $$ acc) mempty alts -showInstr i = text $ show i + alternatives = foldr (\a acc -> showAlt a <> line <> acc) mempty alts +showInstr i = textt $ show i -textt :: (IsText a) => a -> Doc -textt t = t ^. unpacked & text +int = pretty + +textt :: (Pretty a) => a -> Doc ann +textt = pretty ---------------------------------------------------------------------------------- diff --git a/src/Rlp/AltSyntax.hs b/src/Rlp/AltSyntax.hs index 03b8810..9d8c2be 100644 --- a/src/Rlp/AltSyntax.hs +++ b/src/Rlp/AltSyntax.hs @@ -116,67 +116,67 @@ pattern Finr ga = Fix (InR ga) -------------------------------------------------------------------------------- -instance (Pretty b, Pretty a) => Pretty (ExprF b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (ExprF b a) where + outPrec = outPrec1 -instance (Pretty b, Pretty a) => Pretty (Alter b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (Alter b a) where + outPrec = outPrec1 -instance (Pretty b) => Pretty1 (Alter b) where - liftPrettyPrec pr _ (Alter p e) = - hsep [ pretty p, "->", pr 0 e] +instance (Out b) => Out1 (Alter b) where + liftOutPrec pr _ (Alter p e) = + hsep [ out p, "->", pr 0 e] -instance Pretty b => Pretty1 (ExprF b) where - liftPrettyPrec pr p (InfixEF o a b) = maybeParens (p>0) $ - pr 1 a <+> pretty o <+> pr 1 b - liftPrettyPrec pr p (CaseEF e as) = maybeParens (p>0) $ - hsep [ "case", pr 0 e, "of" ] - $+$ nest 2 (vcat $ liftPrettyPrec pr 0 <$> as) +instance Out b => Out1 (ExprF b) where + liftOutPrec pr p (InfixEF o a b) = maybeParens (p>0) $ + pr 1 a <+> out o <+> pr 1 b + liftOutPrec pr p (CaseEF e as) = maybeParens (p>0) $ + vsep [ hsep [ "case", pr 0 e, "of" ] + , nest 2 (vcat $ liftOutPrec pr 0 <$> as) ] -instance (Pretty b, Pretty a) => Pretty (Decl b a) where - prettyPrec = prettyPrec1 +instance (Out b, Out a) => Out (Decl b a) where + outPrec = outPrec1 -instance (Pretty b) => Pretty1 (Decl b) where - liftPrettyPrec pr _ (FunD f as e) = - hsep [ ttext f, hsep (prettyPrec appPrec1 <$> as) +instance (Out b) => Out1 (Decl b) where + liftOutPrec pr _ (FunD f as e) = + hsep [ ttext f, hsep (outPrec appPrec1 <$> as) , "=", pr 0 e ] - liftPrettyPrec _ _ (DataD f as []) = - hsep [ "data", ttext f, hsep (pretty <$> as) ] + liftOutPrec _ _ (DataD f as []) = + hsep [ "data", ttext f, hsep (out <$> as) ] - liftPrettyPrec _ _ (DataD f as ds) = - hsep [ "data", ttext f, hsep (pretty <$> as), cons ] + liftOutPrec _ _ (DataD f as ds) = + hsep [ "data", ttext f, hsep (out <$> as), cons ] where - cons = vcat $ zipWith (<+>) delims (pretty <$> ds) + cons = vcat $ zipWith (<+>) delims (out <$> ds) delims = "=" : repeat "|" - liftPrettyPrec _ _ (TySigD n t) = - hsep [ ttext n, ":", pretty t ] + liftOutPrec _ _ (TySigD n t) = + hsep [ ttext n, ":", out t ] -instance (Pretty b) => Pretty (DataCon b) where - pretty (DataCon n as) = ttext n <+> hsep (prettyPrec appPrec1 <$> as) +instance (Out b) => Out (DataCon b) where + out (DataCon n as) = ttext n <+> hsep (outPrec appPrec1 <$> as) -- (->) is given prec `appPrec-1` -instance (Pretty b) => Pretty (Type b) where - prettyPrec _ (VarT n) = ttext n - prettyPrec _ (ConT n) = ttext n - prettyPrec p (s Core.:-> t) = maybeParens (p>appPrec-1) $ - hsep [ prettyPrec appPrec s, "->", prettyPrec (appPrec-1) t ] - prettyPrec p (AppT f x) = maybeParens (p>appPrec) $ - prettyPrec appPrec f <+> prettyPrec appPrec1 x - prettyPrec p FunT = maybeParens (p>0) "->" +instance (Out b) => Out (Type b) where + outPrec _ (VarT n) = ttext n + outPrec _ (ConT n) = ttext n + outPrec p (s Core.:-> t) = maybeParens (p>appPrec-1) $ + hsep [ outPrec appPrec s, "->", outPrec (appPrec-1) t ] + outPrec p (AppT f x) = maybeParens (p>appPrec) $ + outPrec appPrec f <+> outPrec appPrec1 x + outPrec p FunT = maybeParens (p>0) "->" -instance (Pretty b) => Pretty (Pat b) where - prettyPrec p (VarP b) = prettyPrec p b - prettyPrec p (ConP b) = prettyPrec p b - prettyPrec p (AppP c x) = maybeParens (p>appPrec) $ - prettyPrec appPrec c <+> prettyPrec appPrec1 x +instance (Out b) => Out (Pat b) where + outPrec p (VarP b) = outPrec p b + outPrec p (ConP b) = outPrec p b + outPrec p (AppP c x) = maybeParens (p>appPrec) $ + outPrec appPrec c <+> outPrec appPrec1 x -instance (Pretty a, Pretty b) => Pretty (Program b a) where - prettyPrec = prettyPrec1 +instance (Out a, Out b) => Out (Program b a) where + outPrec = outPrec1 -instance (Pretty b) => Pretty1 (Program b) where - liftPrettyPrec pr p (Program ds) = vsep $ liftPrettyPrec pr p <$> ds +instance (Out b) => Out1 (Program b) where + liftOutPrec pr p (Program ds) = vsep $ liftOutPrec pr p <$> ds makePrisms ''Pat makePrisms ''Binding diff --git a/src/Rlp/HindleyMilner.hs b/src/Rlp/HindleyMilner.hs index 3f0949f..5cf408e 100644 --- a/src/Rlp/HindleyMilner.hs +++ b/src/Rlp/HindleyMilner.hs @@ -20,7 +20,7 @@ import Control.Monad import Control.Arrow ((>>>)) import Control.Monad.Writer.Strict import Data.Text qualified as T -import Data.Pretty +import Data.Pretty hiding (annotate) import Data.Hashable import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict qualified as H @@ -153,11 +153,11 @@ subst n t' = para \case | otherwise -> ForallT x post t -> embed $ t <&> view _2 -prettyHM :: (Pretty a) +prettyHM :: (Out a) => Either [TypeError] (a, [Constraint]) -> Either [TypeError] (String, [String]) -prettyHM = over (mapped . _1) rpretty - . over (mapped . _2 . each) rpretty +prettyHM = over (mapped . _1) rout + . over (mapped . _2 . each) rout fixtend :: Functor f => (f (Fix f) -> b) -> Fix f -> Cofree f b fixtend c (Fix f) = c f :< fmap (fixtend c) f diff --git a/src/Rlp/HindleyMilner/Types.hs b/src/Rlp/HindleyMilner/Types.hs index d3604c6..95576ef 100644 --- a/src/Rlp/HindleyMilner/Types.hs +++ b/src/Rlp/HindleyMilner/Types.hs @@ -73,16 +73,16 @@ instance IsRlpcError TypeError where -- todo: use anti-parser instead of show TyErrCouldNotUnify t u -> Text [ T.pack $ printf "Could not match type `%s` with `%s`." - (rpretty @String t) (rpretty @String u) - , "Expected: " <> rpretty t - , "Got: " <> rpretty u + (rout @String t) (rout @String u) + , "Expected: " <> rout t + , "Got: " <> rout u ] TyErrUntypedVariable n -> Text [ "Untyped (likely undefined) variable `" <> n <> "`" ] TyErrRecursiveType t x -> Text [ T.pack $ printf "Recursive type: `%s' occurs in `%s'" - (rpretty @String t) (rpretty @String x) + (rout @String t) (rout @String x) ] -- type Memo t = HashMap t (Type PsName, PartialJudgement) @@ -156,7 +156,7 @@ demoContext = Context constraintTypes :: Traversal' Constraint (Type PsName) constraintTypes k (Equality s t) = Equality <$> k s <*> k t -instance Pretty Constraint where - pretty (Equality s t) = - hsep [prettyPrec appPrec1 s, "~", prettyPrec appPrec1 t] +instance Out Constraint where + out (Equality s t) = + hsep [outPrec appPrec1 s, "~", outPrec appPrec1 t] diff --git a/src/Rlp/HindleyMilner/Visual.hs b/src/Rlp/HindleyMilner/Visual.hs index 1a8a71a..06d36b4 100644 --- a/src/Rlp/HindleyMilner/Visual.hs +++ b/src/Rlp/HindleyMilner/Visual.hs @@ -9,7 +9,7 @@ import Control.Monad import System.IO import Data.Text qualified as T import Data.Text.IO qualified as T -import Data.Pretty +import Data.Pretty hiding (annotate) import Data.String (IsString(..)) import Data.Foldable import Misc.CofreeF @@ -77,14 +77,14 @@ withTooltip normal hover = -- -- ! onload "installHoverListener(this)" -- $ normal -annExpr :: (ann -> Doc) -> AnnExpr ann -> Html +annExpr :: (a -> Doc ann) -> AnnExpr a -> Html annExpr sf = code . cata \case - t :<$ InL (LitF l) -> withTooltip (rpretty l) (sf' t) - t :<$ InL (VarF n) -> withTooltip (rpretty n) (sf' t) + t :<$ InL (LitF l) -> withTooltip (rout l) (sf' t) + t :<$ InL (VarF n) -> withTooltip (rout n) (sf' t) t :<$ InL (AppF f x) -> withTooltip (f *> " " *> x) (sf' t) t :<$ InL (LamF bs e) -> withTooltip ("λ" *> bs' *> " -> " *> e) (sf' t) where - bs' = fromString . render . hsep $ prettyPrec appPrec1 <$> bs + bs' = fromString . show . hsep $ outPrec appPrec1 <$> bs where sf' = fromString . show . sf @@ -129,5 +129,5 @@ renderExpr e = case runHM' . annotate $ e of renderExpr' :: RlpExpr PsName -> IO () renderExpr' e = case runHM' . solve $ e of Left es -> error (show es) - Right e' -> renderTmp' . annExpr pretty $ e' + Right e' -> renderTmp' . annExpr out $ e' diff --git a/src/Rlp2Core.hs b/src/Rlp2Core.hs index e0b1bcd..2f3d551 100644 --- a/src/Rlp2Core.hs +++ b/src/Rlp2Core.hs @@ -38,7 +38,7 @@ import Text.Show.Deriving import Core.Syntax as Core import Rlp.AltSyntax as Rlp import Compiler.Types -import Data.Pretty (render, pretty) +import Data.Pretty -------------------------------------------------------------------------------- type Tree a = Either Name (Name, Branch a) @@ -64,7 +64,7 @@ desugarRlpProgR :: forall m a. (Monad m) -> RLPCT m Core.Program' desugarRlpProgR p = do let p' = desugarRlpProg p - addDebugMsg "dump-desugared" $ render (pretty p') + addDebugMsg "dump-desugared" $ show (out p') pure p' desugarRlpProg = undefined