packages feed

polyglot-0.1.1.0: src/Conversions/ToScala/ClassDef.hs

module Conversions.ToScala.ClassDef where

import qualified SyntaxTrees.Haskell.ClassDef as H
import qualified SyntaxTrees.Haskell.Common   as H
import qualified SyntaxTrees.Scala.Common     as S
import qualified SyntaxTrees.Scala.DataDef    as S
import qualified SyntaxTrees.Scala.FnDef      as S
import qualified SyntaxTrees.Scala.Type       as S

import Conversions.ToScala.FnDef (fnDefOrSigs, fnDefs)
import Conversions.ToScala.Type  (anyKindedType, classConstraint,
                                  findAnyKindedTypeParams, typeParam,
                                  usingArgList)

import Data.Foldable (Foldable (toList))



classDef :: H.ClassDef -> S.TraitDef
classDef (H.ClassDef x (H.Class y) z t) =
  S.TraitDef [] (S.TypeCtor y)
        (typeParam <$> z) [] [usingArgList $ classConstraint <$> x] []
        (S.Fn . fnDefs <$> fnDefOrSigs t)


instanceDef :: H.InstanceDef -> S.GivenDef
instanceDef (H.InstanceDef x (H.Class y) z t) =
  S.GivenDef [] Nothing
        (mconcat ((typeParam <$>) . toList . findAnyKindedTypeParams <$> z))
        [usingArgList $ classConstraint <$> x]
        (S.CtorTypeApply (S.QTypeCtor Nothing $ S.TypeCtor y) $ anyKindedType <$> z)
        (Right $ fnDefs <$> fnDefOrSigs t)

derivingDef :: H.DerivingDef -> S.GivenDef
derivingDef (H.DerivingDef _ x (H.Class y) z _) =
  S.GivenDef [] Nothing
        (mconcat ((typeParam <$>) . toList . findAnyKindedTypeParams <$> z))
        [usingArgList $ classConstraint <$> x]
        (S.CtorTypeApply (S.QTypeCtor Nothing $ S.TypeCtor y) $ anyKindedType <$> z)
        (Left $ S.FnVar' $ S.Var' (S.QVar Nothing $ S.Var "derived"))