TypeScript experiment
This commit is contained in:
parent
3f92e7c3e1
commit
a8c7297621
|
@ -0,0 +1,33 @@
|
|||
open ForTS_Types
|
||||
|
||||
@module("ForTS_InternalValue_tag") @scope("InternalValueTag")
|
||||
external ivtVoid_: int = "IvtVoid"
|
||||
@module("ForTS_InternalValue_tag") @scope("InternalValueTag")
|
||||
external ivtString_: int = "IvtString"
|
||||
@module("ForTS_InternalValue_tag") @scope("InternalValueTag")
|
||||
external ivtRecordLike_: int = "IvtRecordLike"
|
||||
|
||||
let getTag = (variant: internalValue) =>
|
||||
switch variant {
|
||||
| IvVoid(_) => ivtVoid_
|
||||
| IvString(_) => ivtString_
|
||||
| IvRecordLike(_) => ivtRecordLike_
|
||||
}
|
||||
|
||||
let getVoid = (variant: internalValue): option<internalVoid> =>
|
||||
switch variant {
|
||||
| IvVoid(v) => Some(v)
|
||||
| _ => None
|
||||
}
|
||||
|
||||
let getString = (variant: internalValue): option<string> =>
|
||||
switch variant {
|
||||
| IvString(s) => Some(s)
|
||||
| _ => None
|
||||
}
|
||||
|
||||
let getRecordLike = (variant: internalValue): option<recordLike> =>
|
||||
switch variant {
|
||||
| IvRecordLike(r) => Some(r)
|
||||
| _ => None
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
open ForTS_Types
|
||||
|
||||
@genType
|
||||
let toString = (v: recordLike): string =>
|
||||
MyInterface_InternalValue_RecordLike.toString(v, MyInterface_InternalValue.toString)
|
||||
@genType
|
||||
let toArray = (v: recordLike): array<(string, internalValue)> =>
|
||||
MyInterface_InternalValue_RecordLike.toArray(v)
|
|
@ -0,0 +1 @@
|
|||
@genType let toString = (value: string): string => value
|
|
@ -0,0 +1,3 @@
|
|||
open ForTS_Types
|
||||
|
||||
@genType let toString = (_value: internalVoid): string => MyInterface_InternalValue_Void.toString
|
|
@ -0,0 +1,7 @@
|
|||
enum InternalValueTag {
|
||||
IvtVoid,
|
||||
IvtString,
|
||||
IvtRecordLike
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
open ForTS_Types
|
||||
|
||||
@genType
|
||||
let getResult = (_p: myProject): option<result_internalValue> => My_ErrorValue.EError->Error->Some
|
|
@ -0,0 +1,18 @@
|
|||
open ForTS_Types
|
||||
|
||||
@genType let isError = (r: result_internalValue): bool => Belt.Result.isError(r)
|
||||
@genType let isOk = (r: result_internalValue): bool => Belt.Result.isOk(r)
|
||||
|
||||
@genType
|
||||
let getError = (r: result_internalValue): option<errorValue> =>
|
||||
switch r {
|
||||
| Ok(_) => None
|
||||
| Error(e) => Some(e)
|
||||
}
|
||||
|
||||
@genType
|
||||
let getValue = (r: result_internalValue): option<internalValue> =>
|
||||
switch r {
|
||||
| Ok(v) => Some(v)
|
||||
| Error(_) => None
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
Group all opaque types together for TS.
|
||||
All other modules for TS should use this module
|
||||
*/
|
||||
@genType.opaque type internalValue = MyInterface_InternalValue_T.t
|
||||
@genType.opaque type recordLike = MyInterface_InternalValue_RecordLike.t
|
||||
@genType.opaque type internalVoid = int
|
||||
@genType.opaque type errorValue = My_ErrorValue.t
|
||||
@genType.opaque type result_internalValue = result<internalValue, errorValue> // There has to be a type for each result permutation
|
||||
@genType.opaque type myProject = {name: string}
|
||||
|
||||
//There is no need to map option<> as it becomes nullable
|
|
@ -0,0 +1,10 @@
|
|||
type errorValue = EError | EErrorString(string) | EErrorNumber(float)
|
||||
type t = errorValue
|
||||
|
||||
let toString = (e: errorValue): string => {
|
||||
switch e {
|
||||
| EError => "Error"
|
||||
| EErrorString(s) => s
|
||||
| EErrorNumber(f) => Js.Float.toString(f)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
open MyInterface_InternalValue_T
|
||||
|
||||
let rec toString = (v: internalValue): string => {
|
||||
switch v {
|
||||
| IvString(s) => MyInterface_InternalValue_String.toString(s)
|
||||
| IvRecordLike(m) => MyInterface_InternalValue_RecordLike.toString(m, toString)
|
||||
| IvVoid(_v) => MyInterface_InternalValue_Void.toString
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
type t = MyInterface_InternalValue_T.recordLike
|
||||
let toString = (value: t, recToString) => {
|
||||
let contents =
|
||||
Belt.Map.String.mapWithKey(value, (key, value) => {
|
||||
`${key}: ${recToString(value)}`
|
||||
})
|
||||
->Belt.Map.String.toArray
|
||||
->Js.Array2.joinWith(", ")
|
||||
`{${contents}}`
|
||||
}
|
||||
|
||||
let toArray = (value: t) => Belt.Map.String.toArray(value)
|
|
@ -0,0 +1 @@
|
|||
let toString = v => v
|
|
@ -0,0 +1 @@
|
|||
let toString = "Void"
|
|
@ -0,0 +1,7 @@
|
|||
type rec internalValue =
|
||||
| IvString(string)
|
||||
| IvRecordLike(recordLike)
|
||||
| IvVoid(int)
|
||||
and recordLike = Belt.Map.String.t<internalValue>
|
||||
|
||||
type t = internalValue
|
|
@ -0,0 +1 @@
|
|||
To be trashed. Experimental code
|
Loading…
Reference in New Issue
Block a user