dbus-1.0.1: A client library for the D-Bus IPC system.

Safe HaskellNone
LanguageHaskell98

DBus.Internal.Types

Synopsis

Documentation

data Type Source #

Instances

Eq Type Source # 

Methods

(==) :: Type -> Type -> Bool #

(/=) :: Type -> Type -> Bool #

Ord Type Source # 

Methods

compare :: Type -> Type -> Ordering #

(<) :: Type -> Type -> Bool #

(<=) :: Type -> Type -> Bool #

(>) :: Type -> Type -> Bool #

(>=) :: Type -> Type -> Bool #

max :: Type -> Type -> Type #

min :: Type -> Type -> Type #

Show Type Source # 

Methods

showsPrec :: Int -> Type -> ShowS #

show :: Type -> String #

showList :: [Type] -> ShowS #

Generic Type Source # 

Associated Types

type Rep Type :: * -> * #

Methods

from :: Type -> Rep Type x #

to :: Rep Type x -> Type #

NFData Type Source # 

Methods

rnf :: Type -> () #

type Rep Type Source # 
type Rep Type = D1 * (MetaData "Type" "DBus.Internal.Types" "dbus-1.0.1-FRzrsliCRDe4JcVbemhPa2" False) ((:+:) * ((:+:) * ((:+:) * ((:+:) * (C1 * (MetaCons "TypeBoolean" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeWord8" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "TypeWord16" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeWord32" PrefixI False) (U1 *)))) ((:+:) * ((:+:) * (C1 * (MetaCons "TypeWord64" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeInt16" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "TypeInt32" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeInt64" PrefixI False) (U1 *))))) ((:+:) * ((:+:) * ((:+:) * (C1 * (MetaCons "TypeDouble" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeUnixFd" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "TypeString" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeSignature" PrefixI False) (U1 *)))) ((:+:) * ((:+:) * (C1 * (MetaCons "TypeObjectPath" PrefixI False) (U1 *)) (C1 * (MetaCons "TypeVariant" PrefixI False) (U1 *))) ((:+:) * (C1 * (MetaCons "TypeArray" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * Type))) ((:+:) * (C1 * (MetaCons "TypeDictionary" PrefixI False) ((:*:) * (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * Type)) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * Type)))) (C1 * (MetaCons "TypeStructure" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * [Type]))))))))

signatureTypes :: Signature -> [Type] Source #

Get the list of types in a signature. The inverse of signature.

formatSignature :: Signature -> String Source #

Convert a signature into a signature string. The inverse of parseSignature.

signature :: [Type] -> Maybe Signature Source #

Convert a list of types into a valid signature.

Returns Nothing if the given types are not a valid signature.

signature_ :: [Type] -> Signature Source #

Convert a list of types into a valid signature.

Throws an exception if the given types are not a valid signature.

parseSignature :: String -> Maybe Signature Source #

Parse a signature string into a valid signature.

Returns Nothing if the given string is not a valid signature.

parseAtom :: Int -> (Type -> a) -> a -> a Source #

class IsVariant a where Source #

Minimal complete definition

toVariant, fromVariant

Instances

IsVariant Bool Source # 
IsVariant Double Source # 
IsVariant Int16 Source # 
IsVariant Int32 Source # 
IsVariant Int64 Source # 
IsVariant Word8 Source # 
IsVariant Word16 Source # 
IsVariant Word32 Source # 
IsVariant Word64 Source # 
IsVariant () Source # 
IsVariant Fd Source # 
IsVariant String Source # 
IsVariant ByteString Source # 
IsVariant ByteString Source # 
IsVariant Text Source # 
IsVariant Text Source # 
IsVariant Serial Source # 
IsVariant Dictionary Source # 
IsVariant Array Source # 
IsVariant Structure Source # 
IsVariant BusName Source # 
IsVariant ErrorName Source # 
IsVariant MemberName Source # 
IsVariant InterfaceName Source # 
IsVariant ObjectPath Source # 
IsVariant Variant Source # 
IsVariant Signature Source # 
IsValue a => IsVariant [a] Source # 
IsValue a => IsVariant (Vector a) Source # 
(IsVariant a1, IsVariant a2) => IsVariant (a1, a2) Source # 

Methods

toVariant :: (a1, a2) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2) Source #

(Ord k, IsAtom k, IsValue v) => IsVariant (Map k v) Source # 
(IsVariant a1, IsVariant a2, IsVariant a3) => IsVariant (a1, a2, a3) Source # 

Methods

toVariant :: (a1, a2, a3) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4) => IsVariant (a1, a2, a3, a4) Source # 

Methods

toVariant :: (a1, a2, a3, a4) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5) => IsVariant (a1, a2, a3, a4, a5) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6) => IsVariant (a1, a2, a3, a4, a5, a6) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7) => IsVariant (a1, a2, a3, a4, a5, a6, a7) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10, IsVariant a11) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10, IsVariant a11, IsVariant a12) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10, IsVariant a11, IsVariant a12, IsVariant a13) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10, IsVariant a11, IsVariant a12, IsVariant a13, IsVariant a14) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source #

(IsVariant a1, IsVariant a2, IsVariant a3, IsVariant a4, IsVariant a5, IsVariant a6, IsVariant a7, IsVariant a8, IsVariant a9, IsVariant a10, IsVariant a11, IsVariant a12, IsVariant a13, IsVariant a14, IsVariant a15) => IsVariant (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source # 

Methods

toVariant :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> Variant Source #

fromVariant :: Variant -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source #

class IsVariant a => IsValue a where Source #

Value types can be used as items in containers, such as lists or dictionaries.

Users may not provide new instances of IsValue because this could allow containers to be created with items of heterogenous types.

Minimal complete definition

typeOf, toValue, fromValue

Instances

IsValue Bool Source # 
IsValue Double Source # 
IsValue Int16 Source # 
IsValue Int32 Source # 
IsValue Int64 Source # 
IsValue Word8 Source # 
IsValue Word16 Source # 
IsValue Word32 Source # 
IsValue Word64 Source # 
IsValue () Source # 

Methods

typeOf :: () -> Type Source #

toValue :: () -> Value Source #

fromValue :: Value -> Maybe () Source #

IsValue Fd Source # 
IsValue String Source # 
IsValue ByteString Source # 
IsValue ByteString Source # 
IsValue Text Source # 
IsValue Text Source # 
IsValue ObjectPath Source # 
IsValue Variant Source # 
IsValue Signature Source # 
IsValue a => IsValue [a] Source # 

Methods

typeOf :: [a] -> Type Source #

toValue :: [a] -> Value Source #

fromValue :: Value -> Maybe [a] Source #

IsValue a => IsValue (Vector a) Source # 
(IsValue a1, IsValue a2) => IsValue (a1, a2) Source # 

Methods

typeOf :: (a1, a2) -> Type Source #

toValue :: (a1, a2) -> Value Source #

fromValue :: Value -> Maybe (a1, a2) Source #

(Ord k, IsAtom k, IsValue v) => IsValue (Map k v) Source # 

Methods

typeOf :: Map k v -> Type Source #

toValue :: Map k v -> Value Source #

fromValue :: Value -> Maybe (Map k v) Source #

(IsValue a1, IsValue a2, IsValue a3) => IsValue (a1, a2, a3) Source # 

Methods

typeOf :: (a1, a2, a3) -> Type Source #

toValue :: (a1, a2, a3) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4) => IsValue (a1, a2, a3, a4) Source # 

Methods

typeOf :: (a1, a2, a3, a4) -> Type Source #

toValue :: (a1, a2, a3, a4) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5) => IsValue (a1, a2, a3, a4, a5) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5) -> Type Source #

toValue :: (a1, a2, a3, a4, a5) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6) => IsValue (a1, a2, a3, a4, a5, a6) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7) => IsValue (a1, a2, a3, a4, a5, a6, a7) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10, IsValue a11) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10, IsValue a11, IsValue a12) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10, IsValue a11, IsValue a12, IsValue a13) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10, IsValue a11, IsValue a12, IsValue a13, IsValue a14) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) Source #

(IsValue a1, IsValue a2, IsValue a3, IsValue a4, IsValue a5, IsValue a6, IsValue a7, IsValue a8, IsValue a9, IsValue a10, IsValue a11, IsValue a12, IsValue a13, IsValue a14, IsValue a15) => IsValue (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source # 

Methods

typeOf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> Type Source #

toValue :: (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> Value Source #

fromValue :: Value -> Maybe (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) Source #

class IsValue a => IsAtom a where Source #

Atomic types can be used as keys to dictionaries.

Users may not provide new instances of IsAtom because this could allow dictionaries to be created with invalid keys.

Minimal complete definition

toAtom, fromAtom

Methods

toAtom :: a -> Atom Source #

fromAtom :: Atom -> Maybe a Source #

Instances

IsAtom Bool Source # 
IsAtom Double Source # 
IsAtom Int16 Source # 
IsAtom Int32 Source # 
IsAtom Int64 Source # 
IsAtom Word8 Source # 
IsAtom Word16 Source # 
IsAtom Word32 Source # 
IsAtom Word64 Source # 
IsAtom Fd Source # 
IsAtom String Source # 
IsAtom Text Source # 
IsAtom Text Source # 
IsAtom ObjectPath Source # 
IsAtom Signature Source # 

newtype Variant Source #

Variants may contain any other built-in D-Bus value. Besides representing native VARIANT values, they allow type-safe storage and inspection of D-Bus collections.

Constructors

Variant Value 

showThings :: String -> (a -> String) -> String -> [a] -> String Source #

variantType :: Variant -> Type Source #

Every variant is strongly-typed; that is, the type of its contained value is known at all times. This function retrieves that type, so that the correct cast can be used to retrieve the value.

bimap :: Ord k' => (k -> v -> (k', v')) -> Map k v -> Map k' v' Source #

bimapM :: (Monad m, Ord k') => (k -> v -> m (k', v')) -> Map k v -> m (Map k' v') Source #

mapItemType :: (IsValue k, IsValue v) => Map k v -> (Type, Type) Source #

newtype ObjectPath Source #

Object paths are special strings, used to identify a particular object exported from a D-Bus application.

Object paths must begin with a slash, and consist of alphanumeric characters separated by slashes.

See http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-marshaling-object-path for details.

Constructors

ObjectPath String 

newtype ErrorName Source #

Error names are used to identify which type of error was returned from a method call. Error names consist of alphanumeric characters separated by periods.

See http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-error for details.

Constructors

ErrorName String 

newtype BusName Source #

Bus names are used to identify particular clients on the message bus. A bus name may be either unique or well-known, where unique names start with a colon. Bus names consist of alphanumeric characters separated by periods.

See http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus for details.

Constructors

BusName String 

newtype Structure Source #

A D-Bus Structure is a container type similar to Haskell tuples, storing values of any type that is convertable to IsVariant. A Structure may contain up to 255 values.

Most users can use the IsVariant instance for tuples to extract the values of a structure. This type is for very large structures, which may be awkward to work with as tuples.

Constructors

Structure [Value] 

data Array Source #

A D-Bus Array is a container type similar to Haskell lists, storing zero or more values of a single D-Bus type.

Most users can use the IsVariant instance for lists or vectors to extract the values of an array. This type is for advanced use cases, where the user wants to convert array values to Haskell types that are not instances of IsValue.

data Dictionary Source #

A D-Bus Dictionary is a container type similar to Haskell maps, storing zero or more associations between keys and values.

Most users can use the IsVariant instance for maps to extract the values of a dictionary. This type is for advanced use cases, where the user wants to convert dictionary items to Haskell types that are not instances of IsValue.

Constructors

Dictionary Type Type (Map Atom Value) 

newtype Serial Source #

A value used to uniquely identify a particular message within a session. Serials are 32-bit unsigned integers, and eventually wrap.

Constructors

Serial Word32 

firstSerial :: Serial Source #

Get the first serial in the sequence.

nextSerial :: Serial -> Serial Source #

Get the next serial in the sequence. This may wrap around to firstSerial.

forceParse :: String -> (String -> Maybe a) -> String -> a Source #