úÎM@G{,      !"#$%&'()*+(c) Atze van der Ploeg 2013 BSD-styleatzeus@gmail.org expirimentalNone !"&'()23468<=FHJKM#,there doesn't seem to be a ( =.?) :: Symbol -H Symbol -> Bool, so here it is in terms of other ghc-7.8 type functionsIf the constaint c# holds for all elements in the row r1, then the methods in this class are available.Given a default value a, wherear can be instantiated to each type in the row, create a new record in which all elements carry this default value.Given a function (a -> b) where aƒ can be instantiated to each type in the row, apply the function to each element in the record and collect the result in a list.Given a function  (a -> a -> b) where aÀ can be instantiated to each type of the row, apply the function to each pair of values that can be obtained by indexing the two records with the same label and collect the result in a list.-A witness of a constraint. For use like this %rinit (CWit :: CWit Bounded) minBound @Apply a (typelevel) operation to a row. Type level operation of + %Type level datakind corresponding to A. Here we provide a datatype for denoting row operations. Use  / to actually apply the type level operation.]This allows us to chain type level operations with nicer syntax. For example we can write: O"p" ::<-| "z" :| RUp :| "z" ::= Bool :| "x" ::= Double :| "y" ::= Char :| EmptyAs the type of the expression: Cp :<-| z .| y :<- 'b' .| z :!= False .| x := 2 .| y := 'a' .| empty7Without this sugar, we would have written it like this: J Rename "p" "z" (Extend "z" Bool (Extend x Double (Extend "x" Int Empty)))"Of course, we can also just write: 7"p" ::= Bool :| "x" ::= Double :| "y" ::= Int :| EmptyEinstead, doing the computation ourselves, or even let the type infer. RUpType level equivalent of  . Is the identity Row Operation.::=Type level equivalent of . Row extension. Sugar for .::<-|Type level equivalent of  . Row label renaming. Sugar for .?Here we provide a datatype for denoting record operations. Use +% to actually apply the operations.RThis allows us to chain operations with nicer syntax. For example we can write: Cp :<-| z .| y :<- 'b' .| z :!= False .| x := 2 .| y := 'a' .| emptyWhich results in: { p=False, x=2, y='b' }7Without this sugar, we would have written it like this: S rename z p $ update y 'b' $ extendUnique z False $ extend x 2 $ extend y 'a' empty :<-Record update. Sugar for $.:=Record extension. Sugar for ".:!=/Record extension, without shadowing. Sugar for #.:<-|!Record label renaming. Sugar for %.:<-!!Record label renaming. Sugar for &.- Alias for  (r :! l) ~ aN. It is a class rather than an alias, so that it can be partially appliced.. Alias for N. It is a class rather than an alias, so that it can be partially appliced./&A constraint not constraining anythingType level operation of *Type level operation of )Type level operation of (Type level operation of 'Type level operation of % and &Type level operations of " and #Type level variant of !‘The kind of rows. This type is only used as a datakind. A row is a typelevel entity telling us which symbols are associated with which types.A record with row r.CAre the two rows disjoint? (i.e. their sets of labels are disjoint)8Does the row lack (i.e. it has not) the specified label?A label !The empty record"Record extension. The row may already contain the label, in which case the origin value can be obtained after restriction (() with the label.#LRecord extension without shadowing. The row may not already contain label l.$+Update the value associated with the label.%‚Rename a label. The row may already contain the new label , in which case the origin value can be obtained after restriction (() with the new label.&>Rename a label. The row may not already contain the new label.'Record selection(7Record restriction. Delete the label l from the record.)Record union (not commutative)*#Record disjoint union (commutative)+Apply an operation to a record.p,0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV -./WXYZ !"#$%&'()*+[\]^_`abcdefghijklmnop,  !"#$%&'()*+, !"#%&($')* + M,0123546789:;<=>@?ABCDEFGHIJKLMNOPQRSTUV  -./WXYZ !"#$%&'()*+[\]^_`abcdefghijklmnop   (+q      !"##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW XYZZ[\]^_`abcdefghijklmnopq CTRex-0.6Data.OpenRecordsbase GHC.TypeLits KnownSymbolFWitForallriniteraseeraseZipCWitLabelslabels:|RowOp::<-|::=RUpRecOp:<-!:<-|:!=:=:<-:+:++:-:!RenameExtendEmptyRowRecDisjoint:\Labelemptyextend extendUniqueupdaterename renameUnique.!.-.++.+.|<=.?HasTypeLacksNoConstr DisjointZ DisjointRIfteD DisjointErr Duplicate IsDisjointMergeLacksRLacksPRemoveGet NoSuchFieldIfteInjectUniqueLabelNotUnique LabelUniqueLT:->RZiptRZipprzip'RowZipRZiprzipRMapcRMapprmapc'RowMapCMapCrmapcRowMapxRMrmap'RowMapMaprmapRORHideTypeunsafeInjectFront $fBoundedRec$fOrdRec$fEqRec $fShowRec $fRZipt:: $fRZipt[][] $fRowZipRR $fForallRc $fForallRc0 $fRMapccf: $fRMapccf[] $fRowMapCcfR $fRowMapxf: $fRowMapxf[] $fRowMapfR $fLabelsR $fLabelsR0 $fHasTypelar $fLackslr $fNoConstrka $fShowLabel