superrecord-0.5.1.0: Supercharged anonymous records

Safe HaskellNone
LanguageHaskell2010

SuperRecord.Variant

Synopsis

Documentation

data Variant (opts :: [*]) Source #

A variant is used to express that a values type is of any of the types tracked in the type level list.

Instances
(Eq t, Eq (Variant ts)) => Eq (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

(==) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

(/=) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

Eq (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

(==) :: Variant [] -> Variant [] -> Bool #

(/=) :: Variant [] -> Variant [] -> Bool #

(Ord t, Ord (Variant ts)) => Ord (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

compare :: Variant (t ': ts) -> Variant (t ': ts) -> Ordering #

(<) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

(<=) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

(>) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

(>=) :: Variant (t ': ts) -> Variant (t ': ts) -> Bool #

max :: Variant (t ': ts) -> Variant (t ': ts) -> Variant (t ': ts) #

min :: Variant (t ': ts) -> Variant (t ': ts) -> Variant (t ': ts) #

Ord (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

compare :: Variant [] -> Variant [] -> Ordering #

(<) :: Variant [] -> Variant [] -> Bool #

(<=) :: Variant [] -> Variant [] -> Bool #

(>) :: Variant [] -> Variant [] -> Bool #

(>=) :: Variant [] -> Variant [] -> Bool #

max :: Variant [] -> Variant [] -> Variant [] #

min :: Variant [] -> Variant [] -> Variant [] #

(Show t, Show (Variant ts)) => Show (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

showsPrec :: Int -> Variant (t ': ts) -> ShowS #

show :: Variant (t ': ts) -> String #

showList :: [Variant (t ': ts)] -> ShowS #

Show (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

showsPrec :: Int -> Variant [] -> ShowS #

show :: Variant [] -> String #

showList :: [Variant []] -> ShowS #

(ToJSON t, ToJSON (Variant ts)) => ToJSON (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

toJSON :: Variant (t ': ts) -> Value #

toEncoding :: Variant (t ': ts) -> Encoding #

toJSONList :: [Variant (t ': ts)] -> Value #

toEncodingList :: [Variant (t ': ts)] -> Encoding #

ToJSON (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

(FromJSON t, FromJSON (Variant ts)) => FromJSON (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

parseJSON :: Value -> Parser (Variant (t ': ts)) #

parseJSONList :: Value -> Parser [Variant (t ': ts)] #

FromJSON (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

(NFData t, NFData (Variant ts)) => NFData (Variant (t ': ts)) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

rnf :: Variant (t ': ts) -> () #

NFData (Variant ([] :: [Type])) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

rnf :: Variant [] -> () #

type family VariantMember a opts where ... Source #

Equations

VariantMember x (x ': xs) = True ~ True 
VariantMember x (y ': ys) = VariantMember x ys 

type VariantPos a opts = VariantPosHelper 1 a opts Source #

emptyVariant :: Variant '[] Source #

An empty Variant, equivalent to `()`

toVariant :: forall opts a pos. (KnownNat pos, VariantPos a opts ~ pos, VariantMember a opts) => a -> Variant opts Source #

Convert a usual Haskell type into a Variant. It's very useful to provide type signatures for the Variants.

fromVariant :: forall opts a pos. (KnownNat pos, VariantPos a opts ~ pos, VariantMember a opts) => Variant opts -> Maybe a Source #

Convert a Variant back to a usual Haskell type, returning Nothing if the variant is not of the desired type.

data VariantMatch r ts where Source #

Constructors

VariantCase :: (t -> r) -> VariantMatch r ts -> VariantMatch r (t ': ts) 
VariantEnd :: VariantMatch r '[] 
VariantWildCard :: r -> VariantMatch r ts 

class VariantMatcher r opts where Source #

Pattern matching helper with totality check. Note that the performance of this pattern match is roughly like a normal pattern match. (See benchmarks)

Methods

variantMatch :: Variant opts -> VariantMatch r opts -> r Source #

Instances
VariantMatcher r ([] :: [Type]) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

variantMatch :: Variant [] -> VariantMatch r [] -> r Source #

VariantMatcher r ts => VariantMatcher r (t ': ts) Source # 
Instance details

Defined in SuperRecord.Variant

Methods

variantMatch :: Variant (t ': ts) -> VariantMatch r (t ': ts) -> r Source #

shrinkVariant :: Variant (t ': ts) -> Variant ts Source #

Remove an option from a Variant

extendVariant :: Variant ts -> Variant (t ': ts) Source #

Add an option to a Variant