Safe Haskell | None |
---|---|

Language | Haskell2010 |

- data Cases (fs :: [Type]) r (xs :: [Type])
- cases :: forall r xs fs. (AllConstrained ((~) r) (CaseResults (Cases fs r) fs), SameLength fs (Nub xs)) => Many fs -> Cases fs r xs
- cases' :: forall r xs fs. AllConstrained ((~) r) (CaseResults (Cases fs r) fs) => Many fs -> Cases fs r xs
- data CasesN (fs :: [Type]) r (n :: Nat) (xs :: [Type])
- casesN :: forall r xs fs. (AllConstrained ((~) r) (CaseResults (CasesN fs r 0) fs), SameLength fs xs) => Many fs -> CasesN fs r 0 xs
- casesN' :: forall r xs fs. AllConstrained ((~) r) (CaseResults (CasesN fs r 0) fs) => Many fs -> CasesN fs r 0 xs

# Documentation

data Cases (fs :: [Type]) r (xs :: [Type]) Source #

Contains a `Many`

of handlers/continuations for all the types in the `xs`

typelist.
This uses ** grab** to get the unique handler for the type at the

`Head`

of `xs`

.Use `cases`

to construct this with `SameLength`

constraint to reduce programming confusion.

cases :: forall r xs fs. (AllConstrained ((~) r) (CaseResults (Cases fs r) fs), SameLength fs (Nub xs)) => Many fs -> Cases fs r xs Source #

Create an instance of `Case`

for either handling `switch`

ing a `Which`

.

let y =`pick`

(5 :: Int) ::`Which`

'[Int, Bool]`switch`

y (`cases`

(show @Bool`./`

show @Int`./`

`nul`

)) `shouldBe` "5"

Or for handling `collect`

from a `Many`

.

let x = (5 :: Int)`./`

False`./`

'X'`./`

Just 'O'`./`

(6 :: Int)`./`

Just 'A'`./`

`nul`

y = show @Int`./`

show @Char`./`

show @(Maybe Char)`./`

show @Bool`./`

`nul`

`afoldr`

(:) [] (`collect`

x (`cases`

y)) `shouldBe` ["5", "False", "`X`

", "Just 'O'", "6", "Just 'A'"]

This function imposes additional `SameLength`

constraints than when using the `Cases`

constructor directly.
It is better practice to use `cases`

to prevent programming confusion with dead code.
However, the `Cases`

constructor is still exported to allow creating a master-of-all-`Case`

.

cases' :: forall r xs fs. AllConstrained ((~) r) (CaseResults (Cases fs r) fs) => Many fs -> Cases fs r xs Source #

data CasesN (fs :: [Type]) r (n :: Nat) (xs :: [Type]) Source #

casesN :: forall r xs fs. (AllConstrained ((~) r) (CaseResults (CasesN fs r 0) fs), SameLength fs xs) => Many fs -> CasesN fs r 0 xs Source #

Safe Constructor for `CasesN`

ensuring that the `n`

Nat starts at 0.
It is an instance of `CaseN`

for either handling `switchN`

ing a `Which`

in index order.

let y =`pickN`

@0 Proxy (5 :: Int) :: Which '[Int, Bool, Bool, Int]`switchN`

y (`casesN`

(show @Int`./`

show @Bool`./`

show @Bool`./`

show @Int`./`

`nul`

)) `shouldBe` "5"

Or for handling `collectN`

from a `Many`

.

let x = (5 :: Int)`./`

False`./`

'X'`./`

Just 'O'`./`

(6 :: Int)`./`

Just 'A'`./`

`nul`

y = show @Int`./`

show @Bool`./`

show @Char`./`

show @(Maybe Char)`./`

show @Int`./`

show @(Maybe Char)`./`

`nul`

`afoldr`

(:) [] (`collectN`

x (`casesN`

y)) `shouldBe` ["5", "False", "`X`

", "Just 'O'", "6", "Just 'A'"]

casesN' :: forall r xs fs. AllConstrained ((~) r) (CaseResults (CasesN fs r 0) fs) => Many fs -> CasesN fs r 0 xs Source #