@prefix ex: <https://example.com/type-system/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix ts: <https://ontology.inferal.com/modules/type-system/> .

ex:Customer
    a ts:RecordType ;
    skos:prefLabel "Customer" ;
    ts:hasField ex:customer-id-field ;
    ts:hasField ex:customer-email-field ;
    ts:hasField ex:customer-labels-field .

ex:customer-id-key
    a ts:FieldKey ;
    ts:keyText "id" .

ex:customer-email-key
    a ts:FieldKey ;
    ts:keyText "email" .

ex:customer-id-field
    a ts:Field ;
    ts:fieldKey ex:customer-id-key ;
    ts:fieldType ts:string ;
    ts:minCount 1 ;
    ts:maxCount 1 ;
    ts:ordinal 0 .

ex:customer-email-field
    a ts:Field ;
    ts:fieldKey ex:customer-email-key ;
    ts:fieldType ts:string ;
    ts:minCount 0 ;
    ts:maxCount 1 ;
    ts:ordinal 1 .

ex:customer-labels-field
    a ts:Field ;
    ts:fieldKey ex:customer-labels-key ;
    ts:fieldType ex:StringArray ;
    ts:minCount 0 ;
    ts:maxCount 1 ;
    ts:ordinal 2 .

ex:customer-labels-key
    a ts:FieldKey ;
    ts:keyText "labels" ;
    ts:fieldKeyKind ts:identifierFieldKey .

ex:StringArray
    a ts:ArrayType ;
    skos:prefLabel "StringArray" ;
    ts:arrayValueType ts:string .

ex:Animal
    a ts:Union ;
    skos:prefLabel "Animal" ;
    ts:hasDiscriminator ex:animal-kind-discriminator ;
    ts:hasUnionAlternative ex:cat-alternative ;
    ts:hasUnionAlternative ex:dog-alternative .

ex:animal-kind-discriminator
    a ts:Discriminator ;
    ts:discriminatorField ex:animal-kind-field ;
    ts:discriminatorEnvelope ts:envelopeObject .

ex:animal-kind-field
    a ts:Field ;
    ts:fieldKey ex:animal-kind-key ;
    ts:fieldType ts:string ;
    ts:minCount 1 ;
    ts:maxCount 1 .

ex:animal-kind-key
    a ts:FieldKey ;
    ts:keyText "kind" ;
    ts:fieldKeyKind ts:identifierFieldKey .

ex:Cat
    a ts:RecordType ;
    skos:prefLabel "Cat" .

ex:Dog
    a ts:RecordType ;
    skos:prefLabel "Dog" .

ex:cat-alternative
    a ts:UnionAlternative ;
    ts:alternativeType ex:Cat ;
    ts:discriminatorValue ex:cat-kind-value ;
    ts:ordinal 0 .

ex:dog-alternative
    a ts:UnionAlternative ;
    ts:alternativeType ex:Dog ;
    ts:discriminatorValue ex:dog-kind-value ;
    ts:ordinal 1 .

ex:cat-kind-value
    a ts:StringValue ;
    ts:declaredType ts:string ;
    ts:stringValue "cat" .

ex:dog-kind-value
    a ts:StringValue ;
    ts:declaredType ts:string ;
    ts:stringValue "dog" .

ex:List
    a ts:RecordMapType ;
    skos:prefLabel "List" ;
    ts:recordKeyType ts:string ;
    ts:recordValueType ex:Customer .

ex:get-customer
    a ts:CallableType ;
    skos:prefLabel "getCustomer" ;
    ts:hasParameterSlot ex:get-customer-id ;
    ts:hasResultSlot ex:get-customer-result .

ex:get-customer-id
    a ts:ParameterSlot ;
    skos:prefLabel "id" ;
    ts:parameterType ts:string ;
    ts:minCount 1 ;
    ts:maxCount 1 .

ex:get-customer-result
    a ts:ResultSlot ;
    ts:resultType ex:Customer ;
    ts:minCount 1 ;
    ts:maxCount 1 .

ex:Id
    a ts:StringType ;
    skos:prefLabel "Id" ;
    ts:baseScalar ts:string ;
    ts:standardBaseScalar ts:string ;
    ts:hasInitializer ex:id-from-string ;
    ts:subtypeOf ts:string .

ex:id-from-string
    a ts:ScalarConstructorInitializer ;
    skos:prefLabel "fromString" ;
    ts:initializerParameter ex:id-from-string-value ;
    ts:initializerResult ex:Id ;
    ts:initializerSemanticKind ts:scalarValueConversionInitializer .

ex:id-from-string-value
    a ts:ParameterSlot ;
    skos:prefLabel "value" ;
    ts:parameterType ts:string ;
    ts:minCount 1 ;
    ts:maxCount 1 .

ex:CustomerListTemplate
    a ts:RecordMapType ;
    skos:prefLabel "CustomerList" ;
    ts:hasTypeParameter ex:CustomerListValue ;
    ts:recordKeyType ts:string ;
    ts:recordValueType ex:CustomerListValue .

ex:CustomerListValue
    a ts:TypeParameter ;
    skos:prefLabel "Value" ;
    ts:typeParameterConstraint ts:unknown .

ex:ConcreteCustomerList
    a ts:TemplateInstantiation ;
    ts:instantiates ex:CustomerListTemplate ;
    ts:templateArgument ex:customer-list-value-argument ;
    ts:resultingType ex:CustomerList .

ex:customer-list-value-argument
    a ts:TypeArgument ;
    ts:argumentParameter ex:CustomerListValue ;
    ts:argumentType ex:Customer ;
    ts:ordinal 0 ;
    ts:argumentEvaluationOrdinal 0 .

ex:CustomerList
    a ts:RecordMapType ;
    skos:prefLabel "CustomerList" ;
    ts:recordKeyType ts:string ;
    ts:recordValueType ex:Customer .

ex:customer-id-literal
    a ts:StringLiteralType ;
    ts:literalKind ts:stringLiteral ;
    ts:literalBaseType ts:string ;
    ts:literalValue "cus_123" ;
    ts:stringValue "cus_123" .

ex:customer-subtype-relation
    a ts:SubtypeRelation ;
    ts:relationSourceType ex:Customer ;
    ts:relationTargetType ts:unknown ;
    ts:hasEvidence ex:customer-subtype-evidence .

ex:customer-subtype-evidence
    a ts:TypeRelationEvidence ;
    ts:evidenceRelation ex:customer-subtype-relation ;
    ts:evidenceSourceType ex:Customer ;
    ts:evidenceTargetType ts:unknown ;
    ts:evidenceRule "unknown target type" .
