packages feed

gi-gst-0.1.6.13: GI/Gst/Structs/Iterator.hs


{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

A GstIterator is used to retrieve multiple objects from another object in
a threadsafe way.

Various GStreamer objects provide access to their internal structures using
an iterator.

Note that if calling a GstIterator function results in your code receiving
a refcounted object (with, say, g_value_get_object()), the refcount for that
object will not be increased. Your code is responsible for taking a reference
if it wants to continue using it later.

The basic use pattern of an iterator is as follows:
|[
  GstIterator *it = _get_iterator(object);
  GValue item = G_VALUE_INIT;
  done = FALSE;
  while (!done) {
    switch (gst_iterator_next (it, &item)) {
      case GST_ITERATOR_OK:
        ...get/use/change item here...
        g_value_reset (&item);
        break;
      case GST_ITERATOR_RESYNC:
        ...rollback changes to items...
        gst_iterator_resync (it);
        break;
      case GST_ITERATOR_ERROR:
        ...wrong parameters were given...
        done = TRUE;
        break;
      case GST_ITERATOR_DONE:
        done = TRUE;
        break;
    }
  }
  g_value_unset (&item);
  gst_iterator_free (it);
]|
-}

module GI.Gst.Structs.Iterator
    ( 

-- * Exported types
    Iterator(..)                            ,
    newZeroIterator                         ,
    noIterator                              ,


 -- * Methods
-- ** iteratorCopy
    IteratorCopyMethodInfo                  ,
    iteratorCopy                            ,


-- ** iteratorFilter
    IteratorFilterMethodInfo                ,
    iteratorFilter                          ,


-- ** iteratorFindCustom
    IteratorFindCustomMethodInfo            ,
    iteratorFindCustom                      ,


-- ** iteratorFold
    IteratorFoldMethodInfo                  ,
    iteratorFold                            ,


-- ** iteratorForeach
    IteratorForeachMethodInfo               ,
    iteratorForeach                         ,


-- ** iteratorFree
    IteratorFreeMethodInfo                  ,
    iteratorFree                            ,


-- ** iteratorNewSingle
    iteratorNewSingle                       ,


-- ** iteratorNext
    IteratorNextMethodInfo                  ,
    iteratorNext                            ,


-- ** iteratorPush
    IteratorPushMethodInfo                  ,
    iteratorPush                            ,


-- ** iteratorResync
    IteratorResyncMethodInfo                ,
    iteratorResync                          ,




 -- * Properties
-- ** Cookie
    iteratorReadCookie                      ,


-- ** Lock
    iteratorReadLock                        ,


-- ** MasterCookie
    iteratorReadMasterCookie                ,


-- ** Pushed
    iteratorReadPushed                      ,


-- ** Size
    iteratorReadSize                        ,


-- ** Type
    iteratorReadType                        ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.Gst.Types
import GI.Gst.Callbacks
import qualified GI.GLib as GLib

newtype Iterator = Iterator (ForeignPtr Iterator)
foreign import ccall "gst_iterator_get_type" c_gst_iterator_get_type :: 
    IO GType

instance BoxedObject Iterator where
    boxedType _ = c_gst_iterator_get_type

-- | Construct a `Iterator` struct initialized to zero.
newZeroIterator :: MonadIO m => m Iterator
newZeroIterator = liftIO $ callocBoxedBytes 120 >>= wrapBoxed Iterator

noIterator :: Maybe Iterator
noIterator = Nothing

-- XXX Skipped getter for "Iterator:copy" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- XXX Skipped getter for "Iterator:next" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- XXX Skipped getter for "Iterator:item" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- XXX Skipped getter for "Iterator:resync" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

-- XXX Skipped getter for "Iterator:free" :: Not implemented: "Wrapping foreign callbacks is not supported yet"

iteratorReadPushed :: Iterator -> IO Iterator
iteratorReadPushed s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 40) :: IO (Ptr Iterator)
    val' <- (newBoxed Iterator) val
    return val'

iteratorReadType :: Iterator -> IO GType
iteratorReadType s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 48) :: IO CGType
    let val' = GType val
    return val'

iteratorReadLock :: Iterator -> IO GLib.Mutex
iteratorReadLock s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 56) :: IO (Ptr GLib.Mutex)
    val' <- (newPtr 8 GLib.Mutex) val
    return val'

iteratorReadCookie :: Iterator -> IO Word32
iteratorReadCookie s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 64) :: IO Word32
    return val

iteratorReadMasterCookie :: Iterator -> IO Word32
iteratorReadMasterCookie s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 72) :: IO Word32
    return val

iteratorReadSize :: Iterator -> IO Word32
iteratorReadSize s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 80) :: IO Word32
    return val

-- method Iterator::new_single
-- method type : Constructor
-- Args : [Arg {argCName = "type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "object", argType = TInterface "GObject" "Value", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "Iterator"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_new_single" gst_iterator_new_single :: 
    CGType ->                               -- type : TBasicType TGType
    Ptr GValue ->                           -- object : TInterface "GObject" "Value"
    IO (Ptr Iterator)


iteratorNewSingle ::
    (MonadIO m) =>
    GType                                   -- type_
    -> GValue                               -- object
    -> m Iterator                           -- result
iteratorNewSingle type_ object = liftIO $ do
    let type_' = gtypeToCGType type_
    let object' = unsafeManagedPtrGetPtr object
    result <- gst_iterator_new_single type_' object'
    checkUnexpectedReturnNULL "gst_iterator_new_single" result
    result' <- (wrapBoxed Iterator) result
    touchManagedPtr object
    return result'

-- method Iterator::copy
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "Iterator"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_copy" gst_iterator_copy :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    IO (Ptr Iterator)


iteratorCopy ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> m Iterator                           -- result
iteratorCopy _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- gst_iterator_copy _obj'
    checkUnexpectedReturnNULL "gst_iterator_copy" result
    result' <- (wrapBoxed Iterator) result
    touchManagedPtr _obj
    return result'

data IteratorCopyMethodInfo
instance (signature ~ (m Iterator), MonadIO m) => MethodInfo IteratorCopyMethodInfo Iterator signature where
    overloadedMethod _ = iteratorCopy

-- method Iterator::filter
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "func", argType = TInterface "GLib" "CompareFunc", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TInterface "GObject" "Value", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "Iterator"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_filter" gst_iterator_filter :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    FunPtr GLib.CompareFuncC ->             -- func : TInterface "GLib" "CompareFunc"
    Ptr GValue ->                           -- user_data : TInterface "GObject" "Value"
    IO (Ptr Iterator)


iteratorFilter ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> GLib.CompareFunc                     -- func
    -> GValue                               -- userData
    -> m Iterator                           -- result
iteratorFilter _obj func userData = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    func' <- GLib.mkCompareFunc (GLib.compareFuncWrapper Nothing func)
    let userData' = unsafeManagedPtrGetPtr userData
    result <- gst_iterator_filter _obj' func' userData'
    checkUnexpectedReturnNULL "gst_iterator_filter" result
    result' <- (wrapBoxed Iterator) result
    safeFreeFunPtr $ castFunPtrToPtr func'
    touchManagedPtr _obj
    touchManagedPtr userData
    return result'

data IteratorFilterMethodInfo
instance (signature ~ (GLib.CompareFunc -> GValue -> m Iterator), MonadIO m) => MethodInfo IteratorFilterMethodInfo Iterator signature where
    overloadedMethod _ = iteratorFilter

-- method Iterator::find_custom
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "func", argType = TInterface "GLib" "CompareFunc", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = 3, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "elem", argType = TInterface "GObject" "Value", direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_find_custom" gst_iterator_find_custom :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    FunPtr GLib.CompareFuncC ->             -- func : TInterface "GLib" "CompareFunc"
    Ptr GValue ->                           -- elem : TInterface "GObject" "Value"
    Ptr () ->                               -- user_data : TBasicType TVoid
    IO CInt


iteratorFindCustom ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> GLib.CompareFunc                     -- func
    -> m (Bool,GValue)                      -- result
iteratorFindCustom _obj func = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    func' <- GLib.mkCompareFunc (GLib.compareFuncWrapper Nothing func)
    elem <- callocBoxedBytes 24 :: IO (Ptr GValue)
    let userData = nullPtr
    result <- gst_iterator_find_custom _obj' func' elem userData
    let result' = (/= 0) result
    elem' <- (wrapBoxed GValue) elem
    safeFreeFunPtr $ castFunPtrToPtr func'
    touchManagedPtr _obj
    return (result', elem')

data IteratorFindCustomMethodInfo
instance (signature ~ (GLib.CompareFunc -> m (Bool,GValue)), MonadIO m) => MethodInfo IteratorFindCustomMethodInfo Iterator signature where
    overloadedMethod _ = iteratorFindCustom

-- method Iterator::fold
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "func", argType = TInterface "Gst" "IteratorFoldFunction", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = 3, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "ret", argType = TInterface "GObject" "Value", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "IteratorResult"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_fold" gst_iterator_fold :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    FunPtr IteratorFoldFunctionC ->         -- func : TInterface "Gst" "IteratorFoldFunction"
    Ptr GValue ->                           -- ret : TInterface "GObject" "Value"
    Ptr () ->                               -- user_data : TBasicType TVoid
    IO CUInt


iteratorFold ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> IteratorFoldFunction                 -- func
    -> GValue                               -- ret
    -> m IteratorResult                     -- result
iteratorFold _obj func ret = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    func' <- mkIteratorFoldFunction (iteratorFoldFunctionWrapper Nothing func)
    let ret' = unsafeManagedPtrGetPtr ret
    let userData = nullPtr
    result <- gst_iterator_fold _obj' func' ret' userData
    let result' = (toEnum . fromIntegral) result
    safeFreeFunPtr $ castFunPtrToPtr func'
    touchManagedPtr _obj
    touchManagedPtr ret
    return result'

data IteratorFoldMethodInfo
instance (signature ~ (IteratorFoldFunction -> GValue -> m IteratorResult), MonadIO m) => MethodInfo IteratorFoldMethodInfo Iterator signature where
    overloadedMethod _ = iteratorFold

-- method Iterator::foreach
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "func", argType = TInterface "Gst" "IteratorForeachFunction", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeCall, argClosure = 2, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "IteratorResult"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_foreach" gst_iterator_foreach :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    FunPtr IteratorForeachFunctionC ->      -- func : TInterface "Gst" "IteratorForeachFunction"
    Ptr () ->                               -- user_data : TBasicType TVoid
    IO CUInt


iteratorForeach ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> IteratorForeachFunction              -- func
    -> m IteratorResult                     -- result
iteratorForeach _obj func = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    func' <- mkIteratorForeachFunction (iteratorForeachFunctionWrapper Nothing func)
    let userData = nullPtr
    result <- gst_iterator_foreach _obj' func' userData
    let result' = (toEnum . fromIntegral) result
    safeFreeFunPtr $ castFunPtrToPtr func'
    touchManagedPtr _obj
    return result'

data IteratorForeachMethodInfo
instance (signature ~ (IteratorForeachFunction -> m IteratorResult), MonadIO m) => MethodInfo IteratorForeachMethodInfo Iterator signature where
    overloadedMethod _ = iteratorForeach

-- method Iterator::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_free" gst_iterator_free :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    IO ()


iteratorFree ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> m ()                                 -- result
iteratorFree _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    gst_iterator_free _obj'
    touchManagedPtr _obj
    return ()

data IteratorFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => MethodInfo IteratorFreeMethodInfo Iterator signature where
    overloadedMethod _ = iteratorFree

-- method Iterator::next
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "elem", argType = TInterface "GObject" "Value", direction = DirectionOut, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = True, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TInterface "Gst" "IteratorResult"
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_next" gst_iterator_next :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    Ptr GValue ->                           -- elem : TInterface "GObject" "Value"
    IO CUInt


iteratorNext ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> m (IteratorResult,GValue)            -- result
iteratorNext _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    elem <- callocBoxedBytes 24 :: IO (Ptr GValue)
    result <- gst_iterator_next _obj' elem
    let result' = (toEnum . fromIntegral) result
    elem' <- (wrapBoxed GValue) elem
    touchManagedPtr _obj
    return (result', elem')

data IteratorNextMethodInfo
instance (signature ~ (m (IteratorResult,GValue)), MonadIO m) => MethodInfo IteratorNextMethodInfo Iterator signature where
    overloadedMethod _ = iteratorNext

-- method Iterator::push
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "other", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_push" gst_iterator_push :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    Ptr Iterator ->                         -- other : TInterface "Gst" "Iterator"
    IO ()


iteratorPush ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> Iterator                             -- other
    -> m ()                                 -- result
iteratorPush _obj other = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let other' = unsafeManagedPtrGetPtr other
    gst_iterator_push _obj' other'
    touchManagedPtr _obj
    touchManagedPtr other
    return ()

data IteratorPushMethodInfo
instance (signature ~ (Iterator -> m ()), MonadIO m) => MethodInfo IteratorPushMethodInfo Iterator signature where
    overloadedMethod _ = iteratorPush

-- method Iterator::resync
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "_obj", argType = TInterface "Gst" "Iterator", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gst_iterator_resync" gst_iterator_resync :: 
    Ptr Iterator ->                         -- _obj : TInterface "Gst" "Iterator"
    IO ()


iteratorResync ::
    (MonadIO m) =>
    Iterator                                -- _obj
    -> m ()                                 -- result
iteratorResync _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    gst_iterator_resync _obj'
    touchManagedPtr _obj
    return ()

data IteratorResyncMethodInfo
instance (signature ~ (m ()), MonadIO m) => MethodInfo IteratorResyncMethodInfo Iterator signature where
    overloadedMethod _ = iteratorResync

type family ResolveIteratorMethod (t :: Symbol) (o :: *) :: * where
    ResolveIteratorMethod "copy" o = IteratorCopyMethodInfo
    ResolveIteratorMethod "filter" o = IteratorFilterMethodInfo
    ResolveIteratorMethod "findCustom" o = IteratorFindCustomMethodInfo
    ResolveIteratorMethod "fold" o = IteratorFoldMethodInfo
    ResolveIteratorMethod "foreach" o = IteratorForeachMethodInfo
    ResolveIteratorMethod "free" o = IteratorFreeMethodInfo
    ResolveIteratorMethod "next" o = IteratorNextMethodInfo
    ResolveIteratorMethod "push" o = IteratorPushMethodInfo
    ResolveIteratorMethod "resync" o = IteratorResyncMethodInfo
    ResolveIteratorMethod l o = MethodResolutionFailed l o

instance (info ~ ResolveIteratorMethod t Iterator, MethodInfo info Iterator p) => IsLabelProxy t (Iterator -> p) where
    fromLabelProxy _ = overloadedMethod (MethodProxy :: MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveIteratorMethod t Iterator, MethodInfo info Iterator p) => IsLabel t (Iterator -> p) where
    fromLabel _ = overloadedMethod (MethodProxy :: MethodProxy info)
#endif