module Conversions.ToPurescript.ClassDef where

import qualified SyntaxTrees.Haskell.ClassDef    as H
import qualified SyntaxTrees.Purescript.ClassDef as P

import Conversions.ToPurescript.Common  (class')
import Conversions.ToPurescript.DataDef (derivingStrategy)
import Conversions.ToPurescript.FnDef   (fnDefOrSig)
import Conversions.ToPurescript.Type    (anyKindedType, classConstraint,
                                         typeParam)


classDef :: H.ClassDef -> P.ClassDef
classDef :: ClassDef -> ClassDef
classDef (H.ClassDef [ClassConstraint]
x Class
y [TypeParam]
z [FnDefOrSig]
t) =
  [ClassConstraint]
-> Class -> [TypeParam] -> [FnDefOrSig] -> ClassDef
P.ClassDef (ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
x) (Class -> Class
class' Class
y)
             (TypeParam -> TypeParam
typeParam forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [TypeParam]
z) (FnDefOrSig -> FnDefOrSig
fnDefOrSig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FnDefOrSig]
t)


instanceDef :: H.InstanceDef -> P.InstanceDef
instanceDef :: InstanceDef -> InstanceDef
instanceDef (H.InstanceDef [ClassConstraint]
x Class
y [AnyKindedType]
z [FnDefOrSig]
t) =
  [ClassConstraint]
-> Maybe Var
-> Class
-> [AnyKindedType]
-> [FnDefOrSig]
-> InstanceDef
P.InstanceDef (ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
x) forall a. Maybe a
Nothing (Class -> Class
class' Class
y)
                (AnyKindedType -> AnyKindedType
anyKindedType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
z) (FnDefOrSig -> FnDefOrSig
fnDefOrSig forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FnDefOrSig]
t)

derivingDef :: H.DerivingDef -> P.DerivingDef
derivingDef :: DerivingDef -> DerivingDef
derivingDef (H.DerivingDef DerivingStrategy
x [ClassConstraint]
y Class
z [AnyKindedType]
t Maybe Class
_) =
  DerivingStrategy
-> [ClassConstraint]
-> Maybe Var
-> Class
-> [AnyKindedType]
-> DerivingDef
P.DerivingDef (DerivingStrategy -> DerivingStrategy
derivingStrategy DerivingStrategy
x) (ClassConstraint -> ClassConstraint
classConstraint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ClassConstraint]
y)
                forall a. Maybe a
Nothing (Class -> Class
class' Class
z) (AnyKindedType -> AnyKindedType
anyKindedType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyKindedType]
t)