cleff-0.3.2.0: Fast and concise extensible effects
Copyright(c) 2021 Xy Ren
LicenseBSD3
Maintainerxy.r@outlook.com
Stabilityunstable
Portabilitynon-portable (GHC only)
Safe HaskellNone
LanguageHaskell2010

Cleff.Internal.Rec

Description

This module defines an immutable extensible record type, similar to vinyl and data-diverse. However this implementation focuses on fast reads, hence has very different performance characteristics from other libraries:

  • Lookup: Amortized \( O(1) \).
  • Update: \( O(n) \).
  • Shrink: \( O(1) \).
  • Append: \( O(n) \).

This is an internal module and its API may change even between minor versions. Therefore you should be extra careful if you're to depend on this module.

Synopsis

Documentation

newtype HandlerPtr (e :: Effect) Source #

A pointer to an effect handler.

Constructors

HandlerPtr 

Fields

data Rec (es :: [Effect]) Source #

Extensible record type supporting efficient \( O(1) \) reads. The underlying implementation is PrimArray slices.

type family xs ++ ys where ... infixr 5 Source #

Type level list concatenation.

Equations

'[] ++ ys = ys 
(x ': xs) ++ ys = x ': (xs ++ ys) 

Construction

empty :: Rec '[] Source #

Create an empty record. \( O(1) \).

cons :: HandlerPtr e -> Rec es -> Rec (e ': es) Source #

Prepend one entry to the record. \( O(n) \).

concat :: Rec es -> Rec es' -> Rec (es ++ es') Source #

Concatenate two records. \( O(m+n) \).

Deconstruction

class KnownList (es :: [Effect]) Source #

KnownList es means the list es is concrete, i.e. is of the form '[a1, a2, ..., an] instead of a type variable.

Instances

Instances details
KnownList ('[] :: [Effect]) Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyLen :: Int

KnownList es => KnownList (e ': es) Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyLen :: Int

head :: Rec (e ': es) -> HandlerPtr e Source #

Get the head of the record. \( O(1) \).

take :: forall es es'. KnownList es => Rec (es ++ es') -> Rec es Source #

Take elements from the top of the record. \( O(m) \).

tail :: Rec (e ': es) -> Rec es Source #

Slice off one entry from the top of the record. \( O(1) \).

drop :: forall es es'. KnownList es => Rec (es ++ es') -> Rec es' Source #

Slice off several entries from the top of the record. \( O(1) \).

Retrieval and updating

class (e :: Effect) :> (es :: [Effect]) infix 0 Source #

e :> es means the effect e is present in the effect stack es, and therefore can be sended in an Eff es computation.

Instances

Instances details
(TypeError (ElemNotFound e) :: Constraint) => e :> ('[] :: [Effect]) Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyIndex :: Int

e :> es => e :> (e' ': es) Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyIndex :: Int

e :> (e ': es) Source #

The element closer to the head takes priority.

Instance details

Defined in Cleff.Internal.Rec

Methods

reifyIndex :: Int

class KnownList es => Subset (es :: [Effect]) (es' :: [Effect]) Source #

es is a subset of es', i.e. all elements of es are in es'.

Instances

Instances details
Subset ('[] :: [Effect]) es Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyIndices :: [Int]

(Subset es es', e :> es') => Subset (e ': es) es' Source # 
Instance details

Defined in Cleff.Internal.Rec

Methods

reifyIndices :: [Int]

index :: forall e es. e :> es => Rec es -> HandlerPtr e Source #

Get an element in the record. Amortized \( O(1) \).

pick :: forall es es'. Subset es es' => Rec es' -> Rec es Source #

Get a subset of the record. Amortized \( O(m) \).

update :: forall e es. e :> es => HandlerPtr e -> Rec es -> Rec es Source #

Update an entry in the record. \( O(n) \).