Data.Variant
- Package
- variant
- Repository
- natefaubion/purescript-variant
#Variant Source
data Variant :: Row Type -> Type
Instances
(RowToList r rl, VariantTags rl, VariantEqs rl) => Eq (Variant r)
(RowToList r rl, VariantTags rl, VariantEqs rl, VariantOrds rl, VariantBounded rl) => Bounded (Variant r)
(RowToList r rl, VariantTags rl, VariantEqs rl, VariantOrds rl, VariantBoundedEnums rl) => Enum (Variant r)
(RowToList r rl, VariantTags rl, VariantEqs rl, VariantOrds rl, VariantBoundedEnums rl) => BoundedEnum (Variant r)
(RowToList r rl, VariantTags rl, VariantEqs rl, VariantOrds rl) => Ord (Variant r)
(RowToList r rl, VariantTags rl, VariantShows rl) => Show (Variant r)
#prj Source
prj :: forall proxy sym a r1 r2 f. Cons sym a r1 r2 => IsSymbol sym => Alternative f => proxy sym -> Variant r2 -> f a
Attempt to read a variant at a given label.
case prj (Proxy :: Proxy "foo") intAtFoo of
Just i -> i + 1
Nothing -> 0
#onMatch Source
onMatch :: forall rl r r1 r2 r3 b. RowToList r rl => VariantMatchCases rl r1 b => Union r1 r2 r3 => Record r -> (Variant r2 -> b) -> Variant r3 -> b
Match a Variant
with a Record
containing functions for handling cases.
This is similar to on
, except instead of providing a single label and
handler, you can provide a record where each field maps to a particular
Variant
case.
onMatch
{ foo: \foo -> "Foo: " <> foo
, bar: \bar -> "Bar: " <> bar
}
Polymorphic functions in records (such as show
or id
) can lead
to inference issues if not all polymorphic variables are specified
in usage. When in doubt, label methods with specific types, such as
show :: Int -> String
, or give the whole record an appropriate type.
#case_ Source
case_ :: forall a. Variant () -> a
Combinator for exhaustive pattern matching.
caseFn :: Variant (foo :: Int, bar :: String, baz :: Boolean) -> String
caseFn = case_
# on (Proxy :: Proxy "foo") (\foo -> "Foo: " <> show foo)
# on (Proxy :: Proxy "bar") (\bar -> "Bar: " <> bar)
# on (Proxy :: Proxy "baz") (\baz -> "Baz: " <> show baz)
#match Source
match :: forall rl r r1 r2 b. RowToList r rl => VariantMatchCases rl r1 b => Union r1 () r2 => Record r -> Variant r2 -> b
Combinator for exhaustive pattern matching using an onMatch
case record.
matchFn :: Variant (foo :: Int, bar :: String, baz :: Boolean) -> String
matchFn = match
{ foo: \foo -> "Foo: " <> show foo
, bar: \bar -> "Bar: " <> bar
, baz: \baz -> "Baz: " <> show baz
}
#default Source
default :: forall a r. a -> Variant r -> a
Combinator for partial matching with a default value in case of failure.
caseFn :: forall r. Variant (foo :: Int, bar :: String | r) -> String
caseFn = default "No match"
# on (Proxy :: Proxy "foo") (\foo -> "Foo: " <> show foo)
# on (Proxy :: Proxy "bar") (\bar -> "Bar: " <> bar)
#contract Source
contract :: forall lt gt f. Alternative f => Contractable gt lt => Variant gt -> f (Variant lt)
A Variant gt
can be cast to some Variant lt
, where lt
is is a subset
of gt
, as long as there is proof that the Variant
's runtime tag is
within the subset of lt
.
#Unvariant' Source
type Unvariant' :: Row Type -> Type -> Type
type Unvariant' r x = forall proxy s t o. IsSymbol s => Cons s t o r => proxy s -> t -> x
#VariantEqs Source
class VariantEqs :: RowList Type -> Constraint
class VariantEqs rl where
Members
variantEqs :: forall proxy. proxy rl -> List (VariantCase -> VariantCase -> Boolean)
Instances
VariantEqs Nil
(VariantEqs rs, Eq a) => VariantEqs (Cons sym a rs)
#VariantOrds Source
class VariantOrds :: RowList Type -> Constraint
class VariantOrds rl where
Members
variantOrds :: forall proxy. proxy rl -> List (VariantCase -> VariantCase -> Ordering)
Instances
VariantOrds Nil
(VariantOrds rs, Ord a) => VariantOrds (Cons sym a rs)
#VariantShows Source
class VariantShows :: RowList Type -> Constraint
class VariantShows rl where
Members
variantShows :: forall proxy. proxy rl -> List (VariantCase -> String)
Instances
VariantShows Nil
(VariantShows rs, Show a) => VariantShows (Cons sym a rs)
#VariantBounded Source
class VariantBounded :: RowList Type -> Constraint
class VariantBounded rl where
Members
variantBounded :: forall proxy. proxy rl -> List (BoundedDict VariantCase)
Instances
VariantBounded Nil
(VariantBounded rs, Bounded a) => VariantBounded (Cons sym a rs)
#VariantBoundedEnums Source
class VariantBoundedEnums :: RowList Type -> Constraint
class (VariantBounded rl) <= VariantBoundedEnums rl where
Members
variantBoundedEnums :: forall proxy. proxy rl -> List (BoundedEnumDict VariantCase)
Instances
VariantBoundedEnums Nil
(VariantBoundedEnums rs, BoundedEnum a) => VariantBoundedEnums (Cons sym a rs)
Re-exports from Data.Variant.Internal
#Contractable Source
class Contractable :: forall k. Row k -> Row k -> Constraint
class Contractable gt lt
Instances
(RowToList lt ltl, Union lt a gt, VariantTags ltl) => Contractable gt lt
#VariantMatchCases Source
class VariantMatchCases :: RowList Type -> Row Type -> Type -> Constraint
class VariantMatchCases rl vo b | rl -> vo b
Instances
(VariantMatchCases rl vo' b, Cons sym a vo' vo, TypeEquals k (a -> b)) => VariantMatchCases (Cons sym k rl) vo b
VariantMatchCases Nil () b