polyglot-0.1.1.0: src/Conversions/ToScala/DataDef.hs
module Conversions.ToScala.DataDef where
import qualified SyntaxTrees.Haskell.DataDef as H
import qualified SyntaxTrees.Scala.Common as S
import qualified SyntaxTrees.Scala.DataDef as S
import qualified SyntaxTrees.Scala.Type as S
import Conversions.ToScala.Common (autoIds, class', ctor, var)
import Conversions.ToScala.Type (anyKindedType, type', typeCtor, typeParam)
import SyntaxTrees.Haskell.DataDef (derivingClasses)
typeDef :: H.TypeDef -> S.TypeDef
typeDef (H.TypeDef x y z) =
S.TypeDef (typeCtor x) (typeParam <$> y) (anyKindedType z)
newtypeDef :: H.NewTypeDef -> S.OpaqueTypeDef
newtypeDef (H.NewTypeDef x y _ z t) =
S.OpaqueTypeDef (typeCtor x) (typeParam <$> y)
((.type') $ fieldDef z)
(class' <$> foldMap ((snd <$>) . derivingClasses) t)
dataDef :: H.DataDef -> S.EnumDef
dataDef (H.DataDef x y z t) =
S.EnumDef [] (typeCtor x) (typeParam <$> y) [] []
(class' <$> foldMap ((snd <$>) . derivingClasses) t)
(dataCtorDef <$> z)
dataCtorDef :: H.DataCtorDef -> S.EnumCaseDef
dataCtorDef (H.NamedFieldsCtor x y) = S.EnumCaseDef (ctor x)
[S.ArgList $ namedFieldDef <$> y] [] [] []
dataCtorDef (H.UnNamedFieldsCtor x y) = S.EnumCaseDef (ctor x)
[S.ArgList $ uncurry unNamedFieldDef <$> zip autoIds y] [] [] []
fieldDef :: H.FieldDef -> S.ArgField
fieldDef (H.NamedField x) = namedFieldDef x
fieldDef (H.UnNamedField x) = unNamedFieldDef "value" x
namedFieldDef :: H.NamedFieldDef -> S.ArgField
namedFieldDef (H.NamedFieldDef x y) = S.ArgField [] (var x) (type' y)
unNamedFieldDef :: String -> H.UnNamedFieldDef -> S.ArgField
unNamedFieldDef x (H.UnNamedFieldDef y) = S.ArgField [] (S.Var x) (type' y)