-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Supercharged anonymous records -- -- Anonymous records with various useful utilities @package superrecord @version 0.1.0.0 module SuperRecord -- | Field named l labels value of type t adapted from -- the awesome labels package. Example: (#name := "Chris") :: -- ("name" := String) data (:=) label value (:=) :: FldProxy label -> !value -> (:=) label value -- | The core record type. data Rec (lts :: [*]) -- | An empty record rnil :: Rec '[] -- | Prepend a record entry to a record Rec rcons :: forall l t lts s. (RecSize lts ~ s, KnownNat s) => l := t -> Rec lts -> Rec ((l := t) : lts) -- | Alias for rcons (&) :: forall l t lts s. (RecSize lts ~ s, KnownNat s) => l := t -> Rec lts -> Rec ((l := t) : lts) infixr 5 & -- | State that a record contains a label. Leave idx an s free variables, -- used internally type Has l lts idx s v = (RecTyIdxH 0 l lts ~ idx, RecIdxTyH idx 0 lts ~ v, KnownNat idx, RecSize lts ~ s, KnownNat s) -- | Get an existing record field get :: forall l v lts idx s. (Has l lts idx s v) => FldProxy l -> Rec lts -> v -- | Alias for get (&.) :: forall l v lts idx s. (Has l lts idx s v) => Rec lts -> FldProxy l -> v infixl 3 &. -- | Update an existing record field set :: forall l v lts idx s. (Has l lts idx s v) => FldProxy l -> v -> Rec lts -> Rec lts class SetPath k x -- | Perform a deep update, setting the key along the path to the desired -- value setPath :: SetPath k x => SPath k -> RecDeepTy k x -> x -> x -- | Path to the key that should be updated data SPath (t :: [Symbol]) [SCons] :: FldProxy l -> SPath ls -> SPath (l : ls) [SNil] :: SPath '[] -- | Alias for SCons (&:) :: FldProxy l -> SPath ls -> SPath (l : ls) infixr 8 &: -- | Alias for SNil snil :: SPath '[] -- | Apply a function to each key element pair for a record reflectRec :: forall c r lts. (RecApply lts lts c) => Proxy c -> (forall a. c a => String -> a -> r) -> Rec lts -> [r] -- | Machinery needed to implement reflectRec class RecApply (rts :: [*]) (lts :: [*]) c recApply :: RecApply rts lts c => (forall a. Dict (c a) -> String -> a -> r) -> Rec rts -> Proxy lts -> [r] -- | Convert all elements of a record to a String showRec :: forall lts. (RecApply lts lts Show) => Rec lts -> [(String, String)] -- | Get keys of a record on value and type level class RecKeys (lts :: [*]) where type RecKeysT lts :: [Symbol] where { type family RecKeysT lts :: [Symbol]; } recKeys :: RecKeys lts => t lts -> [String] -- | Machinery to implement equality class RecEq (rts :: [*]) (lts :: [*]) recEq :: RecEq rts lts => Rec rts -> Rec rts -> Proxy lts -> Bool recToValue :: forall lts. (RecApply lts lts ToJSON) => Rec lts -> Value recToEncoding :: forall lts. (RecApply lts lts ToJSON) => Rec lts -> Encoding recJsonParser :: forall lts s. (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => Value -> Parser (Rec lts) -- | Machinery to implement parseJSON class RecJsonParse (lts :: [*]) recJsonParse :: RecJsonParse lts => Int -> Object -> Parser (Rec lts) -- | Machinery for NFData class RecNfData (lts :: [*]) (rts :: [*]) recNfData :: RecNfData lts rts => Proxy lts -> Rec rts -> () -- | A proxy witness for a label. Very similar to Proxy, but needed -- to implement a non-orphan IsLabel instance data FldProxy (t :: Symbol) FldProxy :: FldProxy instance GHC.Classes.Ord (SuperRecord.FldProxy t) instance GHC.Classes.Eq (SuperRecord.FldProxy t) instance GHC.Read.Read (SuperRecord.FldProxy t) instance GHC.Show.Show (SuperRecord.FldProxy t) instance GHC.Classes.Eq value => GHC.Classes.Eq (label SuperRecord.:= value) instance GHC.Classes.Ord value => GHC.Classes.Ord (label SuperRecord.:= value) instance GHC.Show.Show t => GHC.Show.Show (l SuperRecord.:= t) instance l ~ l' => GHC.OverloadedLabels.IsLabel l (SuperRecord.FldProxy l') instance SuperRecord.RecApply lts lts GHC.Show.Show => GHC.Show.Show (SuperRecord.Rec lts) instance SuperRecord.RecEq lts lts => GHC.Classes.Eq (SuperRecord.Rec lts) instance SuperRecord.RecApply lts lts Data.Aeson.Types.ToJSON.ToJSON => Data.Aeson.Types.ToJSON.ToJSON (SuperRecord.Rec lts) instance (SuperRecord.RecSize lts ~ s, GHC.TypeLits.KnownNat s, SuperRecord.RecJsonParse lts) => Data.Aeson.Types.FromJSON.FromJSON (SuperRecord.Rec lts) instance SuperRecord.RecNfData lts lts => Control.DeepSeq.NFData (SuperRecord.Rec lts) instance SuperRecord.SetPath '[] v instance (SuperRecord.SetPath more v, SuperRecord.Has l lts idx s v, SuperRecord.RecDeepTy (l : more) (SuperRecord.Rec lts) ~ SuperRecord.RecDeepTy more v) => SuperRecord.SetPath (l : more) (SuperRecord.Rec lts) instance SuperRecord.RecKeys '[] instance (GHC.TypeLits.KnownSymbol l, SuperRecord.RecKeys lts) => SuperRecord.RecKeys (l SuperRecord.:= t : lts) instance SuperRecord.RecApply rts '[] c instance (GHC.TypeLits.KnownSymbol l, SuperRecord.RecApply rts (SuperRecord.RemoveAccessTo l lts) c, SuperRecord.Has l rts idx s v, c v) => SuperRecord.RecApply rts (l SuperRecord.:= t : lts) c instance SuperRecord.RecEq rts '[] instance (SuperRecord.RecEq rts (SuperRecord.RemoveAccessTo l lts), SuperRecord.Has l rts idx s v, GHC.Classes.Eq v) => SuperRecord.RecEq rts (l SuperRecord.:= t : lts) instance SuperRecord.RecJsonParse '[] instance (GHC.TypeLits.KnownSymbol l, Data.Aeson.Types.FromJSON.FromJSON t, SuperRecord.RecJsonParse lts, SuperRecord.RecSize lts ~ s, GHC.TypeLits.KnownNat s) => SuperRecord.RecJsonParse (l SuperRecord.:= t : lts) instance SuperRecord.RecNfData '[] rts instance (SuperRecord.Has l rts idx s v, Control.DeepSeq.NFData v, SuperRecord.RecNfData (SuperRecord.RemoveAccessTo l lts) rts) => SuperRecord.RecNfData (l SuperRecord.:= t : lts) rts