/
hooks_set.go
129 lines (114 loc) · 4.37 KB
/
hooks_set.go
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// File provided by the K Framework Go backend. Timestamp: 2019-08-28 22:25:14.706
package ieletestinginterpreter
import (
m "github.com/ElrondNetwork/elrond-vm/iele/elrond/node/iele-testing-kompiled/ieletestingmodel"
)
type setHooksType int
const setHooks setHooksType = 0
func (setHooksType) unit(lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
return interpreter.Model.EmptySet(m.CollectionFor(lbl), sort), nil
}
// returns a set with 1 element
func (setHooksType) element(e m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
empty := interpreter.Model.EmptySet(m.CollectionFor(lbl), sort)
return interpreter.Model.SetAdd(empty, e), nil
}
func (setHooksType) in(e m.KReference, kset m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset) {
return invalidArgsResult()
}
elemExists := interpreter.Model.SetContains(kset, e)
return m.ToKBool(elemExists), nil
}
func (setHooksType) concat(kset1 m.KReference, kset2 m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
result, ok := interpreter.Model.SetConcat(kset1, kset2)
if !ok {
return invalidArgsResult()
}
return result, nil
}
func (setHooksType) difference(kset1 m.KReference, kset2 m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset1) {
return invalidArgsResult()
}
if !interpreter.Model.IsSet(kset2) {
return invalidArgsResult()
}
result := interpreter.Model.EmptySet(lbl, sort)
interpreter.Model.SetForEach(kset1, func(elem1 KReference) bool {
if !interpreter.Model.SetContains(kset2, elem1) {
result = interpreter.Model.SetAdd(result, elem1)
}
return false
})
return result, nil
}
// tests if kset1 is a subset of kset2
func (setHooksType) inclusion(kset1 m.KReference, kset2 m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset1) {
return invalidArgsResult()
}
if !interpreter.Model.IsSet(kset2) {
return invalidArgsResult()
}
result := true
interpreter.Model.SetForEach(kset1, func(elem1 KReference) bool {
if !interpreter.Model.SetContains(kset2, elem1) {
result = false
}
return true
})
return m.ToKBool(result), nil
}
func (setHooksType) intersection(kset1 m.KReference, kset2 m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset1) {
return invalidArgsResult()
}
if !interpreter.Model.IsSet(kset2) {
return invalidArgsResult()
}
result := interpreter.Model.EmptySet(lbl, sort)
interpreter.Model.SetForEach(kset1, func(elem1 KReference) bool {
if interpreter.Model.SetContains(kset2, elem1) {
result = interpreter.Model.SetAdd(result, elem1)
}
return false
})
return result, nil
}
func (setHooksType) choice(kset m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
result, ok := interpreter.Model.SetChoice(kset)
if !ok {
return invalidArgsResult()
}
return result, nil
}
func (setHooksType) size(kset m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset) {
return invalidArgsResult()
}
size := interpreter.Model.SetSize(kset)
return interpreter.Model.FromInt(size), nil
}
func (setHooksType) set2list(kset m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
if !interpreter.Model.IsSet(kset) {
return invalidArgsResult()
}
var list []KReference
interpreter.Model.SetForEach(kset, func(elem KReference) bool {
list = append(list, elem)
return false
})
return interpreter.Model.NewList(m.SortList, m.KLabelForList, list), nil
}
func (setHooksType) list2set(klist m.KReference, lbl m.KLabel, sort m.Sort, config m.KReference, interpreter *Interpreter) (m.KReference, error) {
l, isList := interpreter.Model.GetListObject(klist)
if !isList {
return invalidArgsResult()
}
result := interpreter.Model.EmptySet(m.KLabelForSet, m.SortSet)
for _, e := range l.Data {
result = interpreter.Model.SetAdd(result, e)
}
return result, nil
}