packages feed

opencascade-hs-0.0.0.1: src/OpenCascade/Inheritance.hs

{-# LANGUAGE MultiParamTypeClasses #-} 

module OpenCascade.Inheritance 
( SubTypeOf (..)
, DiscriminatedSubTypeOf (..)
, unsafeDowncast
) where

import Foreign.Ptr

class SubTypeOf a b where
    upcast :: Ptr b -> Ptr a
    upcast = castPtr

class SubTypeOf a b => DiscriminatedSubTypeOf a b where
    downcast :: Ptr a -> IO (Maybe (Ptr b))

unsafeDowncast :: DiscriminatedSubTypeOf a b => Ptr a -> IO (Ptr b)
unsafeDowncast p = do
    maybeT <- downcast p
    maybe (error "Incorrect subtype in cast") pure maybeT