extensible-0.4.7.2: Extensible, efficient, optics-friendly data types and effects

Copyright(c) Fumiaki Kinoshita 2017
LicenseBSD3
MaintainerFumiaki Kinoshita <fumiexcel@gmail.com>
Safe HaskellNone
LanguageHaskell2010

Data.Extensible.Field

Contents

Description

Flexible records and variants

Synopsis

Documentation

newtype Field (h :: v -> Type) (kv :: Assoc k v) Source #

A Field h (k ':> v) is h v annotated with the field name k.

Field :: (v -> *) -> Assoc k v -> *

Constructors

Field 

Fields

Instances

Unbox (h (AssocValue k v x)) => Vector Vector (Field k v h x) Source # 

Methods

basicUnsafeFreeze :: PrimMonad m => Mutable Vector (PrimState m) (Field k v h x) -> m (Vector (Field k v h x)) #

basicUnsafeThaw :: PrimMonad m => Vector (Field k v h x) -> m (Mutable Vector (PrimState m) (Field k v h x)) #

basicLength :: Vector (Field k v h x) -> Int #

basicUnsafeSlice :: Int -> Int -> Vector (Field k v h x) -> Vector (Field k v h x) #

basicUnsafeIndexM :: Monad m => Vector (Field k v h x) -> Int -> m (Field k v h x) #

basicUnsafeCopy :: PrimMonad m => Mutable Vector (PrimState m) (Field k v h x) -> Vector (Field k v h x) -> m () #

elemseq :: Vector (Field k v h x) -> Field k v h x -> b -> b #

Unbox (h (AssocValue k v x)) => MVector MVector (Field k v h x) Source # 

Methods

basicLength :: MVector s (Field k v h x) -> Int #

basicUnsafeSlice :: Int -> Int -> MVector s (Field k v h x) -> MVector s (Field k v h x) #

basicOverlaps :: MVector s (Field k v h x) -> MVector s (Field k v h x) -> Bool #

basicUnsafeNew :: PrimMonad m => Int -> m (MVector (PrimState m) (Field k v h x)) #

basicInitialize :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> m () #

basicUnsafeReplicate :: PrimMonad m => Int -> Field k v h x -> m (MVector (PrimState m) (Field k v h x)) #

basicUnsafeRead :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> Int -> m (Field k v h x) #

basicUnsafeWrite :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> Int -> Field k v h x -> m () #

basicClear :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> m () #

basicSet :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> Field k v h x -> m () #

basicUnsafeCopy :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> MVector (PrimState m) (Field k v h x) -> m () #

basicUnsafeMove :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> MVector (PrimState m) (Field k v h x) -> m () #

basicUnsafeGrow :: PrimMonad m => MVector (PrimState m) (Field k v h x) -> Int -> m (MVector (PrimState m) (Field k v h x)) #

(Bits r, FromBits r (h (AssocValue k v x))) => FromBits r (Field k v h x) Source # 

Associated Types

type BitWidth (Field k v h x) :: Nat Source #

Methods

fromBits :: r -> Field k v h x Source #

toBits :: Field k v h x -> r Source #

Wrapper v h => Wrapper (Assoc k v) (Field k v h) Source # 

Associated Types

type Repr (Field k v h) (h :: Field k v h -> *) (v :: Field k v h) :: * Source #

Methods

_Wrapper :: (Functor f, Profunctor p) => Optic' * * p f (h v) (Repr (Field k v h) h v) Source #

Bounded (h (AssocValue k v kv)) => Bounded (Field k v h kv) Source # 

Methods

minBound :: Field k v h kv #

maxBound :: Field k v h kv #

Enum (h (AssocValue k v kv)) => Enum (Field k v h kv) Source # 

Methods

succ :: Field k v h kv -> Field k v h kv #

pred :: Field k v h kv -> Field k v h kv #

toEnum :: Int -> Field k v h kv #

fromEnum :: Field k v h kv -> Int #

enumFrom :: Field k v h kv -> [Field k v h kv] #

enumFromThen :: Field k v h kv -> Field k v h kv -> [Field k v h kv] #

enumFromTo :: Field k v h kv -> Field k v h kv -> [Field k v h kv] #

enumFromThenTo :: Field k v h kv -> Field k v h kv -> Field k v h kv -> [Field k v h kv] #

Eq (h (AssocValue k v kv)) => Eq (Field k v h kv) Source # 

Methods

(==) :: Field k v h kv -> Field k v h kv -> Bool #

(/=) :: Field k v h kv -> Field k v h kv -> Bool #

Floating (h (AssocValue k v kv)) => Floating (Field k v h kv) Source # 

Methods

pi :: Field k v h kv #

exp :: Field k v h kv -> Field k v h kv #

log :: Field k v h kv -> Field k v h kv #

sqrt :: Field k v h kv -> Field k v h kv #

(**) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

logBase :: Field k v h kv -> Field k v h kv -> Field k v h kv #

sin :: Field k v h kv -> Field k v h kv #

cos :: Field k v h kv -> Field k v h kv #

tan :: Field k v h kv -> Field k v h kv #

asin :: Field k v h kv -> Field k v h kv #

acos :: Field k v h kv -> Field k v h kv #

atan :: Field k v h kv -> Field k v h kv #

sinh :: Field k v h kv -> Field k v h kv #

cosh :: Field k v h kv -> Field k v h kv #

tanh :: Field k v h kv -> Field k v h kv #

asinh :: Field k v h kv -> Field k v h kv #

acosh :: Field k v h kv -> Field k v h kv #

atanh :: Field k v h kv -> Field k v h kv #

log1p :: Field k v h kv -> Field k v h kv #

expm1 :: Field k v h kv -> Field k v h kv #

log1pexp :: Field k v h kv -> Field k v h kv #

log1mexp :: Field k v h kv -> Field k v h kv #

Fractional (h (AssocValue k v kv)) => Fractional (Field k v h kv) Source # 

Methods

(/) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

recip :: Field k v h kv -> Field k v h kv #

fromRational :: Rational -> Field k v h kv #

Integral (h (AssocValue k v kv)) => Integral (Field k v h kv) Source # 

Methods

quot :: Field k v h kv -> Field k v h kv -> Field k v h kv #

rem :: Field k v h kv -> Field k v h kv -> Field k v h kv #

div :: Field k v h kv -> Field k v h kv -> Field k v h kv #

mod :: Field k v h kv -> Field k v h kv -> Field k v h kv #

quotRem :: Field k v h kv -> Field k v h kv -> (Field k v h kv, Field k v h kv) #

divMod :: Field k v h kv -> Field k v h kv -> (Field k v h kv, Field k v h kv) #

toInteger :: Field k v h kv -> Integer #

Num (h (AssocValue k v kv)) => Num (Field k v h kv) Source # 

Methods

(+) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

(-) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

(*) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

negate :: Field k v h kv -> Field k v h kv #

abs :: Field k v h kv -> Field k v h kv #

signum :: Field k v h kv -> Field k v h kv #

fromInteger :: Integer -> Field k v h kv #

Ord (h (AssocValue k v kv)) => Ord (Field k v h kv) Source # 

Methods

compare :: Field k v h kv -> Field k v h kv -> Ordering #

(<) :: Field k v h kv -> Field k v h kv -> Bool #

(<=) :: Field k v h kv -> Field k v h kv -> Bool #

(>) :: Field k v h kv -> Field k v h kv -> Bool #

(>=) :: Field k v h kv -> Field k v h kv -> Bool #

max :: Field k v h kv -> Field k v h kv -> Field k v h kv #

min :: Field k v h kv -> Field k v h kv -> Field k v h kv #

Real (h (AssocValue k v kv)) => Real (Field k v h kv) Source # 

Methods

toRational :: Field k v h kv -> Rational #

RealFloat (h (AssocValue k v kv)) => RealFloat (Field k v h kv) Source # 

Methods

floatRadix :: Field k v h kv -> Integer #

floatDigits :: Field k v h kv -> Int #

floatRange :: Field k v h kv -> (Int, Int) #

decodeFloat :: Field k v h kv -> (Integer, Int) #

encodeFloat :: Integer -> Int -> Field k v h kv #

exponent :: Field k v h kv -> Int #

significand :: Field k v h kv -> Field k v h kv #

scaleFloat :: Int -> Field k v h kv -> Field k v h kv #

isNaN :: Field k v h kv -> Bool #

isInfinite :: Field k v h kv -> Bool #

isDenormalized :: Field k v h kv -> Bool #

isNegativeZero :: Field k v h kv -> Bool #

isIEEE :: Field k v h kv -> Bool #

atan2 :: Field k v h kv -> Field k v h kv -> Field k v h kv #

RealFrac (h (AssocValue k v kv)) => RealFrac (Field k v h kv) Source # 

Methods

properFraction :: Integral b => Field k v h kv -> (b, Field k v h kv) #

truncate :: Integral b => Field k v h kv -> b #

round :: Integral b => Field k v h kv -> b #

ceiling :: Integral b => Field k v h kv -> b #

floor :: Integral b => Field k v h kv -> b #

(KnownSymbol k, Wrapper v1 h, Show (Repr v1 h v2)) => Show (Field Symbol v1 h ((:>) Symbol v1 k v2)) Source #

Shows in field @= value style instead of the derived one.

Methods

showsPrec :: Int -> Field Symbol v1 h ((Symbol :> v1) k v2) -> ShowS #

show :: Field Symbol v1 h ((Symbol :> v1) k v2) -> String #

showList :: [Field Symbol v1 h ((Symbol :> v1) k v2)] -> ShowS #

Generic (Field k v h kv) Source # 

Associated Types

type Rep (Field k v h kv) :: * -> * #

Methods

from :: Field k v h kv -> Rep (Field k v h kv) x #

to :: Rep (Field k v h kv) x -> Field k v h kv #

Semigroup (h (AssocValue k v kv)) => Semigroup (Field k v h kv) Source # 

Methods

(<>) :: Field k v h kv -> Field k v h kv -> Field k v h kv #

sconcat :: NonEmpty (Field k v h kv) -> Field k v h kv #

stimes :: Integral b => b -> Field k v h kv -> Field k v h kv #

Monoid (h (AssocValue k v kv)) => Monoid (Field k v h kv) Source # 

Methods

mempty :: Field k v h kv #

mappend :: Field k v h kv -> Field k v h kv -> Field k v h kv #

mconcat :: [Field k v h kv] -> Field k v h kv #

Arbitrary (h (AssocValue k v kv)) => Arbitrary (Field k v h kv) Source # 

Methods

arbitrary :: Gen (Field k v h kv) #

shrink :: Field k v h kv -> [Field k v h kv] #

Hashable (h (AssocValue k v kv)) => Hashable (Field k v h kv) Source # 

Methods

hashWithSalt :: Int -> Field k v h kv -> Int #

hash :: Field k v h kv -> Int #

ToJSON (h (AssocValue k v kv)) => ToJSON (Field k v h kv) Source # 

Methods

toJSON :: Field k v h kv -> Value #

toEncoding :: Field k v h kv -> Encoding #

toJSONList :: [Field k v h kv] -> Value #

toEncodingList :: [Field k v h kv] -> Encoding #

FromJSON (h (AssocValue k v kv)) => FromJSON (Field k v h kv) Source # 

Methods

parseJSON :: Value -> Parser (Field k v h kv) #

parseJSONList :: Value -> Parser [Field k v h kv] #

Storable (h (AssocValue k v kv)) => Storable (Field k v h kv) Source # 

Methods

sizeOf :: Field k v h kv -> Int #

alignment :: Field k v h kv -> Int #

peekElemOff :: Ptr (Field k v h kv) -> Int -> IO (Field k v h kv) #

pokeElemOff :: Ptr (Field k v h kv) -> Int -> Field k v h kv -> IO () #

peekByteOff :: Ptr b -> Int -> IO (Field k v h kv) #

pokeByteOff :: Ptr b -> Int -> Field k v h kv -> IO () #

peek :: Ptr (Field k v h kv) -> IO (Field k v h kv) #

poke :: Ptr (Field k v h kv) -> Field k v h kv -> IO () #

FromField (h (AssocValue k v kv)) => FromField (Field k v h kv) Source # 

Methods

parseField :: Field -> Parser (Field k v h kv) #

ToField (h (AssocValue k v kv)) => ToField (Field k v h kv) Source # 

Methods

toField :: Field k v h kv -> Field #

NFData (h (AssocValue k v kv)) => NFData (Field k v h kv) Source # 

Methods

rnf :: Field k v h kv -> () #

Unbox (h (AssocValue k v x)) => Unbox (Field k v h x) Source # 
data MVector s (Field k v h x) Source # 
data MVector s (Field k v h x) = MV_Field (MVector s (h (AssocValue k v x)))
type Repr (Assoc k v) (Field k v h) kv Source # 
type Repr (Assoc k v) (Field k v h) kv = Repr v h (AssocValue k v kv)
type Rep (Field k v h kv) Source # 
type Rep (Field k v h kv) = D1 * (MetaData "Field" "Data.Extensible.Field" "extensible-0.4.7.2-7kfLsNOFubHGh4xGyZYKUH" True) (C1 * (MetaCons "Field" PrefixI True) (S1 * (MetaSel (Just Symbol "getField") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * (h (AssocValue k v kv)))))
data Vector (Field k v h x) Source # 
data Vector (Field k v h x) = V_Field (Vector (h (AssocValue k v x)))
type BitWidth (Field k v h x) Source # 
type BitWidth (Field k v h x) = BitWidth (h (AssocValue k v x))

(@=) :: Wrapper h => FieldName k -> Repr h v -> Field h (k :> v) infix 1 Source #

Annotate a value by the field name.

foo :: Record '["num" >: Int, "str" >: String]
foo = #num = 42
  <: #str = "foo"
  <: nil

(<@=>) :: (Functor f, Wrapper h) => FieldName k -> f (Repr h v) -> Comp f (Field h) (k :> v) infix 1 Source #

Lifted (@=) foo :: IO (Record '["num" >: Int, "str" >: String]) foo = hsequence $ #num <=> readLn #str <@= getLine <: nil @

(@:>) :: FieldName k -> h v -> Field h (k :> v) infix 1 Source #

Annotate a value by the field name without Wrapper.

(@==) :: FieldName (k :: Symbol) -> v -> Field Identity (k :> v) infix 1 Source #

Kind-monomorphic, unwrapped version of ('=')@

type FieldOptic k = forall kind. forall f p t xs (h :: kind -> Type) (v :: kind). (Extensible f p t, ExtensibleConstr t (Field h) xs (k :> v), Associate k v xs, Labelling k p, Wrapper h) => Optic' p f (t (Field h) xs) (Repr h v) Source #

FieldOptic s is a type of optics that points a field/constructor named s.

The yielding fields can be Lenses for Records and Prisms for Variants.

FieldOptic "foo" = Associate "foo" a xs => Lens' (Record xs) a
FieldOptic "foo" = Associate "foo" a xs => Prism' (Variant xs) a

FieldOptics can be generated using mkField defined in the Data.Extensible.TH module.

type FieldName k = Optic' (LabelPhantom k) Proxy (Inextensible (Field Proxy) '[k :> ()]) () Source #

When you see this type as an argument, it expects a FieldLens. This type is used to resolve the name of the field internally.

liftField :: (g (AssocValue kv) -> h (AssocValue kv)) -> Field g kv -> Field h kv Source #

Lift a function for the content.

liftField2 :: (f (AssocValue kv) -> g (AssocValue kv) -> h (AssocValue kv)) -> Field f kv -> Field g kv -> Field h kv Source #

Lift a function for the content.

Records and variants

type RecordOf h = (:*) (Field h) Source #

The type of records which contain several fields.

RecordOf :: (v -> *) -> [Assoc k v] -> *

type Record = RecordOf Identity Source #

Simple record

emptyRecord :: Record '[] Source #

An empty Record.

type VariantOf h = (:|) (Field h) Source #

The dual of RecordOf

VariantOf :: (v -> *) -> [Assoc k v] -> *

type Variant = VariantOf Identity Source #

Simple variant

Matching

matchWithField :: (forall x. f x -> g x -> r) -> RecordOf f xs -> VariantOf g xs -> r Source #

Select a corresponding field of a variant.

matchField :: RecordOf (Match h r) xs -> VariantOf h xs -> r Source #

Pattern matching on a Variant

Key / value

type family AssocKey (kv :: Assoc k v) :: k where ... Source #

Take the type of the key

Equations

AssocKey (k :> v) = k 

type family AssocValue (kv :: Assoc k v) :: v where ... Source #

Take the type of the value

Equations

AssocValue (k :> v) = v 

class (pk (AssocKey kv), pv (AssocValue kv)) => KeyValue pk pv kv Source #

Combined constraint for Assoc

Instances

(pk k2, pv v2) => KeyValue k1 v1 pk pv ((:>) k1 v1 k2 v2) Source # 

proxyAssocKey :: proxy kv -> Proxy (AssocKey kv) Source #

Proxy-level AssocKey. This is useful when using symbolVal.

proxyAssocValue :: proxy kv -> Proxy (AssocValue kv) Source #

Proxy-level AssocKey. This is useful when using symbolVal.

class pk (AssocKey kv) => KeyIs pk kv Source #

Combined constraint for Assoc

Instances

pk k2 => KeyIs k1 v1 pk ((:>) k1 v1 k2 v2) Source # 

class pv (AssocValue kv) => ValueIs pv kv Source #

Combined constraint for Assoc

Instances

pv v2 => ValueIs k1 v1 pv ((:>) k1 v1 k2 v2) Source # 

Internal

data LabelPhantom s a b Source #

A ghostly type which spells the field name

Instances

Profunctor (LabelPhantom k * * s) Source # 

Methods

dimap :: (a -> b) -> (c -> d) -> LabelPhantom k * * s b c -> LabelPhantom k * * s a d #

lmap :: (a -> b) -> LabelPhantom k * * s b c -> LabelPhantom k * * s a c #

rmap :: (b -> c) -> LabelPhantom k * * s a b -> LabelPhantom k * * s a c #

(#.) :: Coercible * c b => (b -> c) -> LabelPhantom k * * s a b -> LabelPhantom k * * s a c #

(.#) :: Coercible * b a => LabelPhantom k * * s b c -> (a -> b) -> LabelPhantom k * * s a c #

type family Labelling s p :: Constraint where ... Source #

Signifies a field name internally

Equations

Labelling s (LabelPhantom t) = s ~ t 
Labelling s p = () 

data Inextensible (h :: k -> Type) (xs :: [k]) Source #

The trivial inextensible data type

Instances

(Functor f, Profunctor p) => Extensible k f p (Inextensible k) Source # 

Associated Types

type ExtensibleConstr f (t :: (f -> *) -> [f] -> *) (h :: f -> *) (xs :: [f]) (x :: f) :: Constraint Source #

Methods

pieceAt :: ExtensibleConstr f t h xs x => Membership f xs x -> Optic' * * (Inextensible k) p (t h xs) (h x) Source #

type ExtensibleConstr k (Inextensible k) h xs x Source # 
type ExtensibleConstr k (Inextensible k) h xs x = ()