Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. {-# language GADTs, StandaloneDeriving #-}
  2. {-# language LambdaCase #-}
  3. {-# language MultiParamTypeClasses #-}
  4. {-# language TemplateHaskell #-}
  5. module Graph where
  6.  
  7. import Control.Applicative
  8. import Data.Dependent.Map (DMap)
  9. import Data.Dependent.Sum (ShowTag(..))
  10. import Data.GADT.Compare.TH (deriveGEq, deriveGCompare)
  11. import Data.GADT.Show.TH (deriveGShow)
  12.  
  13. import qualified Data.Dependent.Map as DMap
  14.  
  15. data ID a where
  16. ID_Expr :: Int -> ID Expr
  17. ID_Bound :: Int -> ID Bound
  18. ID_Binding :: Int -> ID Binding
  19. deriving instance Eq (ID a)
  20. deriving instance Ord (ID a)
  21. deriving instance Show (ID a)
  22.  
  23. data Bound = Bound String
  24. deriving (Eq, Show)
  25.  
  26. data Binding = Binding String
  27. deriving (Eq, Show)
  28.  
  29. data Expr
  30. = Var Bound
  31. | App Expr Expr
  32. | Lam Binding Expr
  33. deriving (Eq, Show)
  34.  
  35. data NodeInfo a where
  36. BoundInfo ::
  37. -- value
  38. String ->
  39. NodeInfo Bound
  40. BindingInfo ::
  41. -- value
  42. String ->
  43. NodeInfo Binding
  44. VarInfo ::
  45. -- child
  46. ID Bound ->
  47. NodeInfo Expr
  48. AppInfo ::
  49. -- left child
  50. ID Expr ->
  51. -- right child
  52. ID Expr ->
  53. NodeInfo Expr
  54. LamInfo ::
  55. -- left child
  56. ID Binding ->
  57. -- right child
  58. ID Expr ->
  59. NodeInfo Expr
  60. deriving instance Eq (NodeInfo a)
  61. deriving instance Ord (NodeInfo a)
  62. deriving instance Show (NodeInfo a)
  63.  
  64. deriveGEq ''ID
  65. deriveGCompare ''ID
  66. deriveGShow ''ID
  67.  
  68. instance ShowTag ID NodeInfo where
  69. showTaggedPrec ID_Expr{} = showsPrec
  70. showTaggedPrec ID_Bound{} = showsPrec
  71. showTaggedPrec ID_Binding{} = showsPrec
  72.  
  73. class Unbuild a where
  74. unbuild :: DMap ID NodeInfo -> a -> (ID a, DMap ID NodeInfo)
  75.  
  76. instance Unbuild Bound where
  77. unbuild m (Bound a) =
  78. let
  79. i' = (ID_Bound $ DMap.size m)
  80. in
  81. (i', DMap.insert i' (BoundInfo a) m)
  82.  
  83. instance Unbuild Binding where
  84. unbuild m (Binding a) =
  85. let
  86. i' = (ID_Binding $ DMap.size m)
  87. in
  88. (i', DMap.insert i' (BindingInfo a) m)
  89.  
  90. instance Unbuild Expr where
  91. unbuild m (Var a) =
  92. let
  93. (a', m') = unbuild m a
  94. i' = (ID_Expr $ DMap.size m')
  95. in
  96. (i', DMap.insert i' (VarInfo a') m')
  97. unbuild m (App a b) =
  98. let
  99. (a', m') = unbuild m a
  100. (b', m'') = unbuild m' b
  101. i' = (ID_Expr $ DMap.size m'')
  102. in
  103. (i', DMap.insert i' (AppInfo a' b') m'')
  104. unbuild m (Lam a b) =
  105. let
  106. (a', m') = unbuild m a
  107. (b', m'') = unbuild m' b
  108. i' = (ID_Expr $ DMap.size m'')
  109. in
  110. (i', DMap.insert i' (LamInfo a' b') m'')
  111.  
  112. rebuild :: DMap ID NodeInfo -> ID a -> Maybe a
  113. rebuild m i =
  114. DMap.lookup i m >>=
  115. \case
  116. BoundInfo val -> pure $ Bound val
  117. BindingInfo val -> pure $ Binding val
  118. VarInfo val -> Var <$> rebuild m val
  119. AppInfo a b -> App <$> rebuild m a <*> rebuild m b
  120. LamInfo a b -> Lam <$> rebuild m a <*> rebuild m b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement