occam-furtle 3.0.305 → 3.0.310

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/lib/element/assignment/array.js +20 -20
  2. package/lib/element/assignment/object.js +17 -14
  3. package/lib/element/binding/named.js +6 -6
  4. package/lib/element/binding.js +4 -4
  5. package/lib/element/every.js +8 -8
  6. package/lib/element/nodeQuery.js +5 -5
  7. package/lib/element/nodesQuery.js +5 -5
  8. package/lib/element/parameter.js +4 -4
  9. package/lib/element/primitive.js +42 -23
  10. package/lib/element/procedure/anonymous.js +4 -4
  11. package/lib/element/procedure.js +8 -10
  12. package/lib/element/reduce.js +6 -6
  13. package/lib/element/some.js +8 -8
  14. package/lib/element/term/comparison.js +4 -4
  15. package/lib/element/term/logical.js +7 -7
  16. package/lib/element/term/negated.js +5 -5
  17. package/lib/element/term.js +3 -3
  18. package/lib/element/ternary.js +5 -5
  19. package/lib/element/type.js +94 -0
  20. package/lib/element/value.js +56 -5
  21. package/lib/element/variable.js +4 -4
  22. package/lib/node/assignments/variable.js +4 -10
  23. package/lib/node/binding/named.js +2 -2
  24. package/lib/node/binding.js +16 -23
  25. package/lib/node/declaration/procedure.js +4 -10
  26. package/lib/node/parameter.js +5 -10
  27. package/lib/node/primitive.js +9 -9
  28. package/lib/node/procedure/anoymous.js +4 -10
  29. package/lib/node/type.js +41 -0
  30. package/lib/nominalValueProperties.js +86 -0
  31. package/lib/nominalValueProperty.js +45 -0
  32. package/lib/nonTerminalNodeMap.js +3 -1
  33. package/lib/preamble.js +2 -1
  34. package/lib/ruleNames.js +5 -1
  35. package/lib/typeNames.js +34 -0
  36. package/lib/utilities/element.js +50 -18
  37. package/lib/utilities/primitive.js +13 -9
  38. package/lib/utilities/string.js +35 -22
  39. package/lib/utilities/value.js +9 -20
  40. package/lib/utilities/values.js +3 -3
  41. package/package.json +2 -2
  42. package/src/element/assignment/array.js +31 -26
  43. package/src/element/assignment/object.js +20 -13
  44. package/src/element/binding/named.js +10 -6
  45. package/src/element/binding.js +5 -3
  46. package/src/element/every.js +9 -7
  47. package/src/element/nodeQuery.js +5 -4
  48. package/src/element/nodesQuery.js +5 -4
  49. package/src/element/parameter.js +5 -3
  50. package/src/element/primitive.js +56 -26
  51. package/src/element/procedure/anonymous.js +5 -3
  52. package/src/element/procedure.js +8 -12
  53. package/src/element/reduce.js +6 -5
  54. package/src/element/some.js +9 -7
  55. package/src/element/term/comparison.js +6 -3
  56. package/src/element/term/logical.js +8 -6
  57. package/src/element/term/negated.js +5 -4
  58. package/src/element/term.js +3 -2
  59. package/src/element/ternary.js +5 -4
  60. package/src/element/type.js +128 -0
  61. package/src/element/value.js +27 -3
  62. package/src/element/variable.js +5 -3
  63. package/src/node/assignments/variable.js +5 -13
  64. package/src/node/binding/named.js +1 -1
  65. package/src/node/binding.js +19 -30
  66. package/src/node/declaration/procedure.js +5 -13
  67. package/src/node/parameter.js +6 -14
  68. package/src/node/primitive.js +8 -8
  69. package/src/node/procedure/anoymous.js +5 -13
  70. package/src/node/type.js +43 -0
  71. package/src/nominalValueProperties.js +103 -0
  72. package/src/nominalValueProperty.js +55 -0
  73. package/src/nonTerminalNodeMap.js +3 -0
  74. package/src/preamble.js +1 -0
  75. package/src/ruleNames.js +1 -0
  76. package/src/typeNames.js +7 -0
  77. package/src/utilities/element.js +67 -19
  78. package/src/utilities/primitive.js +31 -22
  79. package/src/utilities/string.js +42 -24
  80. package/src/utilities/value.js +18 -31
  81. package/src/utilities/values.js +1 -2
  82. package/lib/nodeProperties.js +0 -78
  83. package/lib/nodeProperty.js +0 -45
  84. package/lib/types.js +0 -34
  85. package/src/nodeProperties.js +0 -89
  86. package/src/nodeProperty.js +0 -53
  87. package/src/types.js +0 -7
@@ -37,10 +37,12 @@ export default define(class Binding extends Element {
37
37
 
38
38
  context.trace(`Comparing the '${termString}' term against the '${bindingString}' binding...`);
39
39
 
40
- const termType = term.getType();
40
+ const termType = term.getType(),
41
+ typeEqualToTermType = this.type.isEqualTo(termType);
41
42
 
42
- if (this.type !== termType) {
43
- const message = `The '${termString}' term's '${termType}' type is not equal to the '${bindingString}' binding's '${this.type}' type.`,
43
+ if (!typeEqualToTermType) {
44
+ const typeString = this.type.getString(),
45
+ message = `The '${termString}' term's '${termType}' type is not equal to the '${bindingString}' binding's '${typeString}' type.`,
44
46
  exception = Exception.fromMessage(message);
45
47
 
46
48
  throw exception;
@@ -7,7 +7,7 @@ import Exception from "../exception";
7
7
 
8
8
  import { define } from "../elements";
9
9
  import { valueFromNode, valueFromBoolean } from "../utilities/value";
10
- import { BOOLEAN_TYPE, NOMINAL_VALUES_TYPE } from "../types";
10
+ import { LIST_TYPE_NAME, BOOLEAN_TYPE_NAME } from "../typeNames";
11
11
 
12
12
  const { asyncEvery } = asynchronousUtilities;
13
13
 
@@ -39,11 +39,12 @@ export default define(class Every extends Element {
39
39
 
40
40
  value = this.variable.evaluate(context);
41
41
 
42
- const valueType = value.getType();
42
+ const valueType = value.getType(),
43
+ valueTypeListType = valueType.isListType();
43
44
 
44
- if (valueType !== NOMINAL_VALUES_TYPE) {
45
+ if (valueTypeListType) {
45
46
  const valueString = value.getString(),
46
- message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUES_TYPE}'.`,
47
+ message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
47
48
  exception = Exception.fromMessage(message);
48
49
 
49
50
  throw exception;
@@ -61,11 +62,12 @@ export default define(class Every extends Element {
61
62
 
62
63
  value = await this.anonymousProcedure.call(values, context);
63
64
 
64
- const valueType = value.getType();
65
+ const valueType = value.getType(),
66
+ valueTypeBooleanType = valueType.isBooleanType();
65
67
 
66
- if (valueType !== BOOLEAN_TYPE) {
68
+ if (!valueTypeBooleanType) {
67
69
  const termString = term.getString(),
68
- message = `The '${termString}' term's type is '${termType}' when it should be of type '${BOOLEAN_TYPE}'.`,
70
+ message = `The '${termString}' term's type is '${termType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
69
71
  exception = Exception.fromMessage(message);
70
72
 
71
73
  throw exception;
@@ -6,7 +6,7 @@ import { arrayUtilities } from "necessary";
6
6
  import Exception from "../exception";
7
7
 
8
8
  import { define } from "../elements";
9
- import { NOMINAL_VALUE_TYPE } from "../types";
9
+ import { NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
10
10
  import { valueFromNodeAndNominalValue } from "../utilities/value";
11
11
 
12
12
  const { first } = arrayUtilities;
@@ -43,11 +43,12 @@ export default define(class NodeQuery extends Element {
43
43
 
44
44
  value = this.variable.evaluate(context);
45
45
 
46
- const valueType = value.getType();
46
+ const valueType = value.getType(),
47
+ valueTypeNominalValueType = valueType.isNominalValueType();
47
48
 
48
- if (valueType !== NOMINAL_VALUE_TYPE) {
49
+ if (!valueTypeNominalValueType) {
49
50
  const valueString = value.getString(),
50
- message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE}'.`,
51
+ message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE_NAME}'.`,
51
52
  exception = Exception.fromMessage(message);
52
53
 
53
54
  throw exception;
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
5
5
  import Exception from "../exception";
6
6
 
7
7
  import { define } from "../elements";
8
- import { NOMINAL_VALUE_TYPE } from "../types";
8
+ import { NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
9
9
  import { valueFromNodesAndNominalValue } from "../utilities/value";
10
10
 
11
11
  export default define(class NodesQuery extends Element {
@@ -40,11 +40,12 @@ export default define(class NodesQuery extends Element {
40
40
 
41
41
  value = this.variable.evaluate(context);
42
42
 
43
- const valueType = value.getType();
43
+ const valueType = value.getType(),
44
+ valueTypeNominalValueType = valueType.isNominalValueType();
44
45
 
45
- if (valueType !== NOMINAL_VALUE_TYPE) {
46
+ if (!valueTypeNominalValueType) {
46
47
  const valueString = value.getString(),
47
- message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE}'.`,
48
+ message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUE_TYPE_NAME}'.`,
48
49
  exception = Exception.fromMessage(message);
49
50
 
50
51
  throw exception;
@@ -28,10 +28,12 @@ export default define(class Parameter extends Element {
28
28
 
29
29
  context.trace(`Comparing the '${valueString}' value against the '${parameterString}' parameter...`);
30
30
 
31
- const valueType = value.getType();
31
+ const valueType = value.getType(),
32
+ typeEqualToValueType = this.type.isEqualTo(valueType);
32
33
 
33
- if (this.type !== valueType) {
34
- const message = `The '${valueString}' value's '${valueType}' type is not equal to the '${parameterString}' parameter's '${this.type}' type.`,
34
+ if (!typeEqualToValueType) {
35
+ const typeString = ths.type.getString(),
36
+ message = `The '${valueString}' value's '${valueType}' type is not equal to the '${parameterString}' parameter's '${typeString}' type.`,
35
37
  exception = Exception.fromMessage(message);
36
38
 
37
39
  throw exception;
@@ -6,7 +6,7 @@ import { arrayUtilities } from "necessary";
6
6
  import elements from "../elements";
7
7
 
8
8
  import { define } from "../elements";
9
- import { STRING_TYPE, NUMBER_TYPE, BOOLEAN_TYPE, NOMINAL_VALUE_TYPE, NOMINAL_VALUES_TYPE } from "../types";
9
+ import { LIST_TYPE_NAME, STRING_TYPE_NAME, NUMBER_TYPE_NAME, BOOLEAN_TYPE_NAME, NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
10
10
 
11
11
  const { match } = arrayUtilities;
12
12
 
@@ -37,13 +37,33 @@ export default define(class Primitive extends Element {
37
37
  isEqualTo(primitive) {
38
38
  let equalTo = false;
39
39
 
40
- const type = primitive.getType();
40
+ const primitiveType = primitive.getType(),
41
+ typeEqualToPrimitiveType = this.type.isEqualTo(primitiveType);
41
42
 
42
- if (this.type === type) {
43
- const value = primitive.getValue();
43
+ if (typeEqualToPrimitiveType) {
44
+ const value = primitive.getValue(),
45
+ typeName = this.type.getName();
44
46
 
45
- switch (type) {
46
- case STRING_TYPE: {
47
+ switch (typeName) {
48
+ case LIST_TYPE_NAME: {
49
+ const listA = this.value, ///
50
+ listB = value, ///
51
+ matches = match(listA, listB, (valueA, valueB) => {
52
+ const matches = valueA.isEqualTo(valueB);
53
+
54
+ if (matches) {
55
+ return true;
56
+ }
57
+ });
58
+
59
+ if (matches) {
60
+ equalTo = true;
61
+ }
62
+
63
+ break;
64
+ }
65
+
66
+ case STRING_TYPE_NAME: {
47
67
  const stringLiteralA = this.value, ///
48
68
  stringLiteralB = value; ///
49
69
 
@@ -54,7 +74,7 @@ export default define(class Primitive extends Element {
54
74
  break;
55
75
  }
56
76
 
57
- case NUMBER_TYPE: {
77
+ case NUMBER_TYPE_NAME: {
58
78
  const numberA = this.value, ///
59
79
  numberB = value; ///
60
80
 
@@ -65,7 +85,7 @@ export default define(class Primitive extends Element {
65
85
  break;
66
86
  }
67
87
 
68
- case BOOLEAN_TYPE: {
88
+ case BOOLEAN_TYPE_NAME: {
69
89
  const booleanA = this.value, ///
70
90
  booleanB = value; ///
71
91
 
@@ -76,7 +96,7 @@ export default define(class Primitive extends Element {
76
96
  break;
77
97
  }
78
98
 
79
- case NOMINAL_VALUE_TYPE: {
99
+ case NOMINAL_VALUE_TYPE_NAME: {
80
100
  const nominalValueA = this.value, ///
81
101
  nomimalValueB = value, ///
82
102
  matches = nominalValueA.match(nomimalValueB);
@@ -87,30 +107,40 @@ export default define(class Primitive extends Element {
87
107
 
88
108
  break;
89
109
  }
110
+ }
111
+ }
90
112
 
91
- case NOMINAL_VALUES_TYPE: {
92
- const nominalValuesA = this.value, ///
93
- nominalValuesB = value, ///
94
- matches = match(nominalValuesA, nominalValuesB, (nominalValueA, nomimalValueB) => {
95
- const matches = nominalValueA.match(nomimalValueB);
113
+ return equalTo;
114
+ }
96
115
 
97
- if (matches) {
98
- return true;
99
- }
100
- });
116
+ static name = "Primitive";
101
117
 
102
- if (matches) {
103
- equalTo = true;
104
- }
118
+ static fromPrimitiveValueAndType(primitiveValue, type, context) {
119
+ const value = primitiveValue, ///
120
+ typeName = type.getName();
105
121
 
106
- break;
107
- }
122
+ let string;
108
123
 
124
+ switch (typeName) {
125
+ case NOMINAL_VALUE_TYPE_NAME: {
126
+ const nominalValue = value; ///
127
+
128
+ string = nominalValue.getString();
129
+
130
+ break;
131
+ }
132
+
133
+ default: {
134
+ string = `${value}`;
135
+
136
+ break;
109
137
  }
110
138
  }
111
139
 
112
- return equalTo;
113
- }
140
+ const node = null,
141
+ breakPoint = null,
142
+ primitive = new Primitive(context, string, node, breakPoint, type, value);
114
143
 
115
- static name = "Primitive";
144
+ return primitive;
145
+ }
116
146
  });
@@ -37,11 +37,13 @@ export default define(class AnonymousProcedure extends Element {
37
37
 
38
38
  const variables = variablesFromValuesAndParameters(values, this.parameters, context),
39
39
  value = await this.returnBlock.evaluate(variables, context),
40
- valueType = value.getType();
40
+ valueType = value.getType(),
41
+ typeEqualToValueType = this.type.isEqualTo(valueType);
41
42
 
42
- if (this.type !== valueType) {
43
+ if (!typeEqualToValueType) {
43
44
  const valueString = value.getString(),
44
- message = `The '${valueString}' value's '${valueType}' type is not equal to the '${anonymousProcedureString}' anonymous procedure's '${this.type}' type.`,
45
+ typeString = this.type.getString(),
46
+ message = `The '${valueString}' value's '${valueType}' type is not equal to the '${anonymousProcedureString}' anonymous procedure's '${typeString}' type.`,
45
47
  exception = Exception.fromMessage(message);
46
48
 
47
49
  throw exception;
@@ -5,7 +5,6 @@ import { Element } from "occam-languages";
5
5
  import Exception from "../exception";
6
6
 
7
7
  import { define } from "../elements";
8
- import { BOOLEAN_TYPE } from "../types";
9
8
  import { valuesFromNominalValues } from "../utilities/values";
10
9
  import { variablesFromValuesAndParameters } from "../utilities/parameters";
11
10
 
@@ -35,15 +34,10 @@ export default define(class Procedure extends Element {
35
34
  return this.returnBlock;
36
35
  }
37
36
 
38
- isBoolean() {
39
- const typeBooleanType = (this.type === BOOLEAN_TYPE),
40
- boolean = typeBooleanType; ///
41
-
42
- return boolean;
43
- }
44
-
45
37
  getName() { return this.label.getName(); }
46
38
 
39
+ isBooleanType() { return this.type.isBooleanType(); }
40
+
47
41
  getReturnStatement() { return this.returnBlock.getReturnStatement(); }
48
42
 
49
43
  compareProcedureName(procedureName) { return this.label.compareProcedureName(procedureName); }
@@ -59,11 +53,13 @@ export default define(class Procedure extends Element {
59
53
 
60
54
  const variables = variablesFromValuesAndParameters(values, this.parameters, context),
61
55
  value = await this.returnBlock.evaluate(variables, context),
62
- valueType = value.getType();
56
+ valueType = value.getType(),
57
+ typeEqualToValueType = this.type.isEqualTo(valueType);
63
58
 
64
- if (this.type !== valueType) {
59
+ if (!typeEqualToValueType) {
65
60
  const valueString = value.getString(),
66
- message = `The '${valueString}' value's '${valueType}' type is not equal to the '${procedureString}' procedure's '${this.type}' type.`,
61
+ typeString = this.type.getString(),
62
+ message = `The '${valueString}' value's '${typeString}' type is not equal to the '${procedureString}' procedure's '${typeString}' type.`,
67
63
  exception = Exception.fromMessage(message);
68
64
 
69
65
  throw exception;
@@ -83,7 +79,7 @@ export default define(class Procedure extends Element {
83
79
 
84
80
  context.trace(`Calling the '${procedureString}' procedure nominally...`);
85
81
 
86
- const values = valuesFromNominalValues(nominalValues),
82
+ const values = valuesFromNominalValues(nominalValues, context),
87
83
  term = await this.call(values, context);
88
84
 
89
85
  context.debug(`...called the '${procedureString}' procedure nominally.`);
@@ -6,8 +6,8 @@ import elements from "../elements";
6
6
  import Exception from "../exception";
7
7
 
8
8
  import { define } from "../elements";
9
- import { NOMINAL_VALUES_TYPE } from "../types";
10
9
  import { valueFromNominalValue } from "../utilities/value";
10
+ import { LIST_TYPE_NAME } from "../typeNames";
11
11
 
12
12
  const { asyncReduce } = asynchronousUtilities;
13
13
 
@@ -43,11 +43,12 @@ export default define(class Reduce extends Element {
43
43
 
44
44
  value = this.variable.evaluate(context);
45
45
 
46
- const valueType = value.getType();
46
+ const valueType = value.getType(),
47
+ valueTypeListType = valueType.isListType();
47
48
 
48
- if (valueType !== NOMINAL_VALUES_TYPE) {
49
+ if (!valueTypeListType) {
49
50
  const valueString = value.getString(),
50
- message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUES_TYPE}'.`,
51
+ message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
51
52
  exception = Exception.fromMessage(message);
52
53
 
53
54
  throw exception;
@@ -66,7 +67,7 @@ export default define(class Reduce extends Element {
66
67
 
67
68
  const values = Values.fromValue(value, context);
68
69
 
69
- value = valueFromNominalValue(nominalValue, context);
70
+ value = valueFromNominalValue(nominalValue);
70
71
 
71
72
  values.addValue(value);
72
73
 
@@ -6,7 +6,7 @@ import elements from "../elements";
6
6
  import Exception from "../exception";
7
7
 
8
8
  import { define } from "../elements";
9
- import { BOOLEAN_TYPE, NOMINAL_VALUES_TYPE } from "../types";
9
+ import { LIST_TYPE_NAME, BOOLEAN_TYPE_NAME } from "../typeNames";
10
10
  import { valueFromBoolean, valueFromNominalValue } from "../utilities/value";
11
11
 
12
12
  const { asyncSome } = asynchronousUtilities;
@@ -38,11 +38,12 @@ export default define(class Some extends Element {
38
38
 
39
39
  value = this.variable.evaluate(context);
40
40
 
41
- const valueType = value.getType();
41
+ const valueType = value.getType(),
42
+ valueTypeListType = valueType.isListType();
42
43
 
43
- if (valueType !== NOMINAL_VALUES_TYPE) {
44
+ if (!valueTypeListType) {
44
45
  const valueString = value.getString(),
45
- message = `The '${valueString}' value's '${valueType}' type should be '${NOMINAL_VALUES_TYPE}'.`,
46
+ message = `The '${valueString}' value's '${valueType}' type should be '${LIST_TYPE_NAME}'.`,
46
47
  exception = Exception.fromMessage(message);
47
48
 
48
49
  throw exception;
@@ -60,11 +61,12 @@ export default define(class Some extends Element {
60
61
 
61
62
  value = await this.anonymousProcedure.call(values, context);
62
63
 
63
- const valueType = value.getType();
64
+ const valueType = value.getType(),
65
+ valueTypeBooleanType = valueType.isBooleanType();
64
66
 
65
- if (valueType !== BOOLEAN_TYPE) {
67
+ if (!valueTypeBooleanType) {
66
68
  const valueString = value.getString(),
67
- message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE}'.`,
69
+ message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
68
70
  exception = Exception.fromMessage(message);
69
71
 
70
72
  throw exception;
@@ -38,12 +38,15 @@ export default define(class ComparisonTerm extends Element {
38
38
  const leftValue = this.leftTerm.evaluate(context),
39
39
  rightValue = this.rightTerm.evaluate(context),
40
40
  leftValueType = leftValue.getType(),
41
- rightValueType = rightValue.getType();
41
+ rightValueType = rightValue.getType(),
42
+ leftValueTypeEqualToRightValueType = leftValueType.isEqualTo(rightValueType);
42
43
 
43
- if (leftValueType !== rightValueType) {
44
+ if (!leftValueTypeEqualToRightValueType) {
44
45
  const leftValueString = leftValue.getString(),
45
46
  rightValueString = rightValue.getString(),
46
- message = `The '${leftValueString}' left term's type is '${leftValueType}' whereas the '${rightValueString}' right term's type is '${rightTermType}'.`,
47
+ leftValueTypeString = leftValueType.getString(),
48
+ rightValueTypeString = rightValueType.getString(),
49
+ message = `The '${leftValueString}' left term's type is '${leftValueTypeString}' whereas the '${rightValueString}' right term's type is '${rightValueTypeString}'.`,
47
50
  exception = Exception.fromMessage(message);
48
51
 
49
52
  throw exception;
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
5
5
  import Exception from "../../exception";
6
6
 
7
7
  import { define } from "../../elements";
8
- import { BOOLEAN_TYPE } from "../../types";
8
+ import { BOOLEAN_TYPE_NAME } from "../../typeNames";
9
9
  import { valueFromBoolean } from "../../utilities/value";
10
10
 
11
11
  export default define(class LogicalTerm extends Element {
@@ -44,19 +44,21 @@ export default define(class LogicalTerm extends Element {
44
44
  const leftValue = this.leftTerm.evaluate(context),
45
45
  rightValue = this.rightTerm.evaluate(context),
46
46
  leftValueType = leftValue.getType(),
47
- rightValueType = rightValue.getType();
47
+ rightValueType = rightValue.getType(),
48
+ leftValueTypeBooleanType = leftValueType.isBooleanType(),
49
+ rightValueTypeBooleanType = rightValueType.isBooleanType();
48
50
 
49
- if (leftValueType !== BOOLEAN_TYPE) {
51
+ if (!leftValueTypeBooleanType) {
50
52
  const leftValueString = leftValue.getString(),
51
- message = `The '${leftValueString}' left term's type is '${leftValueType}' when it should be of type '${BOOLEAN_TYPE}'.`,
53
+ message = `The '${leftValueString}' left term's type is '${leftValueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
52
54
  exception = Exception.fromMessage(message);
53
55
 
54
56
  throw exception;
55
57
  }
56
58
 
57
- if (rightValueType !== BOOLEAN_TYPE) {
59
+ if (!rightValueTypeBooleanType) {
58
60
  const rightValueString = rightValue.getString(),
59
- message = `The '${rightValueString}' right term's type is '${rightValueType}' when it should be of type '${BOOLEAN_TYPE}'.`,
61
+ message = `The '${rightValueString}' right term's type is '${rightValueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
60
62
  exception = Exception.fromMessage(message);
61
63
 
62
64
  throw exception;
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
5
5
  import Exception from "../../exception";
6
6
 
7
7
  import { define } from "../../elements";
8
- import { BOOLEAN_TYPE } from "../../types";
8
+ import { BOOLEAN_TYPE_NAME } from "../../typeNames";
9
9
  import { valueFromBoolean } from "../../utilities/value";
10
10
 
11
11
  export default define(class NegatedTerm extends Element {
@@ -33,11 +33,12 @@ export default define(class NegatedTerm extends Element {
33
33
 
34
34
  value = this.term.evaluate(context);
35
35
 
36
- const valueType = value.getType();
36
+ const valueType = value.getType(),
37
+ valueTypeBooleanType = valueType.isBooleanType();
37
38
 
38
- if (valueType !== BOOLEAN_TYPE) {
39
+ if (!valueTypeBooleanType) {
39
40
  const valueString = value.getString(),
40
- message = `The '${valueString}' left value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE}'.`,
41
+ message = `The '${valueString}' left value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
41
42
  exception = Exception.fromMessage(message);
42
43
 
43
44
  throw exception;
@@ -3,7 +3,7 @@
3
3
  import { Element } from "occam-languages";
4
4
 
5
5
  import { define } from "../elements";
6
- import { BOOLEAN_TYPE } from "../types";
6
+ import { BOOLEAN_TYPE_NAME } from "../typeNames";
7
7
 
8
8
  export default define(class Term extends Element {
9
9
  constructor(context, string, node, breakPoint, variable, primitive, negatedTerm, logicalTerm, bracketedTerm, comparisonTerm) {
@@ -71,7 +71,8 @@ export default define(class Term extends Element {
71
71
 
72
72
  isBoolean() {
73
73
  const type = this.getType(),
74
- boolean = (type === BOOLEAN_TYPE);
74
+ booleanType = type.isBooleanType(),
75
+ boolean = booleanType; ///
75
76
 
76
77
  return boolean;
77
78
  }
@@ -5,7 +5,7 @@ import { Element } from "occam-languages";
5
5
  import Exception from "../exception";
6
6
 
7
7
  import { define } from "../elements";
8
- import { BOOLEAN_TYPE } from "../types";
8
+ import { BOOLEAN_TYPE_NAME } from "../typeNames";
9
9
 
10
10
  export default define(class Ternary extends Element {
11
11
  constructor(context, string, node, breakPoint, term, ifExpression, elseExpression) {
@@ -37,11 +37,12 @@ export default define(class Ternary extends Element {
37
37
 
38
38
  value = this.term.evaluate(context);
39
39
 
40
- const valueType = value.getType();
40
+ const valueType = value.getType(),
41
+ valueTypeBooleanType = valueType.isBooleanType();
41
42
 
42
- if (valueType !== BOOLEAN_TYPE) {
43
+ if (!valueTypeBooleanType) {
43
44
  const valueString = value.getString(),
44
- message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE}'.`,
45
+ message = `The '${valueString}' value's type is '${valueType}' when it should be of type '${BOOLEAN_TYPE_NAME}'.`,
45
46
  exception = Exception.fromMessage(message);
46
47
 
47
48
  throw exception;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ import { Element } from "occam-languages";
4
+
5
+ import { define } from "../elements";
6
+
7
+ import { typeStringFromTypeNameAndArgumentTypeName } from "../utilities/string";
8
+ import { LIST_TYPE_NAME, STRING_TYPE_NAME, NUMBER_TYPE_NAME, BOOLEAN_TYPE_NAME, NOMINAL_VALUE_TYPE_NAME } from "../typeNames";
9
+
10
+ export default define(class Type extends Element {
11
+ constructor(context, string, node, breakPoint, name, argumentType) {
12
+ super(context, string, node, breakPoint);
13
+
14
+ this.name = name;
15
+ this.argumentType = argumentType;
16
+ }
17
+
18
+ getName() {
19
+ return this.name;
20
+ }
21
+
22
+ getArgumentType() {
23
+ return this.argumentType;
24
+ }
25
+
26
+ isListType() {
27
+ const listType = (this.name === LIST_TYPE_NAME);
28
+
29
+ return listType;
30
+ }
31
+
32
+ isStringType() {
33
+ const booleanType = (this.name === STRING_TYPE_NAME);
34
+
35
+ return booleanType;
36
+ }
37
+
38
+ isNumberType() {
39
+ const numberType = (this.name === NUMBER_TYPE_NAME);
40
+
41
+ return numberType;
42
+ }
43
+
44
+ isBooleanType() {
45
+ const booleanType = (this.name === BOOLEAN_TYPE_NAME);
46
+
47
+ return booleanType;
48
+ }
49
+
50
+ isNominalValueType() {
51
+ const listType = (this.name === NOMINAL_VALUE_TYPE_NAME);
52
+
53
+ return listType;
54
+ }
55
+
56
+ isEqualTo(type) {
57
+ let equalTo = false;
58
+
59
+ const typeName = type.getName();
60
+
61
+ if (this.name === typeName) {
62
+ switch (this.name) {
63
+ case LIST_TYPE_NAME: {
64
+ const typeArgumentType = type.getArgumentType();
65
+
66
+ if ((this.argumentType === null) || (typeArgumentType === null)) {
67
+ if (this.argumentType === typeArgumentType) {
68
+ equalTo = true;
69
+ }
70
+ } else {
71
+ const arguemntTypeEqualToTypeArgumentType = this.argumentType.isEqualTo(typeArgumentType);
72
+
73
+ if (arguemntTypeEqualToTypeArgumentType) {
74
+ equalTo = true;
75
+ }
76
+ }
77
+
78
+ break;
79
+ }
80
+
81
+ default: {
82
+ equalTo = true;
83
+
84
+ break;
85
+ }
86
+ }
87
+ }
88
+
89
+ return equalTo;
90
+ }
91
+
92
+ static name = "Type";
93
+
94
+ static fromTypeName(typeName, context) {
95
+ let type = null;
96
+
97
+ if (typeName !== null) {
98
+ const node = null, ///
99
+ name = typeName, ///
100
+ argumentType = null,
101
+ typeString = typeName, ///
102
+ string = typeString, ///
103
+ breakPoint = null;
104
+
105
+ context = null;
106
+
107
+ type = new Type(context, string, node, breakPoint, name, argumentType);
108
+ }
109
+
110
+ return type;
111
+ }
112
+
113
+ static fromTypeNameAndArgumentTypeName(typeName, argumentTypeName, context) {
114
+ const node = null, ///
115
+ name = typeName, ///
116
+ argumentType = Type.fromTypeName(argumentTypeName, context),
117
+ typeString = typeStringFromTypeNameAndArgumentTypeName(typeName, argumentTypeName),
118
+ string = typeString, ///
119
+ breakPoint = null;
120
+
121
+ context = null;
122
+
123
+ const type = new Type(context, string, node, breakPoint, name, argumentType);
124
+
125
+ return type;
126
+ }
127
+
128
+ });