{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
module Product where
-- base
import Data.Typeable
import GHC.Generics
-- time
import Data.Time
-- aeson
import Data.Aeson (FromJSON, ToJSON)
-- hspec
import Test.Hspec (SpecWith)
-- QuickCheck
import Test.QuickCheck
-- quickcheck-arbitrary-adt
import Test.QuickCheck.Arbitrary.ADT
-- ocaml-export
import OCaml.Export hiding (mkGoldenFiles)
import Util
type ProductPackage
= OCamlPackage "product" NoDependency
:> (OCamlModule '["SimpleChoice"] :> SimpleChoice
:<|> OCamlModule '["Person"] :> Person
:<|> OCamlModule '["Company"] :> Company
:<|> OCamlModule '["Card"] :> Suit :> Card
:<|> OCamlModule '["CustomOption"] :> Company2
:<|> OCamlModule '["OneTypeParameter"] :> OneTypeParameter TypeParameterRef0
:<|> OCamlModule '["TwoTypeParameters"] :> TwoTypeParameters TypeParameterRef0 TypeParameterRef1
:<|> OCamlModule '["ThreeTypeParameters"] :> Three TypeParameterRef0 TypeParameterRef1 TypeParameterRef2
:<|> OCamlModule '["SubTypeParameter"] :> SubTypeParameter TypeParameterRef0 TypeParameterRef1 TypeParameterRef2
:<|> OCamlModule '["UnnamedProduct"] :> UnnamedProduct
:<|> OCamlModule '["ComplexProduct"] :> OCamlTypeInFile Simple "test/ocaml/Simple" :> ComplexProduct
:<|> OCamlModule '["Wrapper"]
:> Wrapper TypeParameterRef0
:> IntWrapped
:> MaybeWrapped
:> EitherWrapped
:> ComplexWrapped
:> SumWrapped
:> TupleWrapped
:> HalfWrapped TypeParameterRef0
:> PartiallyWrapped TypeParameterRef0 TypeParameterRef1 TypeParameterRef2
:> ScrambledTypeParameterRefs TypeParameterRef0 TypeParameterRef1 TypeParameterRef2 TypeParameterRef3 TypeParameterRef4 TypeParameterRef5
:> WrappedWrapper
:> WrapThree TypeParameterRef0 TypeParameterRef1 TypeParameterRef2
:> WrapThreeUnfilled TypeParameterRef0 TypeParameterRef1 TypeParameterRef2
:> WrapThreeFilled
:> WrapThreePartiallyFilled TypeParameterRef0
-- :> TypeSynonymKey TypeParameterRef0
-- :> NewTypeKey TypeParameterRef0
:<|> OCamlModule '["Box"] :> InnerBox TypeParameterRef0 :> OuterBox :> AuditAction :> AuditModel TypeParameterRef0 :> User :> UserAudit
:<|> OCamlModule '["Key"] :> SqlKey :> UserId
)
compareInterfaceFiles :: FilePath -> SpecWith ()
compareInterfaceFiles = compareFiles "test/interface" "product" True
data SimpleChoice =
SimpleChoice
{ choice :: Either String Int
} deriving (Show, Eq, Generic, OCamlType, FromJSON, ToJSON)
instance Arbitrary SimpleChoice where
arbitrary = SimpleChoice <$> arbitrary
instance ToADTArbitrary SimpleChoice
data Person = Person
{ id :: Int
, name :: Maybe String
, created :: UTCTime
} deriving (Show, Eq, Generic, OCamlType, FromJSON, ToJSON)
instance Arbitrary Person where
arbitrary = Person <$> arbitrary <*> arbitrary <*> arbitrary
instance ToADTArbitrary Person
data Company = Company
{ address :: String
, employees :: [Person]
} deriving (Show, Eq, Generic, OCamlType, FromJSON, ToJSON)
instance Arbitrary Company where
arbitrary = do
k <- choose (1,3)
v <- vector k
Company <$> arbitrary <*> pure v
instance ToADTArbitrary Company
data Company2 = Company2
{ address2 :: String
, boss :: Maybe Person
} deriving (Show, Eq, Generic, OCamlType, FromJSON, ToJSON)
instance Arbitrary Company2 where
arbitrary = Company2 <$> arbitrary <*> arbitrary
instance ToADTArbitrary Company2
data Suit
= Clubs
| Diamonds
| Hearts
| Spades
deriving (Eq,Show,Generic,OCamlType,FromJSON,ToJSON)
instance Arbitrary Suit where
arbitrary = elements [Clubs, Diamonds, Hearts, Spades]
instance ToADTArbitrary Suit
data Card =
Card
{ cardSuit :: Suit
, cardValue :: Int
} deriving (Eq,Show,Generic,OCamlType,FromJSON,ToJSON)
instance Arbitrary Card where
arbitrary = Card <$> arbitrary <*> arbitrary
instance ToADTArbitrary Card
data OneTypeParameter a =
OneTypeParameter
{ otpId :: Int
, otpFirst :: a
} deriving (Eq,Show,Generic,FromJSON,ToJSON)
instance Arbitrary (OneTypeParameter TypeParameterRef0) where
arbitrary = OneTypeParameter <$> arbitrary <*> arbitrary
instance ToADTArbitrary (OneTypeParameter TypeParameterRef0)
instance (Typeable a, OCamlType a) => (OCamlType (OneTypeParameter a))
data TwoTypeParameters a b =
TwoTypeParameters
{ ttpId :: Int
, ttpFirst :: a
, ttpSecond :: b
, ttpThird :: (a, b)
} deriving (Eq,Show,Generic,FromJSON,ToJSON)
instance Arbitrary (TwoTypeParameters TypeParameterRef0 TypeParameterRef1) where
arbitrary = TwoTypeParameters <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance ToADTArbitrary (TwoTypeParameters TypeParameterRef0 TypeParameterRef1)
instance (Typeable a, OCamlType a, Typeable b, OCamlType b) => (OCamlType (TwoTypeParameters a b))
data Three a b c =
Three
{ threeId :: Int
, threeFirst :: a
, threeSecond :: b
, threeThird :: c
, threeString :: String
} deriving (Eq,Show,Generic,FromJSON,ToJSON)
instance Arbitrary (Three TypeParameterRef0 TypeParameterRef1 TypeParameterRef2) where
arbitrary = Three <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance ToADTArbitrary (Three TypeParameterRef0 TypeParameterRef1 TypeParameterRef2)
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c) => (OCamlType (Three a b c))
data SubTypeParameter a b c =
SubTypeParameter
{ listA :: [a]
, maybeB :: Maybe b
, tupleC :: (c,b)
} deriving (Eq,Show,Generic,FromJSON,ToJSON)
instance Arbitrary (SubTypeParameter TypeParameterRef0 TypeParameterRef1 TypeParameterRef2) where
arbitrary = do
k <- choose (1,3)
v <- vector k
SubTypeParameter <$> pure v <*> arbitrary <*> arbitrary
instance ToADTArbitrary (SubTypeParameter TypeParameterRef0 TypeParameterRef1 TypeParameterRef2)
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c) => (OCamlType (SubTypeParameter a b c))
data UnnamedProduct = UnnamedProduct String Int
deriving (Eq, Read, Show, Generic, OCamlType, FromJSON, ToJSON)
instance Arbitrary UnnamedProduct where
arbitrary = UnnamedProduct <$> arbitrary <*> arbitrary
instance ToADTArbitrary UnnamedProduct
data Simple =
Simple
{ sa :: Int
, sb :: String
} deriving (Eq,Show,Generic,FromJSON,ToJSON)
instance OCamlType Simple where
toOCamlType _ = typeableToOCamlType (Proxy :: Proxy Simple)
instance ToADTArbitrary Simple
instance Arbitrary Simple where
arbitrary = Simple <$> arbitrary <*> arbitrary
data ComplexProduct =
ComplexProduct
{ cp0 :: Either Person [Int]
, cp1 :: [(Int, Either String Double)]
, cp2 :: [[Int]]
, cp3 :: Maybe [Int]
, cp4 :: Either Simple Int
} deriving (Eq,Show,Generic,OCamlType,FromJSON,ToJSON)
instance Arbitrary ComplexProduct where
arbitrary = do
k0 <- choose (1,3)
v0 <- vector k0
k1 <- choose (1,3)
v1 <- vector k1
ComplexProduct <$> arbitrary <*> pure v0 <*> pure v1 <*> arbitrary <*> arbitrary
instance ToADTArbitrary ComplexProduct
data Wrapper a =
Wrapper
{ wpa :: a
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (Wrapper a)
instance (Arbitrary a) => Arbitrary (Wrapper a) where
arbitrary = Wrapper <$> arbitrary
instance (Typeable a, OCamlType a) => (OCamlType (Wrapper a))
data IntWrapped =
IntWrapped
{ iw :: Wrapper Int
} deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary IntWrapped
instance Arbitrary IntWrapped where
arbitrary = IntWrapped <$> arbitrary
data MaybeWrapped =
MaybeWrapped
{ mw :: Wrapper (Maybe Int)
} deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary MaybeWrapped
instance Arbitrary MaybeWrapped where
arbitrary = MaybeWrapped <$> arbitrary
data EitherWrapped =
EitherWrapped
{ ew :: Wrapper (Either Int Double)
} deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary EitherWrapped
instance Arbitrary EitherWrapped where
arbitrary = EitherWrapped <$> arbitrary
data ComplexWrapped =
ComplexWrapped
{ cw :: Wrapper (Either (Maybe Char) Double)
} deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary ComplexWrapped
instance Arbitrary ComplexWrapped where
arbitrary = ComplexWrapped <$> arbitrary
data TupleWrapped =
TupleWrapped
{ tw :: Wrapper (Int,String,Double)
} deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary TupleWrapped
instance Arbitrary TupleWrapped where
arbitrary = TupleWrapped <$> arbitrary
data SumWrapped
= SW1
| SW2 (Wrapper Int)
| SW3 (Wrapper (Maybe String))
| SW4 (Wrapper (Either Int String))
deriving (Eq,Show,Generic,OCamlType,ToJSON,FromJSON)
instance ToADTArbitrary SumWrapped
instance Arbitrary SumWrapped where
arbitrary =
oneof
[ pure SW1
, SW2 <$> arbitrary
, SW3 <$> arbitrary
, SW4 <$> arbitrary
]
data HalfWrapped a =
HalfWrapped
{ hw :: Wrapper (Either Int a)
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance Arbitrary (HalfWrapped TypeParameterRef0) where
arbitrary = HalfWrapped <$> arbitrary
instance ToADTArbitrary (HalfWrapped TypeParameterRef0)
instance (Typeable a, OCamlType a) => (OCamlType (HalfWrapped a))
data PartiallyWrapped a b c =
PartiallyWrapped
{ pw :: Wrapper (Either Int (String,b,Double,c,a))
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance Arbitrary (PartiallyWrapped TypeParameterRef0 TypeParameterRef1 TypeParameterRef2) where
arbitrary = PartiallyWrapped <$> arbitrary
instance ToADTArbitrary (PartiallyWrapped TypeParameterRef0 TypeParameterRef1 TypeParameterRef2)
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c) => (OCamlType (PartiallyWrapped a b c))
-- | type parameter declaration and use order are different
data ScrambledTypeParameterRefs a b c d e f =
ScrambledTypeParameterRefs
{ stprb :: b
, stprd :: d
, stpre :: e
, stpra :: a
, stprf :: f
, stprc :: c
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance Arbitrary (ScrambledTypeParameterRefs TypeParameterRef0 TypeParameterRef1 TypeParameterRef2 TypeParameterRef3 TypeParameterRef4 TypeParameterRef5) where
arbitrary = ScrambledTypeParameterRefs <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance ToADTArbitrary (ScrambledTypeParameterRefs TypeParameterRef0 TypeParameterRef1 TypeParameterRef2 TypeParameterRef3 TypeParameterRef4 TypeParameterRef5)
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c, Typeable d, OCamlType d, Typeable e, OCamlType e, Typeable f, OCamlType f) => (OCamlType (ScrambledTypeParameterRefs a b c d e f))
data WrappedWrapper =
WrappedWrapper
-- { ww :: Maybe (Wrapper (Maybe String))
{ ww :: Maybe (Wrapper (Maybe Int))
} deriving (Eq,Show,Generic,ToJSON,FromJSON,OCamlType)
instance Arbitrary WrappedWrapper where
arbitrary = WrappedWrapper <$> arbitrary
instance ToADTArbitrary WrappedWrapper
data WrapThree a b c =
WrapThree
{ wp2a :: a
, wp2b :: b
, wp2ab :: (a, b)
, wp2cb :: (c, b)
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a, ToADTArbitrary b, Arbitrary b, ToADTArbitrary c, Arbitrary c) => ToADTArbitrary (WrapThree a b c)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (WrapThree a b c) where
arbitrary = WrapThree <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c) => (OCamlType (WrapThree a b c))
data WrapThreeUnfilled a b c =
WrapThreeUnfilled
{ zed :: String
, unfilled :: WrapThree a b c
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a, ToADTArbitrary b, Arbitrary b, ToADTArbitrary c, Arbitrary c) => ToADTArbitrary (WrapThreeUnfilled a b c)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (WrapThreeUnfilled a b c) where
arbitrary = WrapThreeUnfilled <$> arbitrary <*> arbitrary
instance (Typeable a, OCamlType a, Typeable b, OCamlType b, Typeable c, OCamlType c) => (OCamlType (WrapThreeUnfilled a b c))
data WrapThreeFilled =
WrapThreeFilled
{ foo :: String
, filled :: WrapThree Int Double Person
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance ToADTArbitrary WrapThreeFilled
instance Arbitrary WrapThreeFilled where
arbitrary = WrapThreeFilled <$> arbitrary <*> arbitrary
instance OCamlType WrapThreeFilled
data WrapThreePartiallyFilled a =
WrapThreePartiallyFilled
{ bar :: String
, bar2 :: [Int]
, partiallyFilled :: WrapThree Float a Double
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (WrapThreePartiallyFilled a)
instance Arbitrary a => Arbitrary (WrapThreePartiallyFilled a) where
arbitrary = WrapThreePartiallyFilled <$> arbitrary <*> arbitrary <*> arbitrary
instance (Typeable a, OCamlType a) => OCamlType (WrapThreePartiallyFilled a)
-- phantom types
data TypeSynonymKey a = String
deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (TypeSynonymKey a)
instance Arbitrary a => Arbitrary (TypeSynonymKey a) where
arbitrary = arbitrary
instance (Typeable a, OCamlType a) => OCamlType (TypeSynonymKey a)
newtype NewTypeKey a = NewTypeKey String
deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (NewTypeKey a)
instance Arbitrary (NewTypeKey a) where
arbitrary = NewTypeKey <$> arbitrary
instance (Typeable a, OCamlType a) => OCamlType (NewTypeKey a)
-- abc
data InnerBox a =
InnerBox
{ ibA :: a
, ibS :: String
, ibX :: Int
} deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (InnerBox a)
instance Arbitrary a => Arbitrary (InnerBox a) where
arbitrary = InnerBox <$> arbitrary <*> arbitrary <*> arbitrary
instance (Typeable a, OCamlType a) => OCamlType (InnerBox a)
data OuterBox =
OuterBox (InnerBox Person)
deriving (Eq,Show,Generic,ToJSON,FromJSON)
instance ToADTArbitrary OuterBox
instance Arbitrary OuterBox where
arbitrary = OuterBox <$> arbitrary
instance OCamlType OuterBox
data AuditAction = Create | Delete | Update
deriving (Show, Read, Eq, Ord, Generic, Typeable, ToJSON, FromJSON)
instance ToADTArbitrary AuditAction
instance Arbitrary AuditAction where
arbitrary = elements [Create, Delete, Update]
instance OCamlType AuditAction
data AuditModel a =
AuditModel
{ auditModel :: a
, originalId :: String
, auditAction :: AuditAction
, editedBy :: String
, editedOn :: String
} deriving (Read, Show, Eq, Generic, Typeable, ToJSON, FromJSON)
instance (ToADTArbitrary a, Arbitrary a) => ToADTArbitrary (AuditModel a)
instance (Arbitrary a) => Arbitrary (AuditModel a) where
arbitrary = AuditModel <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance OCamlType (AuditModel TypeParameterRef0)
data User =
User
{ userIdent :: String
, userPassword :: Maybe (String)
, userTimezone :: String
} deriving (Eq, Generic, Ord, Read, Show, Typeable, ToJSON, FromJSON)
instance ToADTArbitrary User
instance Arbitrary User where
arbitrary = User <$> arbitrary <*> arbitrary <*> arbitrary
instance OCamlType User
newtype UserAudit = UserAudit (AuditModel User)
deriving (Read, Show, Eq, Generic, Typeable, ToJSON, FromJSON)
instance ToADTArbitrary UserAudit
instance Arbitrary UserAudit where
arbitrary = UserAudit <$> arbitrary
instance OCamlType UserAudit
newtype SqlKey = SqlKey Int deriving (Eq, Generic, Ord, Read, Show, Typeable, ToJSON, FromJSON, OCamlType)
instance ToADTArbitrary SqlKey
instance Arbitrary SqlKey where
arbitrary = SqlKey <$> arbitrary
newtype UserId =
UserId SqlKey
deriving (Eq, Generic, Ord, Show, ToJSON, FromJSON, OCamlType)
instance ToADTArbitrary UserId
instance Arbitrary UserId where
arbitrary = UserId <$> arbitrary
-- def
{-
λ> toOCamlType (Proxy :: Proxy SqlKey)
OCamlDatatype
(HaskellTypeMetaData "SqlKey" "Ghci1" "interactive")
"SqlKey"
(OCamlValueConstructor (NamedConstructor "SqlKey" (OCamlPrimitiveRef OInt)))
λ> toOCamlType (Proxy :: Proxy UserId)
OCamlDatatype
(HaskellTypeMetaData "UserId" "Ghci2" "interactive")
"UserId"
(OCamlValueConstructor (NamedConstructor "UserId" (OCamlRef (HaskellTypeMetaData "SqlKey" "Ghci1" "interactive") "SqlKey")))
:set -XDeriveGeneric
:set -XDeriveAnyClass
import Data.Proxy (Proxy(..))
import Data.Typeable (Typeable)
import OCaml.Export
import Data.Time (UTCTime)
data AuditAction = Create | Delete | Update
deriving (Show, Read, Eq, Ord, Generic, Typeable, OCamlType)
data AuditModel a =
AuditModel
{ auditModel :: a
, originalId :: ByteString
, auditAction :: AuditAction
, editedBy :: Text
, editedOn :: UTCTime
} deriving (Read, Show, Eq, Generic, Typeable, OCamlType)
re-react-onping-frontend/src/PlowtechAuthenticationTypes.ml
data Wrapper a =
Wrapper
{ wpa :: a
} deriving (Eq,Show,Generic,OCamlType)
data SumWrapped
= SW1
| SW2 (Wrapper Int)
| SW3 (Wrapper (Maybe String))
| SW4 (Wrapper (Either Int String))
deriving (Eq,Show,Generic,OCamlType)
toOCamlType (Proxy :: Proxy SumWrapped)
OCamlDatatype (HaskellTypeMetaData "SumWrapped" "Ghci1" "interactive") "SumWrapped" (OCamlValueConstructor (MultipleConstructors [MultipleConstructors [NamedConstructor "SW1" OCamlEmpty,NamedConstructor "SW2" (OCamlRefApp (Wrapper Int) (OCamlPrimitiveRef OInt))],MultipleConstructors [NamedConstructor "SW3" (OCamlRefApp (Wrapper (Maybe [Char])) (OCamlPrimitiveRef (OOption (OCamlPrimitive (OList (OCamlPrimitive OChar)))))),NamedConstructor "SW4" (OCamlRefApp (Wrapper (Either Int [Char])) (OCamlPrimitiveRef (OEither (OCamlPrimitive OInt) (OCamlPrimitive (OList (OCamlPrimitive OChar))))))]]))
data InnerBox a =
InnerBox
{ ibA :: a
, ibS :: String
, ibX :: Int
} deriving (Eq,Show,Generic)
instance (Typeable a, OCamlType a) => OCamlType (InnerBox a)
data Person = Person
{ id :: Int
, name :: Maybe String
, created :: String
} deriving (Show, Eq, Generic,OCamlType)
data OuterBox =
OuterBox (InnerBox Person)
deriving (Eq,Show,Generic,OCamlType)
toOCamlType (Proxy :: Proxy OuterBox)
OCamlDatatype
(HaskellTypeMetaData "OuterBox" "Ghci4" "interactive")
"OuterBox"
(OCamlValueConstructor
(NamedConstructor
"OuterBox"
(OCamlRefApp
(InnerBox Person)
(OCamlRef (HaskellTypeMetaData "Person" "Ghci3" "interactive") "Person"))))
OCamlDatatype
(HaskellTypeMetaData "NewType" "Ghci1" "interactive")
"NewType"
(OCamlValueConstructor
(NamedConstructor
"NewType"
(OCamlPrimitiveRef OInt)))
newtype NewType
= NewType Int
deriving (Show,Eq,Generic,OCamlType)
OCamlDatatype
(HaskellTypeMetaData "SumWrapped" "Ghci1" "interactive")
"SumWrapped"
(OCamlValueConstructor
(MultipleConstructors
[MultipleConstructors
[NamedConstructor "SW1" OCamlEmpty
,NamedConstructor
"SW2"
(OCamlRefApp
(Wrapper Int)
(OCamlPrimitiveRef OInt))]
,MultipleConstructors
[NamedConstructor "SW3" (OCamlRefApp (Wrapper (Maybe [Char])) (OCamlPrimitiveRef (OOption (OCamlPrimitive (OList (OCamlPrimitive OChar))))))
,NamedConstructor "SW4" (OCamlRefApp (Wrapper (Either Int [Char])) (OCamlPrimitiveRef (OEither (OCamlPrimitive OInt) (OCamlPrimitive (OList (OCamlPrimitive OChar))))))]]))
data UnnamedProduct = UnnamedProduct String Int
deriving (Eq, Read, Show, Generic, OCamlType)
toOCamlType (Proxy :: Proxy UnnamedProduct)
OCamlDatatype
(HaskellTypeMetaData "UnnamedProduct" "Ghci7" "interactive")
"UnnamedProduct"
(OCamlValueConstructor
(NamedConstructor
"UnnamedProduct"
(Values
(OCamlPrimitiveRef
(OList (OCamlPrimitive OChar)))
(OCamlPrimitiveRef OInt))))
{-
data OCamlConstructor
= OCamlValueConstructor ValueConstructor -- ^ Sum, record (product with named fields) or product without named fields
data ValueConstructor
= NamedConstructor Text OCamlValue -- ^ Product without named fields
| RecordConstructor Text OCamlValue -- ^ Product with named fields
| MultipleConstructors [ValueConstructor] -- ^ Sum type
data OCamlValue
= OCamlRef HaskellTypeMetaData Text -- ^ The name of a non-primitive data type
| OCamlRefApp TypeRep OCamlValue -- ^ A type constructor that has at least one type parameter filled
| OCamlTypeParameterRef Text -- ^ Type parameters like `a` in `Maybe a`
| OCamlEmpty -- ^ a place holder for OCaml value. It can represent the end of a list or an Enumerator in a mixed sum
| OCamlPrimitiveRef OCamlPrimitive -- ^ A primitive OCaml type like `int`, `string`, etc.
| OCamlField Text OCamlValue -- ^ A field name and its type from a record.
| Values OCamlValue OCamlValue -- ^ Used for multiple types in a NameConstructor or a RecordConstructor.
| OCamlRefAppValues OCamlValue OCamlValue -- ^ User for multiple types in an OCamlRefApp. These are rendered in a different way from V
-}
λ> toOCamlType (Proxy :: Proxy (Key User))
OCamlDatatype (HaskellTypeMetaData "Key" "Database.Persist.Class.PersistEntity" "persistent-2.6-HdpHylIi1gZ4QjAhgpXd6i") "Key" (OCamlValueConstructor (NamedConstructor "Key" OCamlEmpty))
λ
λ> toOCamlType (Proxy :: Proxy (UserTag))
OCamlDatatype (HaskellTypeMetaData "UserTag" "Onping.Persist.Models.Internal" "onping-types-0.12.0.0-537fBzusEVB7hcaZbAcQql") "UserTag" (OCamlValueConstructor (RecordConstructor "UserTag" (Values (Values (Values (OCamlField "userTagUser" (OCamlRefApp (Key User) (OCamlRef (HaskellTypeMetaData "User" "Plowtech.Authentication.Persist.Models" "plowtech-authentication-types-0.3.0.0-HOAisznLARVIB1OtLfSJK3") "User"))) (OCamlField "userTagOwner" (OCamlRefApp (Key User) (OCamlRef (HaskellTypeMetaData "User" "Plowtech.Authentication.Persist.Models" "plowtech-authentication-types-0.3.0.0-HOAisznLARVIB1OtLfSJK3") "User")))) (Values (OCamlField "userTagGroup" (OCamlRefApp (Key Group) (OCamlRef (HaskellTypeMetaData "Group" "Onping.Persist.Models.Internal" "onping-types-0.12.0.0-537fBzusEVB7hcaZbAcQql") "Group"))) (Values (OCamlField "userTagSuperGroup" (OCamlRefApp (Key Group) (OCamlRef (HaskellTypeMetaData "Group" "Onping.Persist.Models.Internal" "onping-types-0.12.0.0-537fBzusEVB7hcaZbAcQql") "Group"))) (OCamlField "userTagDefaultDash" (OCamlRefApp (Key Dashboard) (OCamlRef (HaskellTypeMetaData "Dashboard" "Onping.Persist.Models.Internal" "onping-types-0.12.0.0-537fBzusEVB7hcaZbAcQql") "Dashboard")))))) (Values (Values (OCamlField "userTagPhone" (OCamlPrimitiveRef (OOption (OCamlPrimitive OInt)))) (OCamlField "userTagName" (OCamlPrimitiveRef (OOption (OCamlPrimitive OString))))) (Values (OCamlField "userTagCallAlert" (OCamlPrimitiveRef OBool)) (Values (OCamlField "userTagEmailAlert" (OCamlPrimitiveRef OBool)) (OCamlField "userTagTextAlert" (OCamlPrimitiveRef OBool))))))))
-}