plutarch-1.9.0
Safe HaskellSafe-Inferred
LanguageGHC2021

Plutarch.DataRepr.Internal.Field

Synopsis

PDataField class & deriving utils

class PDataFields (a :: S -> Type) where Source #

Class allowing letFields to work for a PType, usually via PIsDataRepr, but is derived for some other types for convenience.

Minimal complete definition

Nothing

Associated Types

type PFields a :: [PLabeledType] Source #

Fields in HRec bound by letFields

type PFields a = Helper (PInner a)

Methods

ptoFields :: Term s a -> Term s (PDataRecord (PFields a)) Source #

Convert a Term to a PDataList

default ptoFields :: (PDataFields (PInner a), PFields (PInner a) ~ PFields a) => Term s a -> Term s (PDataRecord (PFields a)) Source #

Instances

Instances details
(PIsData a, PDataFields a) => PDataFields (PAsData a) Source # 
Instance details

Defined in Plutarch.DataRepr.Internal.Field

Associated Types

type PFields (PAsData a) :: [PLabeledType] Source #

Methods

ptoFields :: forall (s :: S). Term s (PAsData a) -> Term s (PDataRecord (PFields (PAsData a))) Source #

PDataFields (PDataRecord as) Source # 
Instance details

Defined in Plutarch.DataRepr.Internal.Field

Associated Types

type PFields (PDataRecord as) :: [PLabeledType] Source #

Methods

ptoFields :: forall (s :: S). Term s (PDataRecord as) -> Term s (PDataRecord (PFields (PDataRecord as))) Source #

PDataFields (PDataSum '[as]) Source # 
Instance details

Defined in Plutarch.DataRepr.Internal.Field

Associated Types

type PFields (PDataSum '[as]) :: [PLabeledType] Source #

Methods

ptoFields :: forall (s :: S). Term s (PDataSum '[as]) -> Term s (PDataRecord (PFields (PDataSum '[as]))) Source #

pletFields :: forall fs a s b ps bs. (PDataFields a, ps ~ PFields a, bs ~ Bindings ps fs, BindFields ps bs) => Term s a -> (HRecOf a fs s -> Term s b) -> Term s b Source #

Bind a HRec of named fields containing all the specified fields.

pfield :: forall name b p s a as n. (PDataFields p, as ~ PFields p, n ~ PLabelIndex name as, KnownNat n, a ~ PUnLabel (IndexList n as), PFromDataable a b) => Term s (p :--> b) Source #

Get a single field from a Term.

  • NB*: If you access more than one field from the same value you should use pletFields instead, which will generate the bindings more efficiently.

BindFields class mechanism

class BindFields (ps :: [PLabeledType]) (bs :: [ToBind]) where Source #

Methods

bindFields :: Proxy bs -> Term s (PDataRecord ps) -> TermCont s (HRec (BoundTerms ps bs s)) Source #

Bind all the fields in a PDataList term to a corresponding HList of Terms.

A continuation is returned to enable sharing of the generated bound-variables.

type family Bindings (ps :: [PLabeledType]) (fs :: [Symbol]) :: [ToBind] where ... Source #

Map BindField over [PLabeledType], with Skips removed at tail

Equations

Bindings '[] _ = '[] 
Bindings ((name ':= _) ': ps) fs = BindField name fs ': CutSkip (Bindings ps fs) 

type family BoundTerms ps bs s where ... Source #

Get the Term representations to be bound based on the result of Bindings.

Equations

BoundTerms '[] _ _ = '[] 
BoundTerms _ '[] _ = '[] 
BoundTerms (_ ': ps) ('Skip ': bs) s = BoundTerms ps bs s 
BoundTerms ((name ':= p) ': ps) ('Bind ': bs) s = '(name, Term s (PAsData p)) ': BoundTerms ps bs s 

type family Drop (n :: Nat) (as :: [k]) :: [k] where ... Source #

Drop first n fields of a list

Equations

Drop 0 xs = xs 
Drop n (_ ': xs) = Drop (n - 1) xs 

type HRecOf t fs s = HRec (BoundTerms (PFields t) (Bindings (PFields t) fs) s) Source #

The HRec yielded by 'pletFields @fs t'.

type family PMemberFields t fs s as where ... Source #

Constrain an HRec to contain the specified fields from the given Plutarch type.

Example ===

import qualified GHC.Generics as GHC
import Generics.SOP

import Plutarch.Prelude
import Plutarch.DataRepr

newtype PFooType s = PFooType (Term s (PDataRecord '["frst" ':= PInteger, "scnd" ':= PBool, "thrd" ':= PString]))
  deriving stock (GHC.Generic)
  deriving anyclass (Generic)
  deriving anyclass (PIsDataRepr)
  deriving
    (PlutusType, PIsData, PDataFields, PEq)
    via PIsDataReprInstances PFooType

foo :: PMemberFields PFooType '["scnd", "frst"] s as => HRec as -> Term s PInteger
foo h = pif (getField "scnd" h) (getField "frst" h) 0

Equations

PMemberFields _ '[] _ _ = () 
PMemberFields t (name ': rest) s as = (PMemberField t name s as, PMemberFields t rest s as) 

type family PMemberField t name s as where ... Source #

Single field version of PMemberFields.

Equations

PMemberField t name s as = (IndexLabel name as ~ Term s (PAsData (PLookupLabel name (PFields t))), ElemOf name (Term s (PAsData (PLookupLabel name (PFields t)))) as) 

Re-exports

data HRec as where Source #

Constructors

HNil :: HRec '[] 
HCons :: Labeled name a -> HRec as -> HRec ('(name, a) ': as) 

Instances

Instances details
(IndexLabel name as ~ a, ElemOf name a as, Term s (PAsData b) ~ a, PFromDataable b c) => HasField (name :: Symbol) (HRec as) (Term s c) Source # 
Instance details

Defined in Plutarch.DataRepr.Internal.HList

Methods

getField :: HRec as -> Term s c Source #

newtype Labeled sym a Source #

Constructors

Labeled 

Fields

hrecField :: forall name c as a b s. (ElemOf name a as, Term s (PAsData b) ~ a, PFromDataable b c) => HRec as -> Term s c Source #

Deprecated: please use getField from GHC.Records

Index a HRec with a field in a provided list of data fields. Implicitly unwraps `PAsData a` to a when necessary.

>>> xs = HRec @["x", "y", "z"] (HCons 1 (HCons 2 (HCons 3 HNil)))
>>> hrecField @"y" @["x", "y", "z"] xs
>>> 2