defargs 0.1 → 0.2
raw patch · 2 files changed
+42/−24 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Type.DefArgs: instance DefArgs f as => DefArgs (a -> f) (a * as)
- Type.DefArgs: instance DefArgs r Nil
+ Type.DefArgs: instance DefArgs' f as => DefArgs' (a -> f) (a * as)
+ Type.DefArgs: instance DefArgs' r Nil
+ Type.DefArgs: type DefArg r a a' = Good (a -> r) (a * Nil) (a' -> r)
+ Type.DefArgs: type DefArgs10 r a b c d e f g h i j a' b' c' d' e' f' g' h' i' j' = Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) (a * (b * (c * (d * (e * (f * (g * (h * (i * (j * Nil)))))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r)
+ Type.DefArgs: type DefArgs2 r a b a' b' = Good (a -> b -> r) (a * (b * Nil)) (a' -> b' -> r)
+ Type.DefArgs: type DefArgs3 r a b c a' b' c' = Good (a -> b -> c -> r) (a * (b * (c * Nil))) (a' -> b' -> c' -> r)
+ Type.DefArgs: type DefArgs4 r a b c d a' b' c' d' = Good (a -> b -> c -> d -> r) (a * (b * (c * (d * Nil)))) (a' -> b' -> c' -> d' -> r)
+ Type.DefArgs: type DefArgs5 r a b c d e a' b' c' d' e' = Good (a -> b -> c -> d -> e -> r) (a * (b * (c * (d * (e * Nil))))) (a' -> b' -> c' -> d' -> e' -> r)
+ Type.DefArgs: type DefArgs6 r a b c d e f a' b' c' d' e' f' = Good (a -> b -> c -> d -> e -> f -> r) (a * (b * (c * (d * (e * (f * Nil)))))) (a' -> b' -> c' -> d' -> e' -> f' -> r)
+ Type.DefArgs: type DefArgs7 r a b c d e f g a' b' c' d' e' f' g' = Good (a -> b -> c -> d -> e -> f -> g -> r) (a * (b * (c * (d * (e * (f * (g * Nil))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r)
+ Type.DefArgs: type DefArgs8 r a b c d e f g h a' b' c' d' e' f' g' h' = Good (a -> b -> c -> d -> e -> f -> g -> h -> r) (a * (b * (c * (d * (e * (f * (g * (h * Nil)))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r)
+ Type.DefArgs: type DefArgs9 r a b c d e f g h i a' b' c' d' e' f' g' h' i' = Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) (a * (b * (c * (d * (e * (f * (g * (h * (i * Nil))))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r)
- Type.DefArgs: defarg :: Good (a -> r) (a * Nil) (a' -> r) => (a -> r) -> a -> (a' -> r)
+ Type.DefArgs: defarg :: DefArg r a a' => (a -> r) -> a -> (a' -> r)
- Type.DefArgs: defargs10 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) (a * (b * (c * (d * (e * (f * (g * (h * (i * (j * Nil)))))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r)
+ Type.DefArgs: defargs10 :: DefArgs10 r a b c d e f g h i j a' b' c' d' e' f' g' h' i' j' => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r)
- Type.DefArgs: defargs2 :: Good (a -> b -> r) (a * (b * Nil)) (a' -> b' -> r) => (a -> b -> r) -> a -> b -> (a' -> b' -> r)
+ Type.DefArgs: defargs2 :: DefArgs2 r a b a' b' => (a -> b -> r) -> a -> b -> (a' -> b' -> r)
- Type.DefArgs: defargs3 :: Good (a -> b -> c -> r) (a * (b * (c * Nil))) (a' -> b' -> c' -> r) => (a -> b -> c -> r) -> a -> b -> c -> (a' -> b' -> c' -> r)
+ Type.DefArgs: defargs3 :: DefArgs3 r a b c a' b' c' => (a -> b -> c -> r) -> a -> b -> c -> (a' -> b' -> c' -> r)
- Type.DefArgs: defargs4 :: Good (a -> b -> c -> d -> r) (a * (b * (c * (d * Nil)))) (a' -> b' -> c' -> d' -> r) => (a -> b -> c -> d -> r) -> a -> b -> c -> d -> (a' -> b' -> c' -> d' -> r)
+ Type.DefArgs: defargs4 :: DefArgs4 r a b c d a' b' c' d' => (a -> b -> c -> d -> r) -> a -> b -> c -> d -> (a' -> b' -> c' -> d' -> r)
- Type.DefArgs: defargs5 :: Good (a -> b -> c -> d -> e -> r) (a * (b * (c * (d * (e * Nil))))) (a' -> b' -> c' -> d' -> e' -> r) => (a -> b -> c -> d -> e -> r) -> a -> b -> c -> d -> e -> (a' -> b' -> c' -> d' -> e' -> r)
+ Type.DefArgs: defargs5 :: DefArgs5 r a b c d e a' b' c' d' e' => (a -> b -> c -> d -> e -> r) -> a -> b -> c -> d -> e -> (a' -> b' -> c' -> d' -> e' -> r)
- Type.DefArgs: defargs6 :: Good (a -> b -> c -> d -> e -> f -> r) (a * (b * (c * (d * (e * (f * Nil)))))) (a' -> b' -> c' -> d' -> e' -> f' -> r) => (a -> b -> c -> d -> e -> f -> r) -> a -> b -> c -> d -> e -> f -> (a' -> b' -> c' -> d' -> e' -> f' -> r)
+ Type.DefArgs: defargs6 :: DefArgs6 r a b c d e f a' b' c' d' e' f' => (a -> b -> c -> d -> e -> f -> r) -> a -> b -> c -> d -> e -> f -> (a' -> b' -> c' -> d' -> e' -> f' -> r)
- Type.DefArgs: defargs7 :: Good (a -> b -> c -> d -> e -> f -> g -> r) (a * (b * (c * (d * (e * (f * (g * Nil))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r) => (a -> b -> c -> d -> e -> f -> g -> r) -> a -> b -> c -> d -> e -> f -> g -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r)
+ Type.DefArgs: defargs7 :: DefArgs7 r a b c d e f g a' b' c' d' e' f' g' => (a -> b -> c -> d -> e -> f -> g -> r) -> a -> b -> c -> d -> e -> f -> g -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r)
- Type.DefArgs: defargs8 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> r) (a * (b * (c * (d * (e * (f * (g * (h * Nil)))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r)
+ Type.DefArgs: defargs8 :: DefArgs8 r a b c d e f g h a' b' c' d' e' f' g' h' => (a -> b -> c -> d -> e -> f -> g -> h -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r)
- Type.DefArgs: defargs9 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) (a * (b * (c * (d * (e * (f * (g * (h * (i * Nil))))))))) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r)
+ Type.DefArgs: defargs9 :: DefArgs9 r a b c d e f g h i a' b' c' d' e' f' g' h' i' => (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r)
Files
- defargs.cabal +2/−2
- src/Type/DefArgs.hs +40/−22
defargs.cabal view
@@ -1,6 +1,6 @@ name: defargs category: type system -version: 0.1 +version: 0.2 license: BSD3 license-file: LICENSE cabal-version: >= 1.10 @@ -12,7 +12,7 @@ bug-reports: https://github.com/Kinokkory/defargs/issues copyright: (c) Yusuke Matsushita 2014 synopsis: default arguments in haskell -description: Default arguments in Haskell. +description: Default arguments in Haskell. More information can be found in <http://hackage.haskell.org/package/defargs the hackage's haddock> or the <http://kinokkory.github.io/defargs/ updated haddock>. build-type: Simple
src/Type/DefArgs.hs view
@@ -26,8 +26,12 @@ -- * Converters -- $converters , defarg, defargs2, defargs3, defargs4, defargs5 - , defargs6, defargs7, defargs8, defargs9, defargs10) where + , defargs6, defargs7, defargs8, defargs9, defargs10 + -- * Constraints + , DefArg, DefArgs2, DefArgs3, DefArgs4, DefArgs5 + , DefArgs6, DefArgs7, DefArgs8, DefArgs9, DefArgs10) where + import Type.Cluss -- | When used as an argument, 'Def' will be replaced with the corresponding default value by 'defarg', 'defargs2', ..., and 'defargs10'. @@ -40,24 +44,38 @@ (&) = Cons infixr 0 *, & +type (=?) a = In [Type Def, Type a] + -- core -class DefArgs f as where - type P f as ::[*] - defargs' :: In (P f as) g => f -> as -> g -instance DefArgs r Nil where +class DefArgs' f as where + type P f as :: [*] + defargs' :: K f as g => f -> as -> g +type K f as = In (P f as) +instance DefArgs' r Nil where type P r Nil = '[Type r] defargs' x Nil = projI ( x `andI` noneI :: AllOfI '[Type r]) -instance DefArgs f as => DefArgs (a -> f) (a * as) where - type P (a -> f) (a * as) = [Unary ((->) Def) (In (P f as)), Unary ((->) a) (In (P f as))] - defargs' f (Cons x xs) = projI ( - (\Def -> defargs' (f x) xs) `andI1` - (\x' -> defargs' (f x') xs) `andI1` +instance DefArgs' f as => DefArgs' (a -> f) (a * as) where + type P (a -> f) (a * as) = '[Binary (->) ((=?) a >|< K f as)] + defargs' f (Cons x xs) = projI ((projF ( + (\Def -> defargs' (f x) xs) `andF` + (\x' -> defargs' (f x') xs) `andF` + noneF)) `andI2` noneI :: AllOfI (P (a -> f) (a * as))) --- the constraint -type Good f d g = (DefArgs f d, In (P f d) g) +-- the constraints +type Good f d g = (DefArgs' f d, In (P f d) g) +type DefArg r a a' = Good (a -> r) (a * Nil) (a' -> r) +type DefArgs2 r a b a' b' = Good (a -> b -> r) (a * b * Nil) (a' -> b' -> r) +type DefArgs3 r a b c a' b' c' = Good (a -> b -> c -> r) (a * b * c * Nil) (a' -> b' -> c' -> r) +type DefArgs4 r a b c d a' b' c' d' = Good (a -> b -> c -> d -> r) (a * b * c * d * Nil) (a' -> b' -> c' -> d' -> r) +type DefArgs5 r a b c d e a' b' c' d' e' = Good (a -> b -> c -> d -> e -> r) (a * b * c * d * e * Nil) (a' -> b' -> c' -> d' -> e' -> r) +type DefArgs6 r a b c d e f a' b' c' d' e' f' = Good (a -> b -> c -> d -> e -> f -> r) (a * b * c * d * e * f * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> r) +type DefArgs7 r a b c d e f g a' b' c' d' e' f' g' = Good (a -> b -> c -> d -> e -> f -> g -> r) (a * b * c * d * e * f * g * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r) +type DefArgs8 r a b c d e f g h a' b' c' d' e' f' g' h' = Good (a -> b -> c -> d -> e -> f -> g -> h -> r) (a * b * c * d * e * f * g * h * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r) +type DefArgs9 r a b c d e f g h i a' b' c' d' e' f' g' h' i' = Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) (a * b * c * d * e * f * g * h * i * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r) +type DefArgs10 r a b c d e f g h i j a' b' c' d' e' f' g' h' i' j' = Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) (a * b * c * d * e * f * g * h * i * j * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r) -- $converters -- Given a function, these converters provide every argument of the function with a default value. @@ -68,25 +86,25 @@ -- Internally, the judgment is made by <http://hackage.haskell.org/package/cluss cluss>. -- converters -defarg :: Good (a -> r) (a * Nil) (a' -> r) => (a -> r) -> a -> (a' -> r) +defarg :: DefArg r a a' => (a -> r) -> a -> (a' -> r) defarg f x = defargs' f (x & Nil) -defargs2 :: Good (a -> b -> r) (a * b * Nil) (a' -> b' -> r) => (a -> b -> r) -> a -> b -> (a' -> b' -> r) +defargs2 :: DefArgs2 r a b a' b' => (a -> b -> r) -> a -> b -> (a' -> b' -> r) defargs2 f x x2 = defargs' f (x & x2 & Nil) -defargs3 :: Good (a -> b -> c -> r) (a * b * c * Nil) (a' -> b' -> c' -> r) => (a -> b -> c -> r) -> a -> b -> c -> (a' -> b' -> c' -> r) +defargs3 :: DefArgs3 r a b c a' b' c' => (a -> b -> c -> r) -> a -> b -> c -> (a' -> b' -> c' -> r) defargs3 f x x2 x3 = defargs' f (x & x2 & x3 & Nil) -defargs4 :: Good (a -> b -> c -> d -> r) (a * b * c * d * Nil) (a' -> b' -> c' -> d' -> r) => (a -> b -> c -> d -> r) -> a -> b -> c -> d -> (a' -> b' -> c' -> d' -> r) +defargs4 :: DefArgs4 r a b c d a' b' c' d' => (a -> b -> c -> d -> r) -> a -> b -> c -> d -> (a' -> b' -> c' -> d' -> r) defargs4 f x x2 x3 x4 = defargs' f (x & x2 & x3 & x4 & Nil) -defargs5 :: Good (a -> b -> c -> d -> e -> r) (a * b * c * d * e * Nil) (a' -> b' -> c' -> d' -> e' -> r) => (a -> b -> c -> d -> e -> r) -> a -> b -> c -> d -> e -> (a' -> b' -> c' -> d' -> e' -> r) +defargs5 :: DefArgs5 r a b c d e a' b' c' d' e' => (a -> b -> c -> d -> e -> r) -> a -> b -> c -> d -> e -> (a' -> b' -> c' -> d' -> e' -> r) defargs5 f x x2 x3 x4 x5 = defargs' f (x & x2 & x3 & x4 & x5 & Nil) -defargs6 :: Good (a -> b -> c -> d -> e -> f -> r) (a * b * c * d * e * f * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> r) => (a -> b -> c -> d -> e -> f -> r) -> a -> b -> c -> d -> e -> f -> (a' -> b' -> c' -> d' -> e' -> f' -> r) +defargs6 :: DefArgs6 r a b c d e f a' b' c' d' e' f' => (a -> b -> c -> d -> e -> f -> r) -> a -> b -> c -> d -> e -> f -> (a' -> b' -> c' -> d' -> e' -> f' -> r) defargs6 f x x2 x3 x4 x5 x6 = defargs' f (x & x2 & x3 & x4 & x5 & x6 & Nil) -defargs7 :: Good (a -> b -> c -> d -> e -> f -> g -> r) (a * b * c * d * e * f * g * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r) => (a -> b -> c -> d -> e -> f -> g -> r) -> a -> b -> c -> d -> e -> f -> g -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r) +defargs7 :: DefArgs7 r a b c d e f g a' b' c' d' e' f' g' => (a -> b -> c -> d -> e -> f -> g -> r) -> a -> b -> c -> d -> e -> f -> g -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> r) defargs7 f x x2 x3 x4 x5 x6 x7 = defargs' f (x & x2 & x3 & x4 & x5 & x6 & x7 & Nil) -defargs8 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> r) (a * b * c * d * e * f * g * h * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r) +defargs8 :: DefArgs8 r a b c d e f g h a' b' c' d' e' f' g' h' => (a -> b -> c -> d -> e -> f -> g -> h -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> r) defargs8 f x x2 x3 x4 x5 x6 x7 x8 = defargs' f (x & x2 & x3 & x4 & x5 & x6 & x7 & x8 & Nil) -defargs9 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) (a * b * c * d * e * f * g * h * i * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r) +defargs9 :: DefArgs9 r a b c d e f g h i a' b' c' d' e' f' g' h' i' => (a -> b -> c -> d -> e -> f -> g -> h -> i -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> r) defargs9 f x x2 x3 x4 x5 x6 x7 x8 x9 = defargs' f (x & x2 & x3 & x4 & x5 & x6 & x7 & x8 & x9 & Nil) -defargs10 :: Good (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) (a * b * c * d * e * f * g * h * i * j * Nil) (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r) => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r) +defargs10 :: DefArgs10 r a b c d e f g h i j a' b' c' d' e' f' g' h' i' j' => (a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> r) -> a -> b -> c -> d -> e -> f -> g -> h -> i -> j -> (a' -> b' -> c' -> d' -> e' -> f' -> g' -> h' -> i' -> j' -> r) defargs10 f x x2 x3 x4 x5 x6 x7 x8 x9 x10 = defargs' f (x & x2 & x3 & x4 & x5 & x6 & x7 & x8 & x9 & x10 & Nil) -- $example