2
2
3
3
module Language.PureScript.Backend.IR.Types where
4
4
5
- import Control.Lens (Prism' , prism' )
5
+ import Control.Lens (Prism' , Traversal' , makePrisms , prism' )
6
6
import Data.Deriving (deriveEq1 , deriveOrd1 )
7
7
import Data.Map qualified as Map
8
8
import Data.MonoidMap (MonoidMap )
@@ -61,6 +61,19 @@ instance Semigroup Info where
61
61
instance Monoid Info where
62
62
mempty = Info mempty
63
63
64
+ data AlgebraicType = SumType | ProductType
65
+ deriving stock (Generic , Eq , Ord , Show , Enum , Bounded )
66
+
67
+ newtype Index = Index { unIndex ∷ Natural }
68
+ deriving newtype (Show , Eq , Ord , Num , Enum , Real , Integral )
69
+
70
+ data Parameter ann = ParamUnused ann | ParamNamed ann Name
71
+ deriving stock (Show , Eq , Ord )
72
+
73
+ paramName ∷ Parameter ann → Maybe Name
74
+ paramName (ParamUnused _ann) = Nothing
75
+ paramName (ParamNamed _ann name) = Just name
76
+
64
77
data RawExp ann
65
78
= LiteralInt ann Integer
66
79
| LiteralFloat ann Double
@@ -114,16 +127,6 @@ getAnn = \case
114
127
Exception ann _ → ann
115
128
ForeignImport ann _ _ _ → ann
116
129
117
- newtype Index = Index { unIndex ∷ Natural }
118
- deriving newtype (Show , Eq , Ord , Num , Enum , Real , Integral )
119
-
120
- data Parameter ann = ParamUnused ann | ParamNamed ann Name
121
- deriving stock (Show , Eq , Ord )
122
-
123
- paramName ∷ Parameter ann → Maybe Name
124
- paramName (ParamUnused _ann) = Nothing
125
- paramName (ParamNamed _ann name) = Just name
126
-
127
130
isLiteral ∷ RawExp ann → Bool
128
131
isLiteral = (||) <$> isNonRecursiveLiteral <*> isRecursiveLiteral
129
132
@@ -142,9 +145,6 @@ isRecursiveLiteral = \case
142
145
LiteralObject {} → True
143
146
_ → False
144
147
145
- data AlgebraicType = SumType | ProductType
146
- deriving stock (Generic , Eq , Ord , Show , Enum , Bounded )
147
-
148
148
ctorId ∷ ModuleName → TyName → CtorName → Text
149
149
ctorId modName tyName ctorName =
150
150
runModuleName modName
@@ -367,49 +367,40 @@ annotateExpM around annotateExp annotateParam annotateName =
367
367
mkAnn ∷ RawExp ann → m (RawExp ann' )
368
368
mkAnn = annotateExpM around annotateExp annotateParam annotateName
369
369
370
- traverseExpBottomUp
371
- ∷ ∀ ann m
372
- . Monad m
373
- ⇒ (RawExp ann → m (RawExp ann ))
374
- → (RawExp ann → m (RawExp ann ))
375
- traverseExpBottomUp visit = go
376
- where
377
- go ∷ RawExp ann → m (RawExp ann )
378
- go e =
379
- visit =<< case e of
380
- LiteralArray ann as →
381
- LiteralArray ann <$> traverse go as
382
- LiteralObject ann props →
383
- LiteralObject ann <$> traverse (traverse go) props
384
- ReflectCtor ann a →
385
- ReflectCtor ann <$> go a
386
- DataArgumentByIndex ann idx a →
387
- DataArgumentByIndex ann idx <$> go a
388
- Eq ann a b →
389
- Eq ann <$> go a <*> go b
390
- ArrayLength ann a →
391
- ArrayLength ann <$> go a
392
- ArrayIndex ann a idx → do
393
- a' ← go a
394
- pure $ ArrayIndex ann a' idx
395
- ObjectProp ann a prp → do
396
- a' ← go a
397
- pure $ ObjectProp ann a' prp
398
- ObjectUpdate ann a ps →
399
- ObjectUpdate ann
400
- <$> go a
401
- <*> traverse (traverse go) ps
402
- App ann a b →
403
- App ann <$> go a <*> go b
404
- Abs ann arg a →
405
- Abs ann arg <$> go a
406
- Let ann bs body →
407
- Let ann
408
- <$> traverse (traverse (\ (a, n, expr) → (a,n,) <$> go expr)) bs
409
- <*> go body
410
- IfThenElse ann p th el →
411
- IfThenElse ann <$> go p <*> go th <*> go el
412
- _ → pure e
370
+ {-# INLINE subexpressions #-}
371
+
372
+ -- | Get all the direct child 'RawExp's of the given 'RawExp'
373
+ subexpressions ∷ Traversal' (RawExp ann ) (RawExp ann )
374
+ subexpressions go = \ case
375
+ LiteralArray ann as →
376
+ LiteralArray ann <$> traverse go as
377
+ LiteralObject ann props →
378
+ LiteralObject ann <$> traverse (traverse go) props
379
+ ReflectCtor ann a →
380
+ ReflectCtor ann <$> go a
381
+ DataArgumentByIndex ann idx a →
382
+ DataArgumentByIndex ann idx <$> go a
383
+ Eq ann a b →
384
+ Eq ann <$> go a <*> go b
385
+ ArrayLength ann a →
386
+ ArrayLength ann <$> go a
387
+ ArrayIndex ann a idx →
388
+ ArrayIndex ann <$> go a <*> pure idx
389
+ ObjectProp ann a prp →
390
+ ObjectProp ann <$> go a <*> pure prp
391
+ ObjectUpdate ann a ps →
392
+ ObjectUpdate ann <$> go a <*> traverse (traverse go) ps
393
+ App ann a b →
394
+ App ann <$> go a <*> go b
395
+ Abs ann arg a →
396
+ Abs ann arg <$> go a
397
+ Let ann bs body →
398
+ Let ann
399
+ <$> traverse (traverse (\ (a, n, expr) → (a,n,) <$> go expr)) bs
400
+ <*> go body
401
+ IfThenElse ann p th el →
402
+ IfThenElse ann <$> go p <*> go th <*> go el
403
+ e → pure e
413
404
414
405
data RewriteMod = Recurse | Stop
415
406
deriving stock (Show , Eq , Ord )
@@ -760,3 +751,7 @@ shift offset namespace minIndex expression =
760
751
_ → expression
761
752
where
762
753
go = shift offset namespace minIndex
754
+
755
+ $ (makePrisms ''AlgebraicType)
756
+ $ (makePrisms ''Parameter)
757
+ $ (makePrisms ''RawExp)
0 commit comments