From 3cc324d1da2f0cbdee8a15d87041291f8ec780a5 Mon Sep 17 00:00:00 2001 From: Paul Loyd Date: Wed, 29 Nov 2017 10:08:20 +0300 Subject: [PATCH] Add support for $Values --- src/globals.js | 26 +++++++++++++++++++++++++- tests/samples/values.js | 8 ++++++++ tests/samples/values.json | 20 ++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/samples/values.js create mode 100644 tests/samples/values.json diff --git a/src/globals.js b/src/globals.js index eb04518..06b0ec7 100644 --- a/src/globals.js +++ b/src/globals.js @@ -117,6 +117,30 @@ function keys(params: (?Type)[], resolve: TypeId => Type): ?Type { .map(name => ({kind: 'literal', value: name})) .toArray(); + // TODO: empty records. + + return { + kind: 'union', + variants, + }; +} + +function values(params: (?Type)[], resolve: TypeId => Type): ?Type { + invariant(params.length === 1); + + const [ref] = params; + + invariant(ref && ref.kind === 'reference'); + + const record = resolve(ref.to); + + invariant(record.kind === 'record'); + + const variants = wu(record.fields).pluck('value').toArray(); + + // TODO: empty records. + // TODO: dedup values. + return { kind: 'union', variants, @@ -135,7 +159,7 @@ export default { $ReadOnly: unwrap, $Exact: unwrap, // TODO: another semantic for exact types? $Keys: keys, - // TODO: $Values + $Values: values, // TODO: $Diff // TODO: $All // TODO: $Either diff --git a/tests/samples/values.js b/tests/samples/values.js new file mode 100644 index 0000000..05831c2 --- /dev/null +++ b/tests/samples/values.js @@ -0,0 +1,8 @@ +type X = { + a: string, + b: boolean, +}; + +type Y = $Values; + +export {Y}; diff --git a/tests/samples/values.json b/tests/samples/values.json new file mode 100644 index 0000000..37f2bfe --- /dev/null +++ b/tests/samples/values.json @@ -0,0 +1,20 @@ +{ + "types": [ + { + "id": ["values", "X"], + "kind": "record", + "fields": [ + {"name": "a", "value": {"kind": "string"}, "required": true}, + {"name": "b", "value": {"kind": "boolean"}, "required": true} + ] + }, + { + "id": ["values", "Y"], + "kind": "union", + "variants": [ + {"kind": "string"}, + {"kind": "boolean"} + ] + } + ] +}