blob: 64b4241064e3f15579c80818dba28343ca53c10e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
module Script.Expr.Class (
ExprType(..),
RecordSelector(..),
ExprListUnpacker(..),
ExprEnumerator(..),
) where
import Data.Scientific
import Data.Text (Text)
import Data.Text qualified as T
import Data.Typeable
import Data.Void
class Typeable a => ExprType a where
textExprType :: proxy a -> Text
textExprValue :: a -> Text
recordMembers :: [(Text, RecordSelector a)]
recordMembers = []
exprListUnpacker :: proxy a -> Maybe (ExprListUnpacker a)
exprListUnpacker _ = Nothing
exprEnumerator :: proxy a -> Maybe (ExprEnumerator a)
exprEnumerator _ = Nothing
data RecordSelector a = forall b. ExprType b => RecordSelector (a -> b)
data ExprListUnpacker a = forall e. ExprType e => ExprListUnpacker (a -> [e]) (Proxy a -> Proxy e)
data ExprEnumerator a = ExprEnumerator (a -> a -> [a]) (a -> a -> a -> [a])
instance ExprType Integer where
textExprType _ = T.pack "integer"
textExprValue x = T.pack (show x)
exprEnumerator _ = Just $ ExprEnumerator enumFromTo enumFromThenTo
instance ExprType Scientific where
textExprType _ = T.pack "number"
textExprValue x = T.pack (show x)
instance ExprType Bool where
textExprType _ = T.pack "bool"
textExprValue True = T.pack "true"
textExprValue False = T.pack "false"
instance ExprType Text where
textExprType _ = T.pack "string"
textExprValue x = T.pack (show x)
instance ExprType Void where
textExprType _ = T.pack "void"
textExprValue _ = T.pack "<void>"
instance ExprType a => ExprType [a] where
textExprType _ = "[" <> textExprType @a Proxy <> "]"
textExprValue x = "[" <> T.intercalate ", " (map textExprValue x) <> "]"
exprListUnpacker _ = Just $ ExprListUnpacker id (const Proxy)
|