@@ -11,7 +11,6 @@ module Data.Core.Pretty
1111import Control.Effect.Reader
1212import Data.Core
1313import Data.File
14- import Data.Functor.Const
1514import Data.Name
1615import Data.Scope
1716import Data.Term
@@ -56,57 +55,58 @@ inParens amount go = do
5655 body <- with amount go
5756 pure (encloseIf (amount >= prec) (symbol " (" ) (symbol " )" ) body)
5857
59- prettify :: (Member (Reader [AnsiDoc ]) sig , Member (Reader Prec ) sig , Carrier sig m )
60- => Style
61- -> Core (Const (m AnsiDoc )) a
62- -> m AnsiDoc
63- prettify style = \ case
64- Let a -> pure $ keyword " let" <+> name a
65- Const a :>> Const b -> do
66- prec <- ask @ Prec
67- fore <- with 12 a
68- aft <- with 12 b
69-
70- let open = symbol (" {" <> softline)
71- close = symbol (softline <> " }" )
72- separator = " ;" <> Pretty. line
73- body = fore <> separator <> aft
74-
75- pure . Pretty. align $ encloseIf (12 > prec) open close (Pretty. align body)
76-
77- Lam n f -> inParens 11 $ do
78- (x, body) <- bind n f
79- pure (lambda <> x <+> arrow <+> body)
80-
81- Frame -> pure $ primitive " frame"
82- Unit -> pure $ primitive " unit"
83- Bool b -> pure $ primitive (if b then " true" else " false" )
84- String s -> pure . strlit $ Pretty. viaShow s
85-
86- Const f :$ Const x -> inParens 11 $ (<+>) <$> f <*> x
87-
88- If (Const con) (Const tru) (Const fal) -> do
89- con' <- " if" `appending` con
90- tru' <- " then" `appending` tru
91- fal' <- " else" `appending` fal
92- pure $ Pretty. sep [con', tru', fal']
93-
94- Load (Const p) -> " load" `appending` p
95- Edge Lexical (Const n) -> " lexical" `appending` n
96- Edge Import (Const n) -> " import" `appending` n
97- Const item :. Const body -> inParens 4 $ do
98- f <- item
99- g <- body
100- pure (f <> symbol " ." <> g)
101-
102- Const lhs := Const rhs -> inParens 3 $ do
103- f <- lhs
104- g <- rhs
105- pure (f <+> symbol " =" <+> g)
106-
107- -- Annotations are not pretty-printed, as it lowers the signal/noise ratio too profoundly.
108- Ann _ (Const c) -> c
109- where bind (Ignored x) f = let x' = name x in (,) x' <$> local (x': ) (getConst (unScope f))
58+ prettyCore :: Style -> Term Core User -> AnsiDoc
59+ prettyCore style = run . runReader @ Prec 0 . go (pure . name)
60+ where go :: (Member (Reader Prec ) sig , Carrier sig m ) => (a -> m AnsiDoc ) -> Term Core a -> m AnsiDoc
61+ go var = \ case
62+ Var v -> var v
63+ Term t -> case t of
64+ Let a -> pure $ keyword " let" <+> name a
65+ a :>> b -> do
66+ prec <- ask @ Prec
67+ fore <- with 12 (go var a)
68+ aft <- with 12 (go var b)
69+
70+ let open = symbol (" {" <> softline)
71+ close = symbol (softline <> " }" )
72+ separator = " ;" <> Pretty. line
73+ body = fore <> separator <> aft
74+
75+ pure . Pretty. align $ encloseIf (12 > prec) open close (Pretty. align body)
76+
77+ Lam n f -> inParens 11 $ do
78+ (x, body) <- bind n f
79+ pure (lambda <> x <+> arrow <+> body)
80+
81+ Frame -> pure $ primitive " frame"
82+ Unit -> pure $ primitive " unit"
83+ Bool b -> pure $ primitive (if b then " true" else " false" )
84+ String s -> pure . strlit $ Pretty. viaShow s
85+
86+ f :$ x -> inParens 11 $ (<+>) <$> go var f <*> go var x
87+
88+ If con tru fal -> do
89+ con' <- " if" `appending` go var con
90+ tru' <- " then" `appending` go var tru
91+ fal' <- " else" `appending` go var fal
92+ pure $ Pretty. sep [con', tru', fal']
93+
94+ Load p -> " load" `appending` go var p
95+ Edge Lexical n -> " lexical" `appending` go var n
96+ Edge Import n -> " import" `appending` go var n
97+ item :. body -> inParens 4 $ do
98+ f <- go var item
99+ g <- go var body
100+ pure (f <> symbol " ." <> g)
101+
102+ lhs := rhs -> inParens 3 $ do
103+ f <- go var lhs
104+ g <- go var rhs
105+ pure (f <+> symbol " =" <+> g)
106+
107+ -- Annotations are not pretty-printed, as it lowers the signal/noise ratio too profoundly.
108+ Ann _ c -> go var c
109+ where bind (Ignored x) f = let x' = name x in (,) x' <$> go (incr (const (pure x')) var) (fromScope f)
110110 lambda = case style of
111111 Unicode -> symbol " λ"
112112 Ascii -> symbol " \\ "
@@ -117,8 +117,3 @@ prettify style = \case
117117
118118appending :: Functor f => AnsiDoc -> f AnsiDoc -> f AnsiDoc
119119appending k item = (keyword k <+> ) <$> item
120-
121- prettyCore :: Style -> Term Core User -> AnsiDoc
122- prettyCore s = run . runReader @ Prec 0 . runReader @ [AnsiDoc ] [] . cata id (prettify s) bound (pure . name)
123- where bound (Z _) = asks (head @ AnsiDoc )
124- bound (S n) = local (tail @ AnsiDoc ) n
0 commit comments