express 0.1.12 → 0.1.14
raw patch · 13 files changed
+350/−37 lines, 13 filesdep ~leancheckPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: leancheck
API changes (from Hackage documentation)
+ Data.Express.Fixtures: (-..) :: Expr -> Expr
+ Data.Express.Fixtures: (-..-) :: Expr -> Expr -> Expr
+ Data.Express.Fixtures: (-...) :: Expr -> Expr -> Expr
+ Data.Express.Fixtures: (-...-) :: Expr -> Expr -> Expr -> Expr
+ Data.Express.Fixtures: enumFrom' :: Expr -> Expr
+ Data.Express.Fixtures: enumFromThen' :: Expr -> Expr -> Expr
+ Data.Express.Fixtures: enumFromThenTo' :: Expr -> Expr -> Expr -> Expr
+ Data.Express.Fixtures: enumFromTo' :: Expr -> Expr -> Expr
+ Data.Express.Fixtures: zed :: Expr
+ Data.Express.Fixtures: zee :: Expr
+ Data.Express.Utils.Typeable: countListTy :: TypeRep -> Int
Files
- TODO.md +2/−0
- changelog.md +11/−0
- express.cabal +30/−30
- src/Data/Express/Core.hs +24/−0
- src/Data/Express/Express.hs +4/−4
- src/Data/Express/Fixtures.hs +107/−1
- src/Data/Express/Instances.hs +4/−1
- src/Data/Express/Utils/Typeable.hs +6/−0
- stack.yaml +1/−1
- test/canon.hs +30/−0
- test/fixtures.hs +79/−0
- test/instances.hs +28/−0
- test/show.hs +24/−0
TODO.md view
@@ -3,6 +3,8 @@ Here is a list of things TO DO for express: +* add partial application functions `-+`, `-:`, `-==` to fixtures+ * document and test the `Instances` module * review Haddock of `Data.Express`
changelog.md view
@@ -2,6 +2,17 @@ ===================== +v0.1.14+-------++* permit and pretty-print `[<n>..<m>]` notations.++* improve default variable names when canonicalizing+ - lists are named xs, ys, xss, yss, etc.+ - functions are named f, g, h+ - before they were simply x, y, z++ v0.1.12 -------
express.cabal view
@@ -1,6 +1,6 @@ -- Cabal file for express name: express-version: 0.1.12+version: 0.1.14 synopsis: Dynamically-typed expressions involving applications and variables. description: Express is a library for manipulating dynamically typed Haskell expressions.@@ -61,7 +61,7 @@ source-repository this type: git location: https://github.com/rudymatela/express- tag: v0.1.12+ tag: v0.1.14 library exposed-modules: Data.Express@@ -92,7 +92,7 @@ main-is: main.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite core@@ -100,7 +100,7 @@ main-is: core.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite canon@@ -108,7 +108,7 @@ main-is: canon.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite hole@@ -116,7 +116,7 @@ main-is: hole.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite match@@ -124,7 +124,7 @@ main-is: match.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite map@@ -132,7 +132,7 @@ main-is: map.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite fixtures@@ -140,7 +140,7 @@ main-is: fixtures.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite instances@@ -148,7 +148,7 @@ main-is: instances.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite express-instances@@ -156,7 +156,7 @@ main-is: express.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite express-derive@@ -164,7 +164,7 @@ main-is: express-derive.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite ord@@ -172,7 +172,7 @@ main-is: ord.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite listable@@ -180,7 +180,7 @@ main-is: listable.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite name@@ -188,7 +188,7 @@ main-is: name.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite name-derive@@ -196,7 +196,7 @@ main-is: name-derive.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite fold@@ -204,7 +204,7 @@ main-is: fold.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite show@@ -212,7 +212,7 @@ main-is: show.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite triexpr@@ -220,7 +220,7 @@ main-is: triexpr.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 test-suite utils@@ -228,7 +228,7 @@ main-is: utils.hs hs-source-dirs: test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark compare@@ -236,7 +236,7 @@ main-is: compare.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark pairs@@ -244,7 +244,7 @@ main-is: pairs.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark sort@@ -252,7 +252,7 @@ main-is: sort.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark tiers@@ -260,7 +260,7 @@ main-is: tiers.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark match-list@@ -268,7 +268,7 @@ main-is: match-list.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark match-noop@@ -276,7 +276,7 @@ main-is: match-noop.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark match-triexpr@@ -284,26 +284,26 @@ main-is: match-triexpr.hs hs-source-dirs: bench, test other-modules: Test, Test.ListableExpr- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark u-extrapolate type: exitcode-stdio-1.0 main-is: u-extrapolate.hs hs-source-dirs: eg- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark u-speculate type: exitcode-stdio-1.0 main-is: u-speculate.hs hs-source-dirs: eg- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010 benchmark u-conjure type: exitcode-stdio-1.0 main-is: u-conjure.hs hs-source-dirs: eg- build-depends: base >= 4 && < 5, express, leancheck >= 0.9.4+ build-depends: base >= 4 && < 5, express, leancheck >= 0.9.10 default-language: Haskell2010
src/Data/Express/Core.hs view
@@ -470,6 +470,25 @@ showParen (d >= 0) $ showString "if " . showsPrecExpr 0 ep . showString " then " . showsPrecExpr 0 ex . showString " else " . showsPrecExpr 0 ey+showsPrecExpr d (Value ",.." _ :$ ex :$ ey :$ ez) =+ showString "[" . showsPrecExpr 0 ex+ . showString (if dotdot ex && dotdot ey && dotdot ez then "," else ", ")+ . showsPrecExpr 0 ey+ . showString (if dotdot ex && dotdot ey && dotdot ez then ".." else " .. ")+ . showsPrecExpr 0 ez+ . showString "]"+showsPrecExpr d (Value ",.." _ :$ ex :$ ey) =+ showString "[" . showsPrecExpr 0 ex+ . showString (if dotdot ex && dotdot ey then "," else ", ")+ . showsPrecExpr 0 ey+ . showString (if dotdot ex && dotdot ey then "..]" else " ..]")+showsPrecExpr d (Value ".." _ :$ ex :$ ey) =+ showString "[" . showsPrecExpr 0 ex+ . showString (if dotdot ex && dotdot ey then ".." else " .. ")+ . showsPrecExpr 0 ey+ . showString "]"+showsPrecExpr d (Value ".." _ :$ ex) =+ showString "[" . showsPrecExpr 0 ex . showString (if dotdot ex then "..]" else " ..]") showsPrecExpr d (Value f' _ :$ e1 :$ e2) | isInfix f = showParen (d > prec f) $ showsOpExpr f e1@@ -493,6 +512,11 @@ $ showsPrecExpr (prec " ") e1 . showString " " . showsPrecExpr (prec " " + 1) e2++-- Can we avoid a space using @[<n>..<m>]@?+dotdot :: Expr -> Bool+dotdot (Value (c:_) _) = isNumber c || isLower c || c == '_' || c == '\''+dotdot _ = False -- bad smell here, repeated code! showsTailExpr :: Expr -> String -> String
src/Data/Express/Express.hs view
@@ -177,7 +177,7 @@ -- type binding utilities -- --- | Type restricted version of const+-- | Type restricted version of 'const' -- that forces its first argument -- to have the same type as the second. --@@ -186,7 +186,7 @@ (-:) = asTypeOf -- const infixl 1 -: --- | Type restricted version of const+-- | Type restricted version of 'const' -- that forces the result of its first argument -- to have the same type as the second. --@@ -195,7 +195,7 @@ (->:) = const infixl 1 ->: --- | Type restricted version of const+-- | Type restricted version of 'const' -- that forces the result of the result of its first argument -- to have the same type as the second. --@@ -204,7 +204,7 @@ (->>:) = const infixl 1 ->>: --- | Type restricted version of const+-- | Type restricted version of 'const' -- that forces the result of the result of the result of its first argument -- to have the same type as the second. (->>>:) :: (a -> b -> c -> d) -> d -> (a -> b -> c -> d)
src/Data/Express/Fixtures.hs view
@@ -138,7 +138,7 @@ -- ** Chars , c_ , cc, dd, ccs- , ae, bee, cee, dee+ , ae, bee, cee, dee, zed, zee , space, lineBreak , ord' , ordE@@ -194,6 +194,12 @@ , mapE , (-.-) , map'++ -- ** Enum+ , enumFrom', (-..)+ , enumFromTo', (-..-)+ , enumFromThen', (-...)+ , enumFromThenTo', (-...-) ) where @@ -773,6 +779,30 @@ dee :: Expr dee = val 'd' +-- | The character @\'z\'@ encoded as an 'Expr'+--+-- > > zed+-- > 'z' :: Char+--+-- > > evl zed :: Char+-- > 'z'+--+-- (cf. 'zee')+zed :: Expr+zed = val 'z'++-- | The character @\'z\'@ encoded as an 'Expr'+--+-- > > zee+-- > 'z' :: Char+--+-- > > evl zee :: Char+-- > 'z'+--+-- (cf. 'zed')+zee :: Expr+zee = val 'z'+ space :: Expr space = val ' ' @@ -1304,3 +1334,79 @@ where err = error $ "map': unhandled type " ++ show (typ ef) type Map a = (a -> a) -> [a] -> [a]++enumFrom' :: Expr -> Expr+enumFrom' ex = headOr err $ mapMaybe ($$ ex)+ [ value "enumFrom" (enumFrom :: EnumFrom Int)+ , value "enumFrom" (enumFrom :: EnumFrom Bool)+ , value "enumFrom" (enumFrom :: EnumFrom Char)+ ]+ where+ err = error $ "enumFrom': unhandled type " ++ show (typ ex)+type EnumFrom a = (a -> [a])++(-..) :: Expr -> Expr+(-..) ex = headOr err $ mapMaybe ($$ ex)+ [ value ".." (enumFrom :: EnumFrom Int)+ , value ".." (enumFrom :: EnumFrom Bool)+ , value ".." (enumFrom :: EnumFrom Char)+ ]+ where+ err = error $ "(-..): unhandled type " ++ show (typ ex)++enumFromTo' :: Expr -> Expr -> Expr+enumFromTo' ex ey = (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value "enumFromTo" (enumFromTo :: EnumFromTo Int)+ , value "enumFromTo" (enumFromTo :: EnumFromTo Bool)+ , value "enumFromTo" (enumFromTo :: EnumFromTo Char)+ ]+ where+ err = error $ "enumFromTo': unhandled type " ++ show (typ ex)+type EnumFromTo a = (a -> a -> [a])++(-..-) :: Expr -> Expr -> Expr+ex -..- ey = (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value ".." (enumFromTo :: EnumFromTo Int)+ , value ".." (enumFromTo :: EnumFromTo Bool)+ , value ".." (enumFromTo :: EnumFromTo Char)+ ]+ where+ err = error $ "-..-: unhandled type " ++ show (typ ex)++enumFromThen' :: Expr -> Expr -> Expr+enumFromThen' ex ey = (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value "enumFromThen" (enumFromThen :: EnumFromThen Int)+ , value "enumFromThen" (enumFromThen :: EnumFromThen Bool)+ , value "enumFromThen" (enumFromThen :: EnumFromThen Char)+ ]+ where+ err = error $ "enumFromThen': unhandled type " ++ show (typ ex)+type EnumFromThen a = (a -> a -> [a])++(-...) :: Expr -> Expr -> Expr+ex -... ey = (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value ",.." (enumFromThen :: EnumFromThen Int)+ , value ",.." (enumFromThen :: EnumFromThen Bool)+ , value ",.." (enumFromThen :: EnumFromThen Char)+ ]+ where+ err = error $ "-..-: unhandled type " ++ show (typ ex)++enumFromThenTo' :: Expr -> Expr -> Expr -> Expr+enumFromThenTo' ex ey ez = (:$ ez) . (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value "enumFromThenTo" (enumFromThenTo :: EnumFromThenTo Int)+ , value "enumFromThenTo" (enumFromThenTo :: EnumFromThenTo Bool)+ , value "enumFromThenTo" (enumFromThenTo :: EnumFromThenTo Char)+ ]+ where+ err = error $ "enumFromThenTo': unhandled type " ++ show (typ ex)+type EnumFromThenTo a = (a -> a -> a -> [a])++(-...-) :: Expr -> Expr -> Expr -> Expr+(ex -...- ey) ez = (:$ ez) . (:$ ey) . headOr err $ mapMaybe ($$ ex)+ [ value ",.." (enumFromThenTo :: EnumFromThenTo Int)+ , value ",.." (enumFromThenTo :: EnumFromThenTo Bool)+ , value ",.." (enumFromThenTo :: EnumFromThenTo Char)+ ]+ where+ err = error $ "-..-: unhandled type " ++ show (typ ex)
src/Data/Express/Instances.hs view
@@ -273,8 +273,11 @@ mkComparisonLE = mkComparison "<=" lookupName :: [Expr] -> Expr -> String-lookupName is e = fromMaybe "x" $ eval "x" <$> findValidApp es e+lookupName is e = fromMaybe d $ eval "x" <$> findValidApp es e where+ t = typ e+ d | isFunTy t = "f"+ | otherwise = 'x' : replicate (countListTy t) 's' es = [e | e@(Value "name" _) <- is] lookupNames :: [Expr] -> Expr -> [String]
src/Data/Express/Utils/Typeable.hs view
@@ -24,6 +24,7 @@ , elementTy , typesIn , typesInList+ , countListTy , (->::) , module Data.Typeable )@@ -111,6 +112,11 @@ isListTy t = case splitTyConApp t of (con,[_]) | con == listTyCon -> True _ -> False++countListTy :: TypeRep -> Int+countListTy t = case splitTyConApp t of+ (con,[t']) | con == listTyCon -> 1 + countListTy t'+ _ -> 0 mkComparisonTy :: TypeRep -> TypeRep mkComparisonTy a = a ->:: a ->:: boolTy
stack.yaml view
@@ -4,4 +4,4 @@ - . extra-deps:-- leancheck-0.9.4+- leancheck-0.9.10
test/canon.hs view
@@ -110,7 +110,37 @@ , holds n $ \e -> head (canonicalVariations e) == mostGeneralCanonicalVariation e , holds n $ \e -> last (canonicalVariations e) == mostSpecificCanonicalVariation e+++ -- Behaviour on unhandled types --+ , map show (canonicalVariations a_)+ == ["x :: A"]++ , map show (canonicalVariations (faa_ :$ a_ :$ a_))+ == [ "f x y :: A"+ , "f x x :: A"+ ]++ , map show (canonicalVariations as_)+ == ["xs :: [A]"]++ , map show (canonicalVariations (appendA :$ as_ :$ as_))+ == [ "xs ++ ys :: [A]"+ , "xs ++ xs :: [A]"+ ] ]++a_ :: Expr+a_ = hole (undefined :: A)++as_ :: Expr+as_ = hole (undefined :: [A])++faa_ :: Expr+faa_ = hole (undefined :: A -> A -> A)++appendA :: Expr+appendA = value "++" ((++) :: [A] -> [A] -> [A]) -- O(1) bell number implementation -- only works up to 8
test/fixtures.hs view
@@ -174,4 +174,83 @@ -- if -- , evl (if' false zero one) == (1 :: Int) , evl (if' true two three) == (2 :: Int)++ -- enumFrom and enumFromTo+ , show (enumFrom' false) == "enumFrom False :: [Bool]"+ , evl (enumFrom' false) == [False,True]+ , show (enumFromTo' zero four) == "enumFromTo 0 4 :: [Int]"+ , evl (enumFromTo' zero four) == [0,1,2,3,4 :: Int]++ -- [<n> .. <m>] --+ , show ((-..) false) == "[False ..] :: [Bool]"+ , evl ((-..) false) == [False,True]+ , show ((-..) true) == "[True ..] :: [Bool]"+ , evl ((-..) true) == [True]+ , show (false -..- false) == "[False .. False] :: [Bool]"+ , evl (false -..- false) == [False]+ , show (false -..- true) == "[False .. True] :: [Bool]"+ , evl (false -..- true) == [False,True]+ , show (true -..- false) == "[True .. False] :: [Bool]"+ , evl (true -..- false) == ([] :: [Bool])+ , show (true -..- true) == "[True .. True] :: [Bool]"+ , evl (true -..- true) == [True]++ , show ((-..) zero) == "[0..] :: [Int]"+ , show (zero -..- four) == "[0..4] :: [Int]"+ , evl (zero -..- four) == [0,1,2,3,4 :: Int]+ , show (minusTwo -..- minusOne) == "[-2 .. -1] :: [Int]"+ , evl (minusTwo -..- minusOne) == [-2,-1 :: Int]+ , show (minusTwo -..- two) == "[-2 .. 2] :: [Int]"+ , evl (minusTwo -..- two) == [-2,-1,0,1,2 :: Int]++ , show ((-..) ae) == "['a'..] :: [Char]"+ , show (ae -..- dee) == "['a'..'d'] :: [Char]"+ , evl (ae -..- dee) == "abcd"++ , show (xx -..- yy) == "[x..y] :: [Int]"+ , show (pp -..- qq) == "[p..q] :: [Bool]"+ , show (cc -..- dd) == "[c..d] :: [Char]"++ , show (zero -..- yy) == "[0..y] :: [Int]"+ , show (pp -..- true) == "[p .. True] :: [Bool]"+ , show (cc -..- zed) == "[c..'z'] :: [Char]"+ , show (ae -..- dd) == "['a'..d] :: [Char]"++ -- enumFromThen and enumFromThenTo+ , show (enumFromThen' false true) == "enumFromThen False True :: [Bool]"+ , evl (enumFromThen' false true) == [False,True]+ , show (enumFromThenTo' zero two four) == "enumFromThenTo 0 2 4 :: [Int]"+ , evl (enumFromThenTo' zero two four) == [0,2,4 :: Int]++ -- [<n>, <m> .. <o>] --+ , show ((-...) false true) == "[False, True ..] :: [Bool]"+ , evl ((-...) false true) == [False,True]+ , show ((-...) true false) == "[True, False ..] :: [Bool]"+ , evl ((-...) true false) == [True,False]+ , show ((false -...- false) true) == "[False, False .. True] :: [Bool]"+ , show ((false -...- true) true) == "[False, True .. True] :: [Bool]"+ , evl ((false -...- true) true) == [False,True]++ , show ((-...) zero one) == "[0,1..] :: [Int]"+ , show ((zero -...- two) four) == "[0,2..4] :: [Int]"+ , evl ((zero -...- two) four) == [0,2,4 :: Int]+ , show ((minusTwo -...- one) minusOne) == "[-2, 1 .. -1] :: [Int]"+ , evl ((minusTwo -...- one) minusOne) == [-2 :: Int]+ , show ((minusTwo -...- zero) two) == "[-2, 0 .. 2] :: [Int]"+ , evl ((minusTwo -...- zero) two) == [-2,0,2 :: Int]++ , show ((-...) ae bee) == "['a','b'..] :: [Char]"+ , show ((ae -...- bee) dee) == "['a','b'..'d'] :: [Char]"+ , evl ((ae -...- bee) dee) == "abcd"+ , show ((ae -...- dee) zed) == "['a','d'..'z'] :: [Char]"+ , evl ((ae -...- dee) zed) == "adgjmpsvy"++ , show ((xx -...- yy) zz) == "[x,y..z] :: [Int]"+ , show ((pp -...- qq) rr) == "[p,q..r] :: [Bool]"+ , show ((cc -...- dd) cc) == "[c,d..c] :: [Char]"++ , show ((zero -...- yy) zz) == "[0,y..z] :: [Int]"+ , show ((pp -...- true) true) == "[p, True .. True] :: [Bool]"+ , show ((cc -...- dd) zed) == "[c,d..'z'] :: [Char]"+ , show ((ae -...- dd) cc) == "['a',d..c] :: [Char]" ]
test/instances.hs view
@@ -32,6 +32,34 @@ , eval undefined (nameFor (undefined :: Bool) :$ qq) == "p" , length (validApps functions one) == 5++ -- when lookupName does not find a name instance,+ -- it defaults to x, xs, xss, xsss, ...+ -- depending on the number of list nestings+ , lookupName [] (val (0::Int)) == "x"+ , lookupName [] (val [0::Int]) == "xs"+ , lookupName [] (val [[0::Int]]) == "xss"+ , lookupName [] (val [[[0::Int]]]) == "xsss"++ , lookupName [] (val False) == "x"+ , lookupName [] (val [False]) == "xs"+ , lookupName [] (val [[False]]) == "xss"+ , lookupName [] (val [[[False]]]) == "xsss"++ , lookupName [] (val (0::A)) == "x"+ , lookupName [] (val [0::A]) == "xs"+ , lookupName [] (val [[0::A]]) == "xss"+ , lookupName [] (val [[[0::A]]]) == "xsss"++ , lookupName preludeNameInstances (val False) == "p"+ , lookupName preludeNameInstances (val [False]) == "ps"+ , lookupName preludeNameInstances (val [[False]]) == "xss" -- XXX: caveat+ , lookupName preludeNameInstances (val [[[False]]]) == "xsss" -- XXX: caveat++ , lookupName preludeNameInstances (val (0::A)) == "x"+ , lookupName preludeNameInstances (val [0::A]) == "xs"+ , lookupName preludeNameInstances (val [[0::A]]) == "xss"+ , lookupName preludeNameInstances (val [[[0::A]]]) == "xsss" ] where eqFor = head . reifyEq
test/show.hs view
@@ -96,4 +96,28 @@ , show (hole (undefined :: Int -> Int) :$ xx) == "_ x :: Int" , show (hole (undefined :: Int -> Int -> Int) :$ one :$ xx) == "_ 1 x :: Int" , show (hole (undefined :: Int -> Int -> Int) :$ i_ :$ i_) == "_ _ _ :: Int"++ -- A type --+ , show (hole (undefined :: A)) == "_ :: A"+ , show (val (0 :: A)) == "0 :: A"+ , show (val (1 :: A)) == "1 :: A"+ , show (val (2 :: A)) == "2 :: A"+ , show (var "x" (undefined :: A)) == "x :: A"+ , show (value "id" (id :: A -> A) :$ var "x" (undefined :: A)) == "id x :: A"++ -- B type --+ , show (hole (undefined :: B)) == "_ :: B"+ , show (val (0 :: B)) == "0 :: B"+ , show (val (1 :: B)) == "1 :: B"+ , show (val (2 :: B)) == "2 :: B"+ , show (var "x" (undefined :: B)) == "x :: B"+ , show (value "id" (id :: B -> B) :$ var "x" (undefined :: B)) == "id x :: B"++ -- [A] type --+ , show (hole (undefined :: [A])) == "_ :: [A]"+ , show (val ([0] :: [A])) == "[0] :: [A]"+ , show (val ([3,1] :: [A])) == "[3,1] :: [A]"+ , show (val ([0,1,2] :: [A])) == "[0,1,2] :: [A]"+ , show (var "xs" (undefined :: [A])) == "xs :: [A]"+ , show (value "id" (id :: [A] -> [A]) :$ var "xs" (undefined :: [A])) == "id xs :: [A]" ]