-- 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