packages feed

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)