| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Data.Diverse.Cases
Synopsis
- 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.
Instances
| Reiterate (Cases fs r) xs Source # | |
| UniqueMember (Head xs -> r) fs => Case (Cases fs r) xs Source # | UndecidableInstances because |
Defined in Data.Diverse.Cases | |
| type CaseResult (Cases fs r :: [Type] -> Type) (x :: Type) Source # | |
Defined in Data.Diverse.Cases | |
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 switching a Which.
let y =pick(5 :: Int) ::Which'[Int, Bool]switchy (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'./nuly = show @Int./show @Char./show @(Maybe Char)./show @Bool./nulafoldr(:) [] (collectx (casesy)) `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 #
A variation of Cases which uses grabN to get the handler by index.
There may be different handlers for the same type, but the handlers must be in the same order
as the input xs typelist.
Use casesN to construct this safely ensuring n starts at 0.
Instances
| ReiterateN (CasesN fs r) n xs Source # | |
Defined in Data.Diverse.Cases | |
| MemberAt n (Head xs -> r) fs => Case (CasesN fs r n) xs Source # | UndecidableInstances because |
Defined in Data.Diverse.Cases | |
| type CaseResult (CasesN fs r n :: [Type] -> Type) (x :: Type) Source # | |
Defined in Data.Diverse.Cases | |
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 switchNing a Which in index order.
let y =pickN@0 Proxy (5 :: Int) :: Which '[Int, Bool, Bool, Int]switchNy (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'./nuly = show @Int./show @Bool./show @Char./show @(Maybe Char)./show @Int./show @(Maybe Char)./nulafoldr(:) [] (collectNx (casesNy)) `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 #