Module

Data.Variant

Package
purescript-variant
Repository
natefaubion/purescript-variant

#inj Source

inj :: forall sym a r1 r2. Cons sym a r1 r2 => IsSymbol sym => Proxy sym -> a -> Variant r2

Inject into the variant at a given label.

intAtFoo :: forall r. Variant (foo :: Int | r)
intAtFoo = inj (Proxy :: Proxy "foo") 42

#prj Source

prj :: forall 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

#on Source

on :: forall sym a b r1 r2. Cons sym a r1 r2 => IsSymbol sym => Proxy sym -> (a -> b) -> (Variant r1 -> b) -> Variant r2 -> b

Attempt to read a variant at a given label by providing branches. The failure branch receives the provided variant, but with the label removed.

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

#over Source

over :: forall r rl ri ro r1 r2 r3. RowToList r rl => VariantMapCases rl ri ro => Union ri r2 r1 => Union ro r2 r3 => Record r -> Variant r1 -> Variant r3

Map over some labels and leave the rest unchanged. For example:

over { label: show :: Int -> String }
  :: forall r. Variant ( label :: Int | r ) -> Variant ( label :: String | r )

over r is like expand # overSome r but with a more easily solved constraint (i.e. it can be solved once the type of r is known).

#overOne Source

overOne :: forall sym a b r1 r2 r3 r4. IsSymbol sym => Cons sym a r1 r2 => Cons sym b r4 r3 => Proxy sym -> (a -> b) -> (Variant r1 -> Variant r3) -> Variant r2 -> Variant r3

Map over one case of a variant, putting the result back at the same label, with a fallback function to handle the remaining cases.

#overSome Source

overSome :: forall r rl ri ro r1 r2 r3 r4. RowToList r rl => VariantMapCases rl ri ro => Union ri r2 r1 => Union ro r4 r3 => Record r -> (Variant r2 -> Variant r3) -> Variant r1 -> Variant r3

Map over several cases of a variant using a Record containing functions for each case. Each case gets put back at the same label it was matched at, i.e. its label in the record. Labels not found in the record are handled using the fallback function.

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

#traverse Source

traverse :: forall r rl ri ro r1 r2 r3 m. RowToList r rl => VariantTraverseCases m rl ri ro => Union ri r2 r1 => Union ro r2 r3 => Applicative m => Record r -> Variant r1 -> m (Variant r3)

Traverse over some labels and leave the rest unchanged. (Implemented by expanding after traverseSome.)

#traverseOne Source

traverseOne :: forall sym a b r1 r2 r3 r4 m. IsSymbol sym => Cons sym a r1 r2 => Cons sym b r4 r3 => Functor m => Proxy sym -> (a -> m b) -> (Variant r1 -> m (Variant r3)) -> Variant r2 -> m (Variant r3)

Traverse over one case of a variant (in a functorial/monadic context m), putting the result back at the same label, with a fallback function.

#traverseSome Source

traverseSome :: forall r rl ri ro r1 r2 r3 r4 m. RowToList r rl => VariantTraverseCases m rl ri ro => Union ri r2 r1 => Union ro r4 r3 => Functor m => Record r -> (Variant r2 -> m (Variant r3)) -> Variant r1 -> m (Variant r3)

Traverse over several cases of a variant using a Record containing traversals. Each case gets put back at the same label it was matched at, i.e. its label in the record. Labels not found in the record are handled using the fallback function.

#expand Source

expand :: forall lt a gt. Union lt a gt => Variant lt -> Variant gt

Every Variant lt can be cast to some Variant gt as long as lt is a subset of gt.

#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

newtype Unvariant :: Row Type -> Typenewtype Unvariant r

Constructors

#Unvariant' Source

type Unvariant' :: Row Type -> Type -> Typetype Unvariant' r x = forall s t o. IsSymbol s => Cons s t o r => Proxy s -> t -> x

#unvariant Source

unvariant :: forall r. Variant r -> Unvariant r

A low-level eliminator which reifies the IsSymbol and Cons constraints required to reconstruct the Variant. This lets you work generically with some Variant at runtime.

#revariant Source

revariant :: forall r. Unvariant r -> Variant r

Reconstructs a Variant given an Unvariant eliminator.

#VariantEqs Source

class VariantEqs :: RowList Type -> Constraintclass VariantEqs rl  where

Members

Instances

#VariantOrds Source

class VariantOrds :: RowList Type -> Constraintclass VariantOrds rl  where

Members

Instances

#VariantShows Source

class VariantShows :: RowList Type -> Constraintclass VariantShows rl  where

Members

Instances

Re-exports from Data.Variant.Internal

#Contractable Source

class Contractable :: forall k. Row k -> Row k -> Constraintclass Contractable gt lt 

Instances

#VariantMapCases Source

class VariantMapCases :: RowList Type -> Row Type -> Row Type -> Constraintclass VariantMapCases (rl :: RowList Type) (ri :: Row Type) (ro :: Row Type) | rl -> ri ro

Instances

#VariantMatchCases Source

class VariantMatchCases :: RowList Type -> Row Type -> Type -> Constraintclass VariantMatchCases rl vo b | rl -> vo b

Instances

#VariantTraverseCases Source

class VariantTraverseCases :: (Type -> Type) -> RowList Type -> Row Type -> Row Type -> Constraintclass VariantTraverseCases (m :: Type -> Type) (rl :: RowList Type) (ri :: Row Type) (ro :: Row Type) | rl -> ri ro

Instances