Copyright | (c) Fumiaki Kinoshita 2018 |
---|---|

License | BSD3 |

Maintainer | Fumiaki Kinoshita <fumiexcel@gmail.com> |

Safe Haskell | None |

Language | Haskell2010 |

Mutable structs

## Synopsis

- data Struct s (h :: k -> Type) (xs :: [k])
- set :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> h x -> m ()
- get :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> m (h x)
- new :: forall h m xs. (PrimMonad m, Generate xs) => (forall x. Membership xs x -> h x) -> m (Struct (PrimState m) h xs)
- newRepeat :: forall h m xs. (PrimMonad m, Generate xs) => (forall x. h x) -> m (Struct (PrimState m) h xs)
- newFor :: forall proxy c h m xs. (PrimMonad m, Forall c xs) => proxy c -> (forall x. c x => Membership xs x -> h x) -> m (Struct (PrimState m) h xs)
- newFromHList :: forall h m xs. PrimMonad m => HList h xs -> m (Struct (PrimState m) h xs)
- data WrappedPointer s h a where
- WrappedPointer :: !(Struct s h xs) -> !(Membership xs x) -> WrappedPointer s h (Repr h x)

- (-$>) :: forall k h xs v s. Lookup xs k v => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k :> v))
- atomicModify :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> (h x, a)) -> m a
- atomicModify' :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> (h x, a)) -> m a
- atomicModify_ :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> h x) -> m (h x)
- atomicModify'_ :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> h x) -> m (h x)
- data (s :: [k]) :& (h :: k -> Type)
- type (:*) h xs = xs :& h
- unsafeFreeze :: PrimMonad m => Struct (PrimState m) h xs -> m (xs :& h)
- newFrom :: forall g h m xs. PrimMonad m => (xs :& g) -> (forall x. Membership xs x -> g x -> h x) -> m (Struct (PrimState m) h xs)
- hlookup :: Membership xs x -> (xs :& h) -> h x
- hlength :: (xs :& h) -> Int
- type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ...
- happend :: (xs :& h) -> (ys :& h) -> (xs ++ ys) :& h
- hfoldrWithIndex :: (forall x. Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r
- thaw :: PrimMonad m => (xs :& h) -> m (Struct (PrimState m) h xs)
- hfrozen :: (forall s. ST s (Struct s h xs)) -> xs :& h
- hmodify :: (forall s. Struct s h xs -> ST s ()) -> (xs :& h) -> xs :& h
- toHList :: forall h xs. (xs :& h) -> HList h xs

# Mutable struct

set :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> h x -> m () Source #

Write a value in a `Struct`

.

get :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> m (h x) Source #

Read a value from a `Struct`

.

new :: forall h m xs. (PrimMonad m, Generate xs) => (forall x. Membership xs x -> h x) -> m (Struct (PrimState m) h xs) Source #

Create a new `Struct`

using the supplied initializer.

newRepeat :: forall h m xs. (PrimMonad m, Generate xs) => (forall x. h x) -> m (Struct (PrimState m) h xs) Source #

Create a `Struct`

full of the specified value.

newFor :: forall proxy c h m xs. (PrimMonad m, Forall c xs) => proxy c -> (forall x. c x => Membership xs x -> h x) -> m (Struct (PrimState m) h xs) Source #

Create a new `Struct`

using the supplied initializer with a context.

newFromHList :: forall h m xs. PrimMonad m => HList h xs -> m (Struct (PrimState m) h xs) Source #

Create a new `Struct`

from an `HList`

.

data WrappedPointer s h a where Source #

A pointer to an element in a `Struct`

.

WrappedPointer :: !(Struct s h xs) -> !(Membership xs x) -> WrappedPointer s h (Repr h x) |

## Instances

(s ~ RealWorld, Wrapper h) => HasSetter (WrappedPointer s h a) a Source # | |

Defined in Data.Extensible.Struct ($=) :: MonadIO m => WrappedPointer s h a -> a -> m () # | |

(s ~ RealWorld, Wrapper h) => HasGetter (WrappedPointer s h a) a Source # | |

Defined in Data.Extensible.Struct get :: MonadIO m => WrappedPointer s h a -> m a # | |

(s ~ RealWorld, Wrapper h) => HasUpdate (WrappedPointer s h a) a a Source # | |

Defined in Data.Extensible.Struct ($~) :: MonadIO m => WrappedPointer s h a -> (a -> a) -> m () # ($~!) :: MonadIO m => WrappedPointer s h a -> (a -> a) -> m () # |

(-$>) :: forall k h xs v s. Lookup xs k v => Struct s h xs -> Proxy k -> WrappedPointer s h (Repr h (k :> v)) Source #

Get a `WrappedPointer`

from a name.

## Atomic operations

atomicModify :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> (h x, a)) -> m a Source #

Atomically modify an element in a `Struct`

.

atomicModify' :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> (h x, a)) -> m a Source #

Strict version of `atomicModify`

.

atomicModify_ :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> h x) -> m (h x) Source #

Apply a function to an element atomically.

atomicModify'_ :: PrimMonad m => Struct (PrimState m) h xs -> Membership xs x -> (h x -> h x) -> m (h x) Source #

Strict version of `atomicModify_`

.

# Immutable product

data (s :: [k]) :& (h :: k -> Type) Source #

The type of extensible products.

(:&) :: [k] -> (k -> Type) -> Type

## Instances

newFrom :: forall g h m xs. PrimMonad m => (xs :& g) -> (forall x. Membership xs x -> g x -> h x) -> m (Struct (PrimState m) h xs) Source #

Create a new `Struct`

using the contents of a product.

hlookup :: Membership xs x -> (xs :& h) -> h x Source #

Get an element in a product.

type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ... infixr 5 Source #

Concatenate type level lists

hfoldrWithIndex :: (forall x. Membership xs x -> h x -> r -> r) -> r -> (xs :& h) -> r Source #

Right-associative fold of a product.

thaw :: PrimMonad m => (xs :& h) -> m (Struct (PrimState m) h xs) Source #

Create a new `Struct`

from a product.