22
33module Language.PureScript.Backend.IR.Types where
44
5- import Control.Lens (Prism' , prism' )
5+ import Control.Lens (Prism' , Traversal' , makePrisms , prism' )
66import Data.Deriving (deriveEq1 , deriveOrd1 )
77import Data.Map qualified as Map
88import Data.MonoidMap (MonoidMap )
@@ -61,6 +61,19 @@ instance Semigroup Info where
6161instance Monoid Info where
6262 mempty = Info mempty
6363
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+
6477data RawExp ann
6578 = LiteralInt ann Integer
6679 | LiteralFloat ann Double
@@ -114,16 +127,6 @@ getAnn = \case
114127 Exception ann _ → ann
115128 ForeignImport ann _ _ _ → ann
116129
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-
127130isLiteral ∷ RawExp ann → Bool
128131isLiteral = (||) <$> isNonRecursiveLiteral <*> isRecursiveLiteral
129132
@@ -142,9 +145,6 @@ isRecursiveLiteral = \case
142145 LiteralObject {} → True
143146 _ → False
144147
145- data AlgebraicType = SumType | ProductType
146- deriving stock (Generic , Eq , Ord , Show , Enum , Bounded )
147-
148148ctorId ∷ ModuleName → TyName → CtorName → Text
149149ctorId modName tyName ctorName =
150150 runModuleName modName
@@ -367,49 +367,40 @@ annotateExpM around annotateExp annotateParam annotateName =
367367 mkAnn ∷ RawExp ann → m (RawExp ann' )
368368 mkAnn = annotateExpM around annotateExp annotateParam annotateName
369369
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
413404
414405data RewriteMod = Recurse | Stop
415406 deriving stock (Show , Eq , Ord )
@@ -760,3 +751,7 @@ shift offset namespace minIndex expression =
760751 _ → expression
761752 where
762753 go = shift offset namespace minIndex
754+
755+ $ (makePrisms ''AlgebraicType)
756+ $ (makePrisms ''Parameter)
757+ $ (makePrisms ''RawExp)
0 commit comments