Skip to content

Commit 66d7537

Browse files
committed
Use traversal based on Prisms
1 parent fbc129b commit 66d7537

File tree

2 files changed

+56
-60
lines changed

2 files changed

+56
-60
lines changed

lib/Language/PureScript/Backend/IR/Query.hs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Language.PureScript.Backend.IR.Query where
22

3-
import Control.Monad.Trans.Accum (Accum, add, execAccum)
3+
import Control.Lens.Plated (transformMOf)
4+
import Control.Monad.Trans.Accum (add, execAccum)
45
import Data.Map qualified as Map
56
import Data.Set qualified as Set
67
import Language.PureScript.Backend.IR.Linker (UberModule (..))
@@ -15,7 +16,7 @@ import Language.PureScript.Backend.IR.Types
1516
, countFreeRef
1617
, countFreeRefs
1718
, listGrouping
18-
, traverseExpBottomUp
19+
, subexpressions
1920
)
2021
import Language.PureScript.Backend.IR.Types qualified as IR
2122
import Language.PureScript.Names (runtimeLazyName)
@@ -48,7 +49,7 @@ findPrimModuleInExpr expr =
4849

4950
collectBoundNames Exp Set Name
5051
collectBoundNames =
51-
(`execAccum` Set.empty) . traverseExpBottomUp @_ @(Accum (Set Name)) \e
52+
(`execAccum` Set.empty) . transformMOf subexpressions \e
5253
case e of
5354
IR.Abs _ann (IR.ParamNamed _paramAnn name) _body
5455
e <$ add (Set.singleton name)

lib/Language/PureScript/Backend/IR/Types.hs

+52-57
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Language.PureScript.Backend.IR.Types where
44

5-
import Control.Lens (Prism', prism')
5+
import Control.Lens (Prism', Traversal', makePrisms, prism')
66
import Data.Deriving (deriveEq1, deriveOrd1)
77
import Data.Map qualified as Map
88
import Data.MonoidMap (MonoidMap)
@@ -61,6 +61,19 @@ instance Semigroup Info where
6161
instance 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+
6477
data 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-
127130
isLiteral RawExp ann Bool
128131
isLiteral = (||) <$> 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-
148148
ctorId ModuleName TyName CtorName Text
149149
ctorId 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

414405
data 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

Comments
 (0)