/src/Lamdu/Sugar/Eval.hs

https://github.com/Peaker/lamdu · Haskell · 269 lines · 241 code · 26 blank · 2 comment · 5 complexity · aea654ca2664dd01f2f4107c7f2f5f46 MD5 · raw file

  1. {-# LANGUAGE TemplateHaskell, TypeApplications, RecordWildCards, ScopedTypeVariables, KindSignatures #-}
  2. {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DefaultSignatures #-}
  3. module Lamdu.Sugar.Eval
  4. ( addEvaluationResults
  5. ) where
  6. import Control.Applicative (Alternative(..))
  7. import qualified Control.Lens as Lens
  8. import Data.CurAndPrev (CurAndPrev)
  9. import Data.Kind (Type)
  10. import qualified Data.Map as Map
  11. import Hyper
  12. import Hyper.Class.Morph
  13. import Hyper.Syntax.Nominal (NominalDecl)
  14. import Lamdu.Calc.Lens (tIds)
  15. import qualified Lamdu.Calc.Type as T
  16. import qualified Lamdu.Data.Anchors as Anchors
  17. import qualified Lamdu.Data.Ops as DataOps
  18. import qualified Lamdu.Eval.Results as R
  19. import Lamdu.Eval.Results (EvalResults)
  20. import Lamdu.Eval.Results.Process (addTypes)
  21. import Lamdu.Expr.IRef (defI)
  22. import Lamdu.Expr.UniqueId (ToUUID(toUUID))
  23. import qualified Lamdu.Sugar.Convert.Eval as ConvertEval
  24. import Lamdu.Sugar.Convert.Load (makeNominalsMap)
  25. import Lamdu.Sugar.Internal
  26. import Lamdu.Sugar.Internal.EntityId (EntityId(..))
  27. import qualified Lamdu.Sugar.Internal.EntityId as EntityId
  28. import qualified Lamdu.Sugar.Lens as SugarLens
  29. import qualified Lamdu.Sugar.Lens.Annotations as SugarLens
  30. import Lamdu.Sugar.Types hiding (Type)
  31. import qualified Revision.Deltum.IRef as IRef
  32. import Revision.Deltum.Transaction (Transaction)
  33. import Lamdu.Prelude
  34. type T = Transaction
  35. data AddEvalCtx = AddEvalCtx
  36. { _evalResults :: CurAndPrev EvalResults
  37. , _nominalsMap :: Map NominalId (Pure # NominalDecl T.Type)
  38. }
  39. Lens.makeLenses ''AddEvalCtx
  40. class AddEvalToNode i n t0 t1 where
  41. addToNode ::
  42. (Monad m, Applicative i) =>
  43. AddEvalCtx ->
  44. Annotated (Annotation EvalPrep n, a, ConvertPayload m) # t0 ->
  45. Annotated (Annotation (EvaluationScopes InternalName i) n, a, ConvertPayload m) # t1
  46. instance AddEvalToNode i n (Const x) (Const x) where
  47. addToNode r (Ann (Const pl) (Const x)) = Ann (Const (addToPayload r pl)) (Const x)
  48. instance
  49. (AddEval i n e, Applicative i) =>
  50. AddEvalToNode i n
  51. (e (Annotation EvalPrep n) n i o)
  52. (e (Annotation (EvaluationScopes InternalName i) n) n i o) where
  53. addToNode results (Ann a b) =
  54. Ann
  55. { _hAnn = a & Lens._Wrapped %~ addToPayload results
  56. , _hVal = addToBody results (a ^. Lens._Wrapped . _3 . pEntityId) b
  57. }
  58. type AddToBodyType e n i (o :: Type -> Type) m a =
  59. AddEvalCtx -> EntityId ->
  60. e (Annotation EvalPrep n) n i o #
  61. Annotated (Annotation EvalPrep n, a, ConvertPayload m) ->
  62. e (Annotation (EvaluationScopes InternalName i) n) n i o #
  63. Annotated (Annotation (EvaluationScopes InternalName i) n, a, ConvertPayload m)
  64. class AddEval i n e where
  65. addToBody :: (Applicative i, Monad m) => AddToBodyType e n i o m a
  66. default addToBody ::
  67. ( HMorphWithConstraint
  68. (e (Annotation EvalPrep n) n i o)
  69. (e (Annotation (EvaluationScopes InternalName i) n) n i o)
  70. (AddEvalToNode i n)
  71. , Applicative i, Monad m
  72. ) => AddToBodyType e n i o m a
  73. addToBody r _ =
  74. morphMap (Proxy @(AddEvalToNode i n) #?> addToNode r)
  75. instance AddEval i n Assignment where
  76. addToBody r i (BodyFunction x) = addToBody r i x & BodyFunction
  77. addToBody r i (BodyPlain x) = x & apBody %~ addToBody r i & BodyPlain
  78. instance AddEval i n Binder where
  79. addToBody r i = bBody %~ addToBody r i
  80. instance AddEval i n BinderBody where
  81. addToBody r i (BinderLet x) = addToBody r i x & BinderLet
  82. addToBody r i (BinderTerm x) = addToBody r i x & BinderTerm
  83. instance AddEval i n Composite
  84. instance AddEval i n Else where
  85. addToBody r i (SimpleElse x) = addToBody r i x & SimpleElse
  86. addToBody r i (ElseIf x) = x & eIfElse %~ addToBody r i & ElseIf
  87. instance AddEval i n Function where
  88. addToBody ctx i x@Function{..} =
  89. x
  90. { _fParams = addToParams False nomsMap lamApplies _fParams
  91. , _fBody = addToNode ctx _fBody
  92. , _fBodyScopes =
  93. ctx ^. evalResults
  94. <&> (^. R.erAppliesOfLam . Lens.ix u)
  95. <&> Lens.mapped . Lens.mapped %~ BinderParamScopeId . (^. _1)
  96. }
  97. where
  98. EntityId u = i
  99. nomsMap = ctx ^. nominalsMap
  100. lamApplies =
  101. ctx ^. evalResults
  102. <&> (^. R.erAppliesOfLam . Lens.ix u)
  103. <&> Map.fromList . (^.. traverse . traverse)
  104. instance AddEval i n IfElse
  105. instance AddEval i n LabeledApply
  106. instance AddEval i n PostfixApply
  107. instance AddEval i n PostfixFunc
  108. instance AddEval i n Let where
  109. addToBody r _ l =
  110. l
  111. { _lValue = l ^. lValue & addToNode r
  112. , _lNames = l ^. lNames & addToParams True (r ^. nominalsMap) vals
  113. , _lBody = l ^. lBody & addToNode r
  114. }
  115. where
  116. EntityId u = l ^. lValue . annotation . _3 . pEntityId
  117. vals = r ^. evalResults <&> (^. R.erExprValues . Lens.ix u)
  118. instance AddEval i n Term where
  119. addToBody r i =
  120. \case
  121. BodyLeaf x -> BodyLeaf x
  122. BodySimpleApply (App x y) -> App (addToNode r x) (addToNode r y) & BodySimpleApply
  123. BodyRecord c -> addToBody r i c & BodyRecord
  124. BodyIfElse x -> addToBody r i x & BodyIfElse
  125. BodyLam lam -> lam & lamFunc %~ addToBody r i & BodyLam
  126. BodyToNom nom -> nom & nVal %~ addToNode r & BodyToNom
  127. BodyLabeledApply x -> addToBody r i x & BodyLabeledApply
  128. BodyFragment f -> f & fExpr %~ addToNode r & BodyFragment
  129. BodyPostfixApply x -> addToBody r i x & BodyPostfixApply
  130. BodyPostfixFunc x -> addToBody r i x & BodyPostfixFunc
  131. BodyNullaryInject (NullaryInject j e) ->
  132. NullaryInject (addToNode r j) (addToNode r e) & BodyNullaryInject
  133. addToParams ::
  134. Applicative i =>
  135. Bool ->
  136. Map NominalId (Pure # NominalDecl T.Type) ->
  137. CurAndPrev (Map ScopeId (R.Val ())) ->
  138. LhsNames n i o (Annotation EvalPrep n) ->
  139. LhsNames n i o (Annotation (EvaluationScopes InternalName i) n)
  140. addToParams isLet nomsMap lamApplies =
  141. \case
  142. LhsVar v ->
  143. v & vParam . fpAnnotation . _AnnotationVal %~
  144. (if isLet then ConvertEval.results else ConvertEval.param)
  145. (EntityId.ofEvalOf (v ^. vTag . oTag . tagRefTag . tagInstance)) .
  146. appliesOfLam
  147. & LhsVar
  148. LhsRecord ps ->
  149. ps
  150. & SugarLens.taggedListItems %~ fixItem isLet nomsMap lamApplies
  151. & LhsRecord
  152. where
  153. appliesOfLam v = lamApplies <&> traverse %~ addTypes nomsMap (v ^. eType)
  154. fixItem ::
  155. Applicative i =>
  156. Bool ->
  157. Map NominalId (Pure # NominalDecl T.Type) ->
  158. CurAndPrev (Map ScopeId (R.Val ())) ->
  159. TaggedItem n i o (LhsField n (Annotation EvalPrep n)) ->
  160. TaggedItem n i o (LhsField n (Annotation (EvaluationScopes InternalName i) n))
  161. fixItem isLet nomsMap lamApplies item =
  162. item & tiValue %~ fixLhsField isLet nomsMap lamApplies tag
  163. where
  164. tag = item ^. tiTag . tagRefTag
  165. fixLhsField ::
  166. Applicative i =>
  167. Bool ->
  168. Map NominalId (Pure # NominalDecl T.Type) ->
  169. CurAndPrev (Map ScopeId (R.Val ())) ->
  170. Tag n ->
  171. LhsField n (Annotation EvalPrep n) ->
  172. LhsField n (Annotation (EvaluationScopes InternalName i) n)
  173. fixLhsField isLet nomsMap lamApplies tag (LhsField p s) =
  174. LhsField
  175. (p <&> _AnnotationVal %~
  176. \v ->
  177. apps <&> traverse %~ addTypes nomsMap (v ^. eType)
  178. & (if isLet then ConvertEval.results else ConvertEval.param)
  179. (EntityId.ofEvalOf (tag ^. tagInstance))
  180. )
  181. (s <&> traverse %~
  182. \(t, f) ->
  183. (t, fixLhsField isLet nomsMap apps t f)
  184. )
  185. where
  186. apps = lamApplies <&> traverse %~ R.extractField () (tag ^. tagVal)
  187. addToPayload ::
  188. Applicative i =>
  189. AddEvalCtx ->
  190. (Annotation EvalPrep n, a, ConvertPayload m) ->
  191. (Annotation (EvaluationScopes InternalName i) n, a, ConvertPayload m)
  192. addToPayload ctx a =
  193. a
  194. & _1 . _AnnotationVal %~
  195. \v ->
  196. ctx ^. evalResults
  197. <&> (^. R.erExprValues . Lens.at u)
  198. <&> fromMaybe mempty
  199. <&> Lens.mapped %~ addTypes (ctx ^. nominalsMap) (v ^. eType)
  200. & ConvertEval.results (EntityId.ofEvalOf i)
  201. where
  202. EntityId u = i
  203. i = a ^. _3 . pEntityId
  204. addEvaluationResults ::
  205. forall n m i a.
  206. (Monad m, Applicative i) =>
  207. Anchors.CodeAnchors m ->
  208. CurAndPrev EvalResults ->
  209. WorkArea (Annotation EvalPrep n) n i (T m) (Annotation EvalPrep n, a, ConvertPayload m) ->
  210. T m (
  211. WorkArea (Annotation (EvaluationScopes InternalName i) n) n i (T m)
  212. (Annotation (EvaluationScopes InternalName i) n, a, ConvertPayload m))
  213. addEvaluationResults cp r wa@(WorkArea panes globals) =
  214. makeNominalsMap
  215. ( wa ^..
  216. SugarLens.annotations @(Annotation EvalPrep n)
  217. . _AnnotationVal . eType . tIds
  218. )
  219. <&> AddEvalCtx r
  220. <&>
  221. \ctx ->
  222. let fixDef def =
  223. def &
  224. drBody . _DefinitionBodyExpression %~ go
  225. where
  226. go expr =
  227. expr
  228. & deResult .~ (r <&> mkRes (expr ^. deContent . annotation . _3 . pEntityId))
  229. & deContent %~ addToNode ctx
  230. mkRes exprId res =
  231. EvalSuccess <$ res ^? R.erExprValues . Lens.ix (toUUID exprId) . traverse
  232. <|> (res ^. R.erErrors . Lens.at (def ^. drDefI) <&> mkError)
  233. mkError err =
  234. EvalException
  235. { _evalExceptionType = err ^. R.error
  236. , _evalExceptionJumpTo =
  237. err ^. R.errorPosition <&>
  238. \(v, pos) ->
  239. EntityId.ofIRef (IRef.unsafeFromUUID pos) <$ DataOps.newPane cp (Anchors.PaneDefinition (defI v))
  240. }
  241. & EvalError
  242. in
  243. WorkArea (panes <&> paneBody . _PaneDefinition %~ fixDef) globals