3{-# LANGUAGE PatternSynonyms #-}
4{-# LANGUAGE TypeApplications #-}
18import Control.Lens (coerced, (&), (.~), (^.))
19import qualified "generic-lens" Data.Generics.Product.Fields as GL
20import qualified "generic-optics" Data.Generics.Product.Fields as GO
21import qualified "generic-lens" Data.Generics.Wrapped as GL
22import qualified "generic-optics" Data.Generics.Wrapped as GO
26import GHC.OverloadedLabels
30import JRec.Internal (Rec, (:=) (..))
31import qualified JRec.Internal as R
35----------------------------------------------------------------------------
37----------------------------------------------------------------------------
39unField :: field ~ field' => R.FldProxy field -> (field' R.:= value) -> value
40unField _ (_ R.:= value) = value
42----------------------------------------------------------------------------
44----------------------------------------------------------------------------
46-- Appends records, without removing duplicates.
48-- O(n + m) type check complexity.
50-- FIXME: See spec for a bug when there are duplicates.
53 res ~ R.RecAppend lhs rhs =>
59-- Merges records, removing duplicates
61-- Left-biased. Does not sort.
63-- O(n * m) type check complexity.
66 ( KnownNat (R.RecSize lhs),
67 KnownNat (R.RecSize rhs),
68 KnownNat (R.RecSize res),
69 res ~ R.Union lhs rhs,
70 R.RecCopy lhs lhs res,
78-- | Insert a field into a record that does not already contain it
80-- O(n) type check complexity.
82 forall label value lts res.
83 ( KnownNat (1 + R.RecSize lts),
84 KnownNat (R.RecSize lts),
86 R.RecCopy lts lts res,
87 res ~ ((label := value) : lts),
88 R.RemoveAccessTo label lts ~ lts
93insert = R.combine . Rec
95-- | Insert a field into a record. Set it if it already exists
97-- O(n) type check complexity.
99 forall label value rhs res.
100 ( KnownNat (R.RecSize rhs),
101 KnownNat (R.RecSize res),
102 KnownNat (R.RecTyIdxH 0 label res),
104 value ~ R.RecTy label res,
105 R.Reverse (R.Insert (label := value) (R.Reverse rhs)) ~ res,
106 R.RecCopy rhs rhs res
111insertOrSet = R.insert
113----------------------------------------------------------------------------
115----------------------------------------------------------------------------
117type Sel name value = S1 ('MetaSel ('Just name) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 value)
119type family Sels fields where
121 Sels '[name R.:= value] = Sel name value
122 Sels ((name R.:= value) ': xs) = Sel name value :*: Sels xs
124type RecordRep fields =
126 ('MetaData "Record" "Rec" "" 'False)
128 ('MetaCons "Record" 'PrefixI 'True)
134 (R.FromNative (RecordRep fields) fields, R.ToNative (RecordRep fields) fields) =>
140 from r = R.toNative' r
141 to rep = R.fromNative' rep
144----------------------------------------------------------------------------
146----------------------------------------------------------------------------
148instance {-# OVERLAPPING #-} (R.Set field fields a' ~ fields', R.Set field fields' a ~ fields, R.Has field fields a, R.Has field fields' a') => GL.HasField field (Rec fields) (Rec fields') a a' where
149 field = R.lens (R.FldProxy @field)
151instance {-# OVERLAPPING #-} (R.Set field fields a ~ fields, R.Has field fields a) => GL.HasField' field (Rec fields) a where
152 field' = R.lens (R.FldProxy @field)
154----------------------------------------------------------------------------
156----------------------------------------------------------------------------
158instance {-# OVERLAPPING #-} (R.Set field fields a' ~ fields', R.Set field fields' a ~ fields, R.Has field fields a, R.Has field fields' a') => GO.HasField field (Rec fields) (Rec fields') a a' where
159 field = R.opticLens (R.FldProxy @field)
161instance {-# OVERLAPPING #-} (R.Set field fields a ~ fields, R.Has field fields a) => GO.HasField' field (Rec fields) a where
162 field' = R.opticLens (R.FldProxy @field)
165 ( RecTuple tuple fields
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list