module Foreign.Hoppy.Generator.Spec.ClassFeature (
ClassFeature (..),
classAddFeatures,
) where
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (mempty)
#endif
import Foreign.Hoppy.Generator.Spec
data ClassFeature =
Assignable
| Comparable
| Copyable
| Equatable
deriving (Eq, Show)
featureContents :: ClassFeature -> Class -> ([Ctor], [Method], Reqs)
featureContents feature cls = case feature of
Assignable -> assignableContents cls
Comparable -> comparableContents cls
Copyable -> copyableContents cls
Equatable -> equatableContents cls
assignableContents :: Class -> ([Ctor], [Method], Reqs)
assignableContents cls =
([],
[ mkMethod OpAssign [TRef $ TConst $ TObj cls] $ TRef $ TObj cls
],
mempty)
comparableContents :: Class -> ([Ctor], [Method], Reqs)
comparableContents cls =
([],
[ mkConstMethod OpLt [TRef $ TConst $ TObj cls] TBool
, mkConstMethod OpLe [TRef $ TConst $ TObj cls] TBool
, mkConstMethod OpGt [TRef $ TConst $ TObj cls] TBool
, mkConstMethod OpGe [TRef $ TConst $ TObj cls] TBool
],
mempty)
copyableContents :: Class -> ([Ctor], [Method], Reqs)
copyableContents cls =
([ mkCtor "newCopy" [TObj cls]
],
[],
mempty)
equatableContents :: Class -> ([Ctor], [Method], Reqs)
equatableContents cls =
([],
[ mkConstMethod OpEq [TObj cls] TBool
, mkConstMethod OpNe [TObj cls] TBool
],
mempty)
classAddFeatures :: [ClassFeature] -> Class -> Class
classAddFeatures features cls =
foldr (\feature cls' ->
let (ctors, methods, reqs) = featureContents feature cls'
in addReqs reqs $
classAddCtors ctors $
classAddMethods methods cls')
cls
features