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 :: ClassDef -> TraitDef
classDef (H.ClassDef [ClassConstraint]
x (H.Class String
y) [TypeParam]
z [FnDefOrSig]
t) =
  [Modifier]
-> TypeCtor
-> [TypeParam]
-> [ArgList]
-> [UsingArgList]
-> [Type]
-> [InternalDef]
-> TraitDef
S.TraitDef [] (String -> TypeCtor
S.TypeCtor String
y)
        (TypeParam -> TypeParam
typeParam forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [TypeParam]
z) [] [[ClassConstraint] -> UsingArgList
usingArgList forall a b. (a -> b) -> a -> b
$ ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
x] []
        (InternalFnDef -> InternalDef
S.Fn forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe FnSig, Maybe [FnDef]) -> InternalFnDef
fnDefs forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FnDefOrSig] -> [(Maybe FnSig, Maybe [FnDef])]
fnDefOrSigs [FnDefOrSig]
t)


instanceDef :: H.InstanceDef -> S.GivenDef
instanceDef :: InstanceDef -> GivenDef
instanceDef (H.InstanceDef [ClassConstraint]
x (H.Class String
y) [AnyKindedType]
z [FnDefOrSig]
t) =
  [Modifier]
-> Maybe Var
-> [TypeParam]
-> [UsingArgList]
-> Type
-> Either FnBody [InternalFnDef]
-> GivenDef
S.GivenDef [] forall a. Maybe a
Nothing
        (forall a. Monoid a => [a] -> a
mconcat ((TypeParam -> TypeParam
typeParam <$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyKindedType -> Set TypeParam
findAnyKindedTypeParams forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
z))
        [[ClassConstraint] -> UsingArgList
usingArgList forall a b. (a -> b) -> a -> b
$ ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
x]
        (QTypeCtor -> [Type] -> Type
S.CtorTypeApply (Maybe Package -> TypeCtor -> QTypeCtor
S.QTypeCtor forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ String -> TypeCtor
S.TypeCtor String
y) forall a b. (a -> b) -> a -> b
$ AnyKindedType -> Type
anyKindedType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
z)
        (forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ (Maybe FnSig, Maybe [FnDef]) -> InternalFnDef
fnDefs forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FnDefOrSig] -> [(Maybe FnSig, Maybe [FnDef])]
fnDefOrSigs [FnDefOrSig]
t)

derivingDef :: H.DerivingDef -> S.GivenDef
derivingDef :: DerivingDef -> GivenDef
derivingDef (H.DerivingDef DerivingStrategy
_ [ClassConstraint]
x (H.Class String
y) [AnyKindedType]
z Maybe Class
_) =
  [Modifier]
-> Maybe Var
-> [TypeParam]
-> [UsingArgList]
-> Type
-> Either FnBody [InternalFnDef]
-> GivenDef
S.GivenDef [] forall a. Maybe a
Nothing
        (forall a. Monoid a => [a] -> a
mconcat ((TypeParam -> TypeParam
typeParam <$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnyKindedType -> Set TypeParam
findAnyKindedTypeParams forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
z))
        [[ClassConstraint] -> UsingArgList
usingArgList forall a b. (a -> b) -> a -> b
$ ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
x]
        (QTypeCtor -> [Type] -> Type
S.CtorTypeApply (Maybe Package -> TypeCtor -> QTypeCtor
S.QTypeCtor forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ String -> TypeCtor
S.TypeCtor String
y) forall a b. (a -> b) -> a -> b
$ AnyKindedType -> Type
anyKindedType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
z)
        (forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ FnVar -> FnBody
S.FnVar' forall a b. (a -> b) -> a -> b
$ QVar -> FnVar
S.Var' (Maybe Package -> Var -> QVar
S.QVar forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ String -> Var
S.Var String
"derived"))