packages feed

idris 0.12.3 → 0.99

raw patch · 220 files changed

+4416/−3003 lines, 220 filesdep ~aesondep ~optparse-applicativedep ~safesetup-changedPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: aeson, optparse-applicative, safe

API changes (from Hackage documentation)

- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Bytecode.BC
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Bytecode.Reg
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.CodegenCommon.CodegenInfo
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Defunctionalise.DAlt
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Defunctionalise.DDecl
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Defunctionalise.DExp
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.Export
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.ExportIFace
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.FDesc
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.LAlt
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.LDecl
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.LExp
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.LOpt
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.LVar
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Lang.PrimFn
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Portable.CodegenFile
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Simplified.SAlt
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Simplified.SDecl
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON IRTS.Simplified.SExp
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON Idris.Core.CaseTree.CaseType
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON Idris.Core.TT.ArithTy
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON Idris.Core.TT.Const
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON Idris.Core.TT.IntTy
- IRTS.Portable: instance Data.Aeson.Types.Class.ToJSON Idris.Core.TT.Name
- IRTS.System: getDataDir :: IO FilePath
- IRTS.System: getTargetDir :: IO String
- Idris.AbsSyntaxTree: Coinductive :: FnOpt
- Idris.AbsSyntaxTree: PkgMkDoc :: String -> Opt
- Idris.AbsSyntaxTree: ShowLibdir :: Opt
- Idris.Core.Elaborate: hnf_compute :: Elab' aux ()
- Idris.Core.Evaluate: [cases_inlined] :: CaseDefs -> !([Name], SC)
- Idris.Core.Evaluate: [cases_totcheck] :: CaseDefs -> !([Name], SC)
- Idris.Core.Evaluate: hnf :: Context -> Env -> TT Name -> TT Name
- Idris.Core.ProofState: HNF_Compute :: Tactic
- Idris.Coverage: Delayed :: Guardedness
- Idris.Coverage: Guarded :: Guardedness
- Idris.Coverage: Toplevel :: Guardedness
- Idris.Coverage: Unguarded :: Guardedness
- Idris.Coverage: allNothing :: [Maybe a] -> Bool
- Idris.Coverage: buildSCG :: (FC, Name) -> Idris ()
- Idris.Coverage: buildSCG' :: IState -> Name -> [(Term, Term)] -> [Name] -> [SCGEntry]
- Idris.Coverage: calcTotality :: FC -> Name -> [([Name], Term, Term)] -> Idris Totality
- Idris.Coverage: checkAllCovering :: FC -> [Name] -> Name -> Name -> Idris ()
- Idris.Coverage: checkDeclTotality :: (FC, Name) -> Idris Totality
- Idris.Coverage: checkMP :: IState -> Name -> Int -> MultiPath -> Totality
- Idris.Coverage: checkPositive :: [Name] -> (Name, Type) -> Idris Totality
- Idris.Coverage: checkSizeChange :: Name -> Idris Totality
- Idris.Coverage: checkTotality :: [Name] -> FC -> Name -> Idris Totality
- Idris.Coverage: collapse :: [Totality] -> Totality
- Idris.Coverage: collapse' :: Totality -> [Totality] -> Totality
- Idris.Coverage: collapseNothing :: [(Maybe a, b)] -> [(Maybe a, b)]
- Idris.Coverage: data Guardedness
- Idris.Coverage: delazy :: TT Name -> TT Name
- Idris.Coverage: delazy' :: Bool -> TT Name -> TT Name
- Idris.Coverage: genAll :: IState -> (Bool, [PTerm]) -> [PTerm]
- Idris.Coverage: instance GHC.Show.Show Idris.Coverage.Guardedness
- Idris.Coverage: mkMultiPaths :: IState -> MultiPath -> [SCGEntry] -> [MultiPath]
- Idris.Coverage: noPartial :: [Totality] -> Totality
- Idris.Coverage: totalityCheckBlock :: Idris ()
- Idris.Coverage: type MultiPath = [SCGEntry]
- Idris.Coverage: upd :: t -> PArg' t -> PArg' t
- Idris.Coverage: verifyTotality :: (FC, Name) -> Idris ()
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Bytecode.BC
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Bytecode.Reg
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.CodegenCommon.CodegenInfo
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Defunctionalise.DAlt
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Defunctionalise.DDecl
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Defunctionalise.DExp
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.Export
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.ExportIFace
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.FDesc
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.LAlt
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.LDecl
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.LExp
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.LOpt
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.LVar
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Lang.PrimFn
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Portable.CodegenFile
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Simplified.SAlt
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Simplified.SDecl
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON IRTS.Simplified.SExp
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON Idris.Core.CaseTree.CaseType
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON Idris.Core.TT.ArithTy
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON Idris.Core.TT.Const
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON Idris.Core.TT.IntTy
+ IRTS.Portable: instance Data.Aeson.Types.ToJSON.ToJSON Idris.Core.TT.Name
+ IRTS.System: getIdrisCRTSDir :: IO FilePath
+ IRTS.System: getIdrisDataDir :: IO String
+ IRTS.System: getIdrisDocDir :: IO FilePath
+ IRTS.System: getIdrisJSRTSDir :: IO FilePath
+ Idris.ASTUtils: opt_forceable :: Field OptInfo [Int]
+ Idris.AbsSyntax: addCGAllNames :: IState -> Name -> [Name] -> Idris ()
+ Idris.AbsSyntax: addFnOpt :: Name -> FnOpt -> Idris ()
+ Idris.AbsSyntax: getCGAllNames :: IState -> Name -> Maybe [Name]
+ Idris.AbsSyntaxTree: AllGuarded :: FnOpt
+ Idris.AbsSyntaxTree: OverlappingDictionary :: FnOpt
+ Idris.AbsSyntaxTree: PkgDocBuild :: String -> Opt
+ Idris.AbsSyntaxTree: PkgDocInstall :: String -> Opt
+ Idris.AbsSyntaxTree: ShowDocDir :: Opt
+ Idris.AbsSyntaxTree: ShowLibDir :: Opt
+ Idris.AbsSyntaxTree: UnfoldIface :: Name -> [Name] -> FnOpt
+ Idris.AbsSyntaxTree: [allCalls] :: CGInfo -> Maybe [Name]
+ Idris.AbsSyntaxTree: [forceable] :: OptInfo -> [Int]
+ Idris.AbsSyntaxTree: [interface_constraints] :: InterfaceInfo -> [PTerm]
+ Idris.AbsSyntaxTree: [interface_impparams] :: InterfaceInfo -> [Name]
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.ArgOpt
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.PAltType
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.PTerm
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.Plicity
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.PunInfo
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord Idris.AbsSyntaxTree.Static
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord t => GHC.Classes.Ord (Idris.AbsSyntaxTree.PArg' t)
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord t => GHC.Classes.Ord (Idris.AbsSyntaxTree.PDo' t)
+ Idris.AbsSyntaxTree: instance GHC.Classes.Ord t => GHC.Classes.Ord (Idris.AbsSyntaxTree.PTactic' t)
+ Idris.Core.CaseTree: CoverageCheck :: [Int] -> Phase
+ Idris.Core.Elaborate: whnf_compute :: Elab' aux ()
+ Idris.Core.Elaborate: whnf_compute_args :: Elab' aux ()
+ Idris.Core.Evaluate: inlineSmall :: Context -> Env -> TT Name -> TT Name
+ Idris.Core.Evaluate: tcReducible :: Name -> Context -> Bool
+ Idris.Core.Evaluate: unfold :: Context -> Env -> [(Name, Int)] -> TT Name -> TT Name
+ Idris.Core.ProofState: WHNF_Compute :: Tactic
+ Idris.Core.ProofState: WHNF_ComputeArgs :: Tactic
+ Idris.Core.TT: Inferred :: (TT n) -> TT n
+ Idris.Core.TT: instance GHC.Classes.Ord Idris.Core.TT.ErrorReportPart
+ Idris.Core.TT: instance GHC.Classes.Ord Idris.Core.TT.Provenance
+ Idris.Core.TT: instance GHC.Classes.Ord Idris.Core.TT.Raw
+ Idris.Core.TT: instance GHC.Classes.Ord t => GHC.Classes.Ord (Idris.Core.TT.Err' t)
+ Idris.Core.TT: substRetTy :: TT n -> TT n
+ Idris.Core.WHNF: whnfArgs :: Context -> Env -> Term -> Term
+ Idris.Elab.Clause: checkPossibles :: ElabInfo -> FC -> Bool -> Name -> [PTerm] -> Idris [PTerm]
+ Idris.Elab.Clause: forceWith :: Ctxt OptInfo -> Term -> Term
+ Idris.Elab.Clause: getNamesToUnfold :: Name -> [Name] -> Term -> [Name]
+ Idris.Elab.Clause: getUnfolds :: [FnOpt] -> Maybe (Name, [Name])
+ Idris.Elab.Term: EImpossible :: ElabMode
+ Idris.Elab.Utils: hasEmptyPat :: Context -> Ctxt TypeInfo -> Term -> Bool
+ Idris.Elab.Utils: isEmpty :: Context -> Ctxt TypeInfo -> Type -> Bool
+ Idris.Info: getIdrisCRTSDir :: IO String
+ Idris.Info: getIdrisDataDir :: IO String
+ Idris.Info: getIdrisDocDir :: IO String
+ Idris.Info: getIdrisJSRTSDir :: IO String
+ Idris.Info.Show: showExitIdrisCRTSDir :: IO ()
+ Idris.Info.Show: showExitIdrisDataDir :: IO ()
+ Idris.Info.Show: showExitIdrisDocDir :: IO ()
+ Idris.Info.Show: showExitIdrisJSRTSDir :: IO ()
+ Idris.Info.Show: showIdrisCRTSDir :: IO ()
+ Idris.Info.Show: showIdrisDataDir :: IO ()
+ Idris.Info.Show: showIdrisDocDir :: IO ()
+ Idris.Info.Show: showIdrisJSRTSDir :: IO ()
+ Idris.PartialEval: ConstraintD :: PEArgType
+ Idris.PartialEval: ConstraintS :: PEArgType
+ Idris.Termination: Delayed :: Guardedness
+ Idris.Termination: Guarded :: Guardedness
+ Idris.Termination: Toplevel :: Guardedness
+ Idris.Termination: Unguarded :: Guardedness
+ Idris.Termination: allNothing :: [Maybe a] -> Bool
+ Idris.Termination: buildSCG :: (FC, Name) -> Idris ()
+ Idris.Termination: buildSCG' :: IState -> Name -> [(Term, Term)] -> [Name] -> [SCGEntry]
+ Idris.Termination: calcTotality :: FC -> Name -> [([Name], Term, Term)] -> Idris Totality
+ Idris.Termination: checkAllCovering :: FC -> [Name] -> Name -> Name -> Idris ()
+ Idris.Termination: checkDeclTotality :: (FC, Name) -> Idris Totality
+ Idris.Termination: checkIfGuarded :: Name -> Idris ()
+ Idris.Termination: checkMP :: IState -> Name -> Int -> MultiPath -> Totality
+ Idris.Termination: checkPositive :: [Name] -> (Name, Type) -> Idris Totality
+ Idris.Termination: checkSizeChange :: Name -> Idris Totality
+ Idris.Termination: checkTotality :: [Name] -> FC -> Name -> Idris Totality
+ Idris.Termination: collapse :: [Totality] -> Totality
+ Idris.Termination: collapse' :: Totality -> [Totality] -> Totality
+ Idris.Termination: collapseNothing :: [(Maybe a, b)] -> [(Maybe a, b)]
+ Idris.Termination: data Guardedness
+ Idris.Termination: delazy :: TT Name -> TT Name
+ Idris.Termination: delazy' :: Bool -> TT Name -> TT Name
+ Idris.Termination: instance GHC.Show.Show Idris.Termination.Guardedness
+ Idris.Termination: mkMultiPaths :: IState -> MultiPath -> [SCGEntry] -> [MultiPath]
+ Idris.Termination: noPartial :: [Totality] -> Totality
+ Idris.Termination: totalityCheckBlock :: Idris ()
+ Idris.Termination: type MultiPath = [SCGEntry]
+ Idris.Termination: verifyTotality :: (FC, Name) -> Idris ()
- IRTS.Lang: usedArg :: (Foldable t, Eq t1) => t t1 -> t1 -> [t1]
+ IRTS.Lang: usedArg :: (Eq t, Foldable t1) => t1 t -> t -> [t]
- Idris.AbsSyntax: expandImplementationScope :: t -> t1 -> [(Name, t3)] -> t2 -> PDecl' t3 -> PDecl' t3
+ Idris.AbsSyntax: expandImplementationScope :: t3 -> t2 -> [(Name, t1)] -> t -> PDecl' t1 -> PDecl' t1
- Idris.AbsSyntax: getPkgMkDoc :: Opt -> Maybe String
+ Idris.AbsSyntax: getPkgMkDoc :: Opt -> Maybe (Bool, String)
- Idris.AbsSyntaxTree: CGInfo :: [Name] -> [SCGEntry] -> [(Int, [UsageReason])] -> CGInfo
+ Idris.AbsSyntaxTree: CGInfo :: [Name] -> Maybe [Name] -> [SCGEntry] -> [(Int, [UsageReason])] -> CGInfo
- Idris.AbsSyntaxTree: CI :: Name -> [(Name, (Bool, FnOpts, PTerm))] -> [(Name, (Name, PDecl))] -> [PDecl] -> [Name] -> [(Name, Bool)] -> [Int] -> InterfaceInfo
+ Idris.AbsSyntaxTree: CI :: Name -> [(Name, (Bool, FnOpts, PTerm))] -> [(Name, (Name, PDecl))] -> [PDecl] -> [Name] -> [Name] -> [PTerm] -> [(Name, Bool)] -> [Int] -> InterfaceInfo
- Idris.AbsSyntaxTree: IBCFlags :: Name -> [FnOpt] -> IBCWrite
+ Idris.AbsSyntaxTree: IBCFlags :: Name -> IBCWrite
- Idris.AbsSyntaxTree: Optimise :: [(Int, Name)] -> Bool -> OptInfo
+ Idris.AbsSyntaxTree: Optimise :: [(Int, Name)] -> Bool -> [Int] -> OptInfo
- Idris.CmdOptions: getPkgMkDoc :: Opt -> Maybe String
+ Idris.CmdOptions: getPkgMkDoc :: Opt -> Maybe (Bool, String)
- Idris.Core.Elaborate: dumpprobs :: Show a => [(t, t1, t2, a)] -> [Char]
+ Idris.Core.Elaborate: dumpprobs :: Show a => [(t2, t1, t, a)] -> [Char]
- Idris.Core.Evaluate: CaseDefs :: !([Name], SC) -> !([Name], SC) -> !([Name], SC) -> !([Name], SC) -> CaseDefs
+ Idris.Core.Evaluate: CaseDefs :: !([Name], SC) -> !([Name], SC) -> CaseDefs
- Idris.Core.Evaluate: addCasedef :: Name -> ErasureInfo -> CaseInfo -> Bool -> SC -> Bool -> Bool -> [(Type, Bool)] -> [Int] -> [Either Term (Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> Type -> Context -> TC Context
+ Idris.Core.Evaluate: addCasedef :: Name -> ErasureInfo -> CaseInfo -> Bool -> SC -> Bool -> Bool -> [(Type, Bool)] -> [Int] -> [Either Term (Term, Term)] -> [([Name], Term, Term)] -> [([Name], Term, Term)] -> Type -> Context -> TC Context
- Idris.Core.ProofState: dropGiven :: (Foldable t1, Foldable t, Eq a) => t1 a -> [(a, TT a)] -> t a -> [(a, TT a)]
+ Idris.Core.ProofState: dropGiven :: (Foldable t, Foldable t1, Eq a) => t1 a -> [(a, TT a)] -> t a -> [(a, TT a)]
- Idris.Core.ProofState: keepGiven :: (Foldable t1, Foldable t, Eq a) => t1 a -> [(a, TT a)] -> t a -> [(a, TT a)]
+ Idris.Core.ProofState: keepGiven :: (Foldable t, Foldable t1, Eq a) => t1 a -> [(a, TT a)] -> t a -> [(a, TT a)]
- Idris.Core.Typecheck: errEnv :: [(t, Binder t1)] -> [(t, t1)]
+ Idris.Core.Typecheck: errEnv :: [(t1, Binder t)] -> [(t1, t)]
- Idris.Core.Typecheck: isHole :: (t, Binder t1) -> Bool
+ Idris.Core.Typecheck: isHole :: (t1, Binder t) -> Bool
- Idris.Core.WHNF: whnf :: Context -> Term -> Term
+ Idris.Core.WHNF: whnf :: Context -> Env -> Term -> Term
- Idris.Coverage: genClauses :: FC -> Name -> [Term] -> [PTerm] -> Idris [PTerm]
+ Idris.Coverage: genClauses :: FC -> Name -> [([Name], Term)] -> [PTerm] -> Idris [PTerm]
- Idris.Docs: InterfaceDoc :: Name -> d -> [FunDoc' d] -> [(Name, Maybe d)] -> [(Maybe Name, PTerm, (d, [(Name, d)]))] -> [PTerm] -> [PTerm] -> (Maybe (FunDoc' d)) -> Docs' d
+ Idris.Docs: InterfaceDoc :: Name -> d -> [FunDoc' d] -> [(Name, Maybe d)] -> [PTerm] -> [(Maybe Name, PTerm, (d, [(Name, d)]))] -> [PTerm] -> [PTerm] -> (Maybe (FunDoc' d)) -> Docs' d
- Idris.Elab.Clause: checkPossible :: ElabInfo -> FC -> Bool -> Name -> PTerm -> Idris Bool
+ Idris.Elab.Clause: checkPossible :: ElabInfo -> FC -> Bool -> Name -> PTerm -> Idris (Maybe PTerm)
- Idris.Elab.Term: pruneByType :: Env -> Term -> Type -> IState -> [PTerm] -> [PTerm]
+ Idris.Elab.Term: pruneByType :: Bool -> Env -> Term -> Type -> IState -> [PTerm] -> [PTerm]
- Idris.Elab.Utils: paramNames :: (Foldable t1, Eq t) => [TT t] -> t1 t -> [Int] -> [t]
+ Idris.Elab.Utils: paramNames :: (Eq t1, Foldable t) => [TT t1] -> t t1 -> [Int] -> [t1]
- Idris.Package: documentPkg :: [Opt] -> FilePath -> IO ()
+ Idris.Package: documentPkg :: [Opt] -> (Bool, FilePath) -> IO ()
- Idris.Package: testPkg :: [Opt] -> FilePath -> IO ()
+ Idris.Package: testPkg :: [Opt] -> FilePath -> IO ExitCode
- Idris.Parser.Expr: bindsymbol :: (DeltaParsing m, LookAheadParsing m) => [ArgOpt] -> Static -> t -> m Plicity
+ Idris.Parser.Expr: bindsymbol :: (LookAheadParsing m, DeltaParsing m) => [ArgOpt] -> Static -> t -> m Plicity
- Idris.PartialEval: ImplicitD :: PEArgType
+ Idris.PartialEval: ImplicitD :: Name -> PEArgType
- Idris.PartialEval: ImplicitS :: PEArgType
+ Idris.PartialEval: ImplicitS :: Name -> PEArgType
- Idris.PartialEval: mkPE_TermDecl :: IState -> Name -> Name -> [(PEArgType, Term)] -> PEDecl
+ Idris.PartialEval: mkPE_TermDecl :: IState -> Name -> Name -> PTerm -> [(PEArgType, Term)] -> PEDecl

Files

.travis.yml view
@@ -12,8 +12,6 @@       env: CABALVER="1.24" GHCVER="8.0.1" TESTS="test_c"       compiler: ": #GHC 8.0.1"     - env: CABALVER="1.20" GHCVER="7.6.3" TESTS="test_c"-      # separate caches for different compiler versions-      # until https://github.com/travis-ci/travis-ci/issues/4393 is resolved       compiler: ": #GHC 7.6.3"       addons: {apt: {packages: [cabal-install-1.20,ghc-7.6.3,cppcheck,hscolour], sources: [hvr-ghc]}}     - env: CABALVER="1.20" GHCVER="7.8.4" TESTS="test_c"@@ -58,9 +56,9 @@   - env   - if [[ $TRAVIS_OS_NAME == 'osx' ]];     then-        brew update; brew install ghc; brew install cabal-install;-        brew install libffi; brew install pkg-config; brew install cppcheck;-        brew install gnu-sed;+        brew update;+        brew outdated pkgconfig || brew install pkgconfig;+        brew install ghc cabal-install libffi cppcheck gnu-sed;         export PATH=$HOME/.cabal/bin:$PATH;         export SED=gsed;         export ZCAT=gzcat;
CHANGELOG.md view
@@ -1,11 +1,11 @@-# New in 0.13:+# New in 0.99:  ## Language updates  * `record` syntax now allows updating fields, including nested fields,   by applying a function using the `$=` operator.  For example: -  ```+  ```idris   record Score where          constructor MkScore          correct : Nat@@ -21,6 +21,16 @@                         score->attempted $= (+1) } st   ``` +* Implicit parameter to interfaces are now allowed. For example:++  ```idris+  interface Shows (ts : Vect k Type) where+    shows : HVect ts -> Vect k String+  ```+  In this interface, `k` is an implicit parameter, but previously needed to+  be explicit++ ## Library updates  * The File Effect has been updated to take into account changes in@@ -40,18 +50,25 @@  * Idris' documentation system now displays the documentation for auto   implicits in the output of `:doc`. This is tested for in `docs005`.- * New command line flag `--info` that displays information about the installation.- * New command line flag `--sourcepath <dir>` that allows adding directories to the source search path.+* Allow 'installation' of a package's IdrisDoc documentation into a central location. The default location is the subdirectory `docs` of Idris' data directory.+  * New flag `--installdoc <ipkg>` provided to install documentation+  * New flag `--docdir` provided to show default documentation installation location.+  * New environment variable `IDRIS_DOC_PATH` to allow specification of an alternative installation path for documentation.+* Semantic meaning behind several environment variables has been clarified in documentation and code. See compilation section of the reference manual for more details.+* Interface parameter constraints are now printed in the output of `:doc`. This+  is tested for in `docs006`.+ ## Miscellaneous updates +* New, faster, better, implementation of the coverage checker * The test suite now uses [tasty-golden](https://hackage.haskell.org/package/tasty-golden). New tests must be registered in `test/TestData.hs`, as explained in the relevant `README.md`. * Added OSX and Windows continous integration with Travis and Appveyor.  ## UI Changes -* The :e command can now handle an $EDITOR with arguments in it, like "emacs -nw" +* The :e command can now handle an $EDITOR with arguments in it, like "emacs -nw"   # New in 0.12:
CONTRIBUTORS view
@@ -1,56 +1,215 @@ Thanks to the following for their help and contributions: -Ozgur Akgun+a3gis+Aaron Craelius+Adam Sandberg Eriksson+Adam Schønemann+Adolfo Ochagavía Ahmad Salim Al-Sibahi-Edward Chadwick Amsden-Michael R. Bernstein-Jan Bessai-Nicola Botta-Edwin Brady-Vitaly Bragilevsky-Jakob Brünker+Aistis Raulinaitis+Alex Feldman-Crough+Alexander Berntsen+Alexander Shabalin Alyssa Carter+Andreas Bogk+Andreas Reuleaux+Andrei Dziahel+Andrew Cann+Andrew Stewart Gibson+Andy Morris+Anthony Cantor+Anthony---faineance+Apostolis Xekoukoulotakis+Athan Clark+Bartosz Przygoda+Ben Gamari+Ben Sherman+ben-schulz+Benjamin Hodgson+Benjamin Saunders+Björn Aili+bmastenbrook+Brent Yorgey+Brian Koropoff+Brian McKenna+Bryn Keller+Calvin Beck+Carsten König Carter Charbonneau+Casper M. H. Holmgreen+cchantep+Cezar Ionescu+Chao-Hong Chen+Chetan Taralekar+Chris Allen+Christopher Schwaab+Cliff Harvey+Cliff L. Biffle+Colin Adams+comco+Craig McLaughlin+cswords+Daniel Waterworth+Daniël Heres+Darin Morrison+David Feuer+David Kraeutmann David Raymond Christiansen-Aaron Craelius-Jason Dagit-Adam Sandberg Eriksson-Guglielmo Fachini-Simon Fowler+defanor+Dennis Griffith+Dirk Ullrich+Dmitry Bushev+Dmitry Tsygankov+Dominic Mulligan+Dominik Peteler+Echo Nolan+Eduard Nicodei+Edward Amsden+Edward O'Callaghan+Edwin Brady+Eric Casteleijn+Eric Mertens+Eric Walkingshaw+Eric Weinstein+Erkin Batu Altunbaş+Ertugrul Söylemez+EvanR+Fabian Thorand+fiendfan1+Franklin Chen+Frederic Koehler+Friedrich von Never+Gabe McArthur+Gabor Greif+Gabriel Garcia+George Leontiev+Gleb Alexeyev Google-Zack Grannan-Sean Hunt-Cezar Ionescu+Greg Anderson+Greg Pfeil+Guglielmo Fachini+Hannes Mehnert Heath Johns+Heather+Hector A. Escobedo IV+identical snowflake+Ignas Vyšniauskas+Ilan Godik+Imuli Irene Knapp-Paul Koerbitz-Niklas Larsson-Shea Levy+Jack Henahan+Jacob Mitchell+Jakob Brünker+Jan Bessai+Jan de Muijnck-Hughes+Jan Doms+Jan Stolarek+Jason Dagit+Jason Gross+Jean-Remi Desjardins+Jeff Hemphill+Jefferson Carpenter+Jens Petersen+Jeremy W. Sherman+jhegedus42+joe9+Johannes Griebler+John Connor+John Dobronszki+John Wiegley+Jon Atack+Jonas Westerlund+Jonathan Sterling+Joseph Huang+Josh Vera+JP Smith+Juliusz Chroboczek+Jurriën Stutterheim+Jürgen Peters+Karlos Kaeeikaas+Kester Tong+lambdadomain+Langston Barrett+Leif Warner+Leon Schoorl+Luke Palmer+Mark Farrell+Markus Klink+Markus Pfeiffer Mathnerd314-Hannes Mehnert+Mattias Lundell+Matvey B. Aksenov+Matúš Tejiščák+Maxim Ivanov Mekeor Melire Melissa Mozifian-Jan de Muijnck-Hughes-Dominic Mulligan-Echo Nolan-Tom Prince-raichoo+Melvar Chen+Michael A. Smith+Michael Bernstein+Michael Gilliland+Michael Hensler+Michael Maloney+Michael McGirr+Michael Thompson+Michael Weiss+Miikka Koskinen+Mitchell Rosen+Miëtek Bak+Mort Yao+Nathan Dinsmore+Nicola Botta+Niklas Larsson+Norbert Melzer+Oskar Wickström+Ozgur Akgun+Patrik Jansson+Paul Koerbitz+Per Fredelius+Peter Minten Philip Rasmussen-Aistis Raulinaitis+PoroCYon+raichoo Reynir Reynisson+Ricky Elrod+Robert Clipsham+Robert Edström+Ross Meikleham+Ryan Scott+Sam Elliott+Sam T+Saurabh Rawat+Sean Hunt+Sebastian de Bellefon+Sebastian Dröge Seo Sanghyeon-Benjamin Saunders-Alexander Shabalin-Jeremy W. Sherman-Timo Petteri Sinnemäki-JP Smith+Sergei Trofimovich+Shane Pearman+Shea Levy+Simon Fowler startling-Chetan T-Matúš Tejiščák-Dirk Ullrich-Leif Warner-Daniel Waterworth-Eric Weinstein-Jonas Westerlund-Björn Aili+Stefan Bleibinhaus+stepcut+Stephen Drodge+Steven Shaw+Stuart Gale+suhorng+Sune Alkærsig+Sven Koschnicke+tdidriksen+Tenor Biel+Thomas Cooper+Tim Dysinger+Tim McGilchrist+Timo Petteri Sinnemäki+Tom Prince+TorosFanny+Trevor Elliott+uwap+Vitaly Bragilevsky+xged+XIE Yuheng+Yacine Hmito+Zack Grannan Zheng Jihui+zjhmale+Сухарик
README.md view
@@ -6,6 +6,7 @@ [![Hackage](https://budueba.com/hackage/idris)](https://hackage.haskell.org/package/idris) [![Stackage LTS](http://stackage.org/package/idris/badge/lts)](http://stackage.org/lts/package/idris) [![Stackage Nightly](http://stackage.org/package/idris/badge/nightly)](http://stackage.org/nightly/package/idris)+[![IRC](https://img.shields.io/badge/IRC-%23idris-1e72ff.svg?style=flat)](https://www.irccloud.com/invite?channel=%23idris&hostname=irc.freenode.net&port=6697&ssl=1)  Idris (http://idris-lang.org/) is a general-purpose functional programming language with dependent types.
Setup.hs view
@@ -254,7 +254,7 @@       target = datadir $ L.absoluteInstallDirs pkg local copy        installStdLib = do-        let target' = target </> "libs"+        let target' = target -- </> "libs"         putStrLn $ "Installing libraries in " ++ target'         makeInstall "libs" target' @@ -267,7 +267,6 @@          let mandest = mandir (L.absoluteInstallDirs pkg local copy) ++ "/man1"          notice verbosity $ unwords ["Copying man page to", mandest]          installOrdinaryFiles verbosity mandest [("man", "idris.1")]-        makeInstall src target =          make verbosity [ "-C", src, "install" , "TARGET=" ++ target, "IDRIS=" ++ idrisCmd local]
codegen/idris-codegen-c/Main.hs view
@@ -1,19 +1,21 @@ module Main where -import Idris.Core.TT import Idris.AbsSyntax+import Idris.Core.TT import Idris.ElabDecls import Idris.Main-import IRTS.Compiler import IRTS.CodegenC+import IRTS.Compiler +import Util.System++import Paths_idris++import Control.Monad import System.Environment import System.Exit-import Control.Monad -import Paths_idris -import Util.System  data Opts = Opts { inputs :: [FilePath],                    interface :: Bool,
codegen/idris-codegen-javascript/Main.hs view
@@ -1,16 +1,17 @@ module Main where -import Idris.Core.TT import Idris.AbsSyntax+import Idris.Core.TT import Idris.ElabDecls import Idris.Main-import IRTS.Compiler import IRTS.CodegenJavaScript+import IRTS.Compiler +import Paths_idris+ import System.Environment import System.Exit -import Paths_idris  data Opts = Opts {                    inputs :: [FilePath]
codegen/idris-codegen-node/Main.hs view
@@ -1,17 +1,16 @@ module Main where -import Idris.Core.TT import Idris.AbsSyntax+import Idris.Core.TT import Idris.ElabDecls import Idris.Main--import IRTS.Compiler import IRTS.CodegenJavaScript+import IRTS.Compiler +import Paths_idris+ import System.Environment import System.Exit--import Paths_idris  data Opts = Opts { inputs :: [FilePath]                  , output :: FilePath
docs/conf.py view
@@ -59,9 +59,9 @@ # built documents. # # The short X.Y version.-version = '0.12.3'+version = '0.99' # The full version, including alpha/beta/rc tags.-release = '0.12.3'+release = '0.99'  # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages.@@ -216,16 +216,76 @@  # -- Options for LaTeX output --------------------------------------------- +latex_title_page = r'''+\begin{titlepage}+    \vspace*{\fill}+    \begin{center}+        \includegraphics[width=0.25\textwidth]{idris-512x512.png}\par+        \vspace{1cm}+        {\huge\sffamily\bfseries Documentation for the Idris Language\par}+        \vspace{1cm}+        {\Large Version \version\par}+    \end{center}+    \vspace*{\fill}+\end{titlepage}+'''+ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). 'papersize': 'a4paper', +'fontpkg': '',+'inputenc': '',+'utf8extra': '',+'releasename': 'Version',+ # The font size ('10pt', '11pt' or '12pt'). 'pointsize': '10pt',  # Additional stuff for the LaTeX preamble.-#'preamble': '',+'preamble': r'''+\usepackage{lmodern}+\usepackage[T1]{fontenc}+\usepackage[utf8x]{inputenc}+\usepackage{titlesec}+%+\usepackage{fancyhdr}+\fancypagestyle{plain}{%+  \renewcommand{\headrulewidth}{0pt}%+  \fancyhf{}%+  \fancyfoot[C]{\textsf{\thepage}}+}+\pagestyle{fancy}+\fancyhf{}+\fancyhead[LE,RO]{\textsf{\bfseries{v\version}}}+\fancyhead[LO,RE]{\textsf{\bfseries\leftmark}}+%\fancyhead[LO]{\textsf{\bfseries{\leftmark}}}+%\fancyhead[RO]{\textsf{\bfseries{v\version}}}+%\fancyhead[RE]{\textsf{\bfseries{\leftmark}}}+%\fancyhead[LE]{\textsf{\bfseries{v\version}}}+\fancyfoot[C]{\textsf{\thepage}}+\renewcommand{\footrulewidth}{0pt}+\renewcommand{\headrulewidth}{0pt}+%+\usepackage[font={small,it}]{caption}+\titleformat{\section}+  {\normalfont\sffamily\Large\bfseries\color{black}}+  {\thesection}{1em}{}+\titleformat{\subsection}+  {\sffamily\large\bfseries\color{black}}+  {\thesubsection}{1em}{}+\titleformat{\subsubsection}+  {\sffamily\normalsize\bfseries\color{black}}+  {\thesubsubsection}{1em}{}+\titleformat{\paragraph}{\normalfont\normalsize\slshape}{\theparagraph}{1em}{}+\setlength{\parskip}{1em}+%+\hypersetup{colorlinks = false}+\definecolor{VerbatimBorderColor}{rgb}{1,1,1}+''', +'maketitle': latex_title_page+ # Latex figure (float) alignment #'figure_align': 'htbp', }@@ -234,15 +294,16 @@ # (source start file, target name, title, #  author, documentclass [howto, manual, or own class]). latex_documents = [-  ('tutorial/index',  'idris-tutorial.tex',  u'The Idris Tutorial',    u'The Idris Community', 'manual'),-  ('guides/index',    'idris-guides.tex',    u'Idris Tutorial Series', u'The Idris Community', 'manual'),-#  ('reference/index', 'idris-reference.tex', u'The Idris Reference',   u'The Idris Community', 'manual'),-    ('effects/index',  'eff-tutorial.tex',  u'The Effects Tutorial',    u'The Idris Community', 'manual')-    ]+  ('index',  'idris.tex',  u'Documentation for the Idris Language',    u'The Idris Community', 'report')+] ++latex_show_pagerefs = True+latex_show_url = 'footnote'+ # The name of an image file (relative to this directory) to place at the top of # the title page.-#latex_logo = None+latex_logo = '../icons/idris-512x512.png'  # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters.
docs/effects/simpleeff.rst view
@@ -495,8 +495,8 @@     Env = List (String, Integer)      eval : Expr -> Eff Integer [EXCEPTION String, STATE Env]-    eval (Val x) = return x-    eval (Add l r) = return $ !(eval l) + !(eval r)+    eval (Val x)   = pure x+    eval (Add l r) = pure $ !(eval l) + !(eval r)  Note that we are using ``!``-notation to avoid having to bind subexpressions in a ``do`` block. Next, we add a case for evaluating@@ -506,7 +506,7 @@      eval (Var x) = case lookup x !get of                         Nothing => raise $ "No such variable " ++ x-                        Just val => return val+                        Just val => pure val  This retrieves the state (with ``get``, supported by the ``STATE Env`` effect) and raises an exception if the variable is not in the@@ -559,7 +559,7 @@      eval (Random upper) = do val <- rndInt 0 upper                              putStrLn (show val)-                             return val+                             pure val  If we try this without extending the effects list, we would see an error something like the following:
docs/guides/type-providers-ffi.rst view
@@ -53,8 +53,8 @@       putStrLn "I'm sorry, I don't know how big size_t is. Can you tell me, in bytes?"       resp <- getLine       case readInt resp of-         Just sizeTSize => return (Provide sizeTSize)-         Nothing => return (Error "I'm sorry, I don't understand.")+         Just sizeTSize => pure (Provide sizeTSize)+         Nothing => pure (Error "I'm sorry, I don't understand.")     -- the readInt function is left as an exercise  We assume that whoever's compiling the library knows the size of
docs/listing/idris-prompt-helloworld.txt view
@@ -1,7 +1,7 @@ $ idris hello.idr      ____    __     _     /  _/___/ /____(_)____-    / // __  / ___/ / ___/     Version 0.12.3+    / // __  / ___/ / ___/     Version 0.99   _/ // /_/ / /  / (__  )      http://www.idris-lang.org/  /___/\__,_/_/  /_/____/       Type :? for help 
docs/listing/idris-prompt-interp.txt view
@@ -1,7 +1,7 @@ $ idris interp.idr      ____    __     _     /  _/___/ /____(_)____-    / // __  / ___/ / ___/     Version 0.12.3+    / // __  / ___/ / ___/     Version 0.99   _/ // /_/ / /  / (__  )      http://www.idris-lang.org/  /___/\__,_/_/  /_/____/       Type :? for help 
docs/listing/idris-prompt-start.txt view
@@ -1,7 +1,7 @@ $ idris     ____    __     _    /  _/___/ /____(_)____-   / // __  / ___/ / ___/     Version 0.12.3+   / // __  / ___/ / ___/     Version 0.99  _/ // /_/ / /  / (__  )      http://www.idris-lang.org/ /___/\__,_/_/  /_/____/       Type :? for help 
docs/reference/compilation.rst view
@@ -86,22 +86,30 @@  * `IDRIS_CC` Change the `C` compiler used by the `C` backend. * `IDRIS_CFLAGS` Change the `C` flags passed to the `C` compiler.-* `TARGET`   Change the target directory to generate files.-* `IDRIS_LIBRARY_PATH` Change the location of where installed packages are found.+* `TARGET`   Change the target directory i.e. `data dir` where Idris installs files when installing using Cabal/Stack.+* `IDRIS_LIBRARY_PATH` Change the location of where installed packages are found/installed.+* `IDRIS_DOC_PATH`  Change the location of where generated idrisdoc for packages are installed. -Alternativly, and perhaps a cleaner approach is to configure these-options using the CLI options.  Idris also supports options to augment-the paths used, and pass options to the code generator backend.+.. note:: -The option `--cg-opt <ARG>` can be used to pass options to the code-generator. The format of `<ARG>` is dependent on the selected backend.+   In versions of Idris prior to 0.12.3 the environment variables+   `IDRIS_LIBRARY_PATH` and `TARGET` were both used to affect the+   installation of single packages and direct where Idris installed+   its data. The meaning of these variables has changed, and command+   line options are preferred when changing where individual packages+   are installed. -Further, Idris does support multiple include paths.  The CLI option-`-i <dir>` allows you to add a directory to the library search path; this-option can be used multiple times. This is a cleaner option when you-wish to add single directories to the `IDRIS_LIBRARY_PATH` than-ammending `IDRIS_LIBRARY_PATH` directly.-To add directories to the source search path, use the `--sourcepath <dir>` option.+The CLI option `--ibcsubdir` can be used to direct where generated IBC+files are placed.  However, this means Idris will install files in a+non-standard location separate from the rest of the installed+packages. The CLI option `--idrispath <dir>` allows you to add a+directory to the library search path; this option can be used multiple+times and can be shortened to `-i <dir>`. Similary, the `--sourcepath+<dir>` option can be used to add directories to the source search+path. There is no shortened version for this option as `-s` is a+reserved flag. -Moreover, rather than using `TARGET` the CLI option `--ibcsubdir` can-be used to direct where built IBC files are placed.+Further, Idris also supports options to augment the paths used, and+pass options to the code generator backend.  The option `--cg-opt+<ARG>` can be used to pass options to the code generator. The format+of `<ARG>` is dependent on the selected backend.
docs/reference/ffi.rst view
@@ -361,4 +361,4 @@       timeout <- jscall "setTimeout(%0, %1)"                         (JsFn (() -> JS_IO ()) -> Int -> JS_IO Ptr)                         (MkJsFn f) millis-      return $ MkTimeout timeout+      pure $ MkTimeout timeout
docs/reference/uniqueness-types.rst view
@@ -212,7 +212,7 @@     foo xs = do let f = \x : Int => showU xs                 putStrLn $ free xs                 putStrLn $ f 42-                return ()+                pure ()  Since ``lend`` is implicit, in practice for functions to lend and borrow values merely requires the argument to be marked as ``Borrowed``. We can
docs/tutorial/interfaces.rst view
@@ -232,7 +232,7 @@     m_add : Maybe Int -> Maybe Int -> Maybe Int     m_add x y = do x' <- x -- Extract value from x                    y' <- y -- Extract value from y-                   return (x' + y') -- Add them+                   pure (x' + y') -- Add them  This function will extract the values from ``x`` and ``y``, if they are both available, or return ``Nothing`` if one or both are not ("fail fast"). Managing the@@ -270,7 +270,7 @@ .. code-block:: idris      readNumbers : IO (Maybe (Nat, Nat))-    readNumbers = +    readNumbers =       do x <- readNumber          case x of               Nothing => pure Nothing@@ -286,7 +286,7 @@ .. code-block:: idris      readNumbers : IO (Maybe (Nat, Nat))-    readNumbers = +    readNumbers =       do Just x_ok <- readNumber          Just y_ok <- readNumber          pure (Just (x_ok, y_ok))@@ -298,7 +298,7 @@ .. code-block:: idris      readNumbers : IO (Maybe (Nat, Nat))-    readNumbers = +    readNumbers =       do Just x_ok <- readNumber | Nothing => pure Nothing          Just y_ok <- readNumber | Nothing => pure Nothing          pure (Just (x_ok, y_ok))@@ -321,7 +321,7 @@ .. code-block:: idris      m_add : Maybe Int -> Maybe Int -> Maybe Int-    m_add x y = return (!x + !y)+    m_add x y = pure (!x + !y)  The notation ``!expr`` means that the expression ``expr`` should be evaluated and then implicitly bound. Conceptually, we can think of@@ -388,7 +388,7 @@  .. code-block:: idris -    do { qual1; qual2; ...; qualn; return exp; }+    do { qual1; qual2; ...; qualn; pure exp; }  Using monad comprehensions, an alternative definition for ``m_add`` would be:
docs/tutorial/typesfuns.rst view
@@ -635,12 +635,12 @@ type ``IO a``, and puts the result, of type ``a`` into the variable ``x``. In this case, ``getLine`` returns an ``IO String``, so ``name`` has type ``String``. Indentation is significant — each statement in-the do block must begin in the same column. The ``return`` operation+the do block must begin in the same column. The ``pure`` operation allows us to inject a value directly into an IO operation:  .. code-block:: idris -    return : a -> IO a+    pure : a -> IO a  As we will see later, ``do`` notation is more general than this, and can be overloaded.
docs/tutorial/views.rst view
@@ -92,6 +92,27 @@ We will return to this function in Section :ref:`sect-provisional` to complete the definition of ``parity``. +With and proofs+===============+To use a dependent pattern match for theorem proving, it is sometimes necessary+to explicitly construct the proof resulting from the pattern match.+To do this, you can postfix the with clause with ``proof p`` and the proof+generated by the pattern match will be in scope and named ``p``. For example:++.. code-block:: idris++    data Foo = FInt Int | FBool Bool++    optional : Foo -> Maybe Int+    optional (FInt x) = Just x+    optional (FBool b) = Nothing++    isFInt : (foo:Foo) -> Maybe (x : Int ** (optional foo = Just x))+    isFInt foo with (optional foo) proof p+      isFInt foo | Nothing = Nothing           -- here, p : Nothing = optional foo+      isFInt foo | (Just x) = Just (x ** Refl) -- here, p : Just x = optional foo++ .. [1] Conor McBride and James McKinna. 2004. The view from the        left. J. Funct. Program. 14, 1 (January 2004),        69-111. DOI=10.1017/S0956796803004829
idris.cabal view
@@ -1,5 +1,5 @@ Name:           idris-Version:        0.12.3+Version:        0.99 License:        BSD3 License-file:   LICENSE Author:         Edwin Brady@@ -40,7 +40,7 @@                 .                 * Hugs style interactive environment -Cabal-Version:  >= 1.8+Cabal-Version:  >= 1.8.1  Build-type:     Custom @@ -209,6 +209,7 @@                 , Idris.REPL                 , Idris.REPL.Parser                 , Idris.REPL.Commands+                , Idris.Termination                 , Idris.Transforms                 , Idris.TypeSearch                 , Idris.Unlit@@ -251,7 +252,7 @@                 , Tools_idris    Build-depends:  base >=4 && <5-                , aeson >= 0.6 && < 0.12+                , aeson >= 0.6 && < 1.1                 , annotated-wl-pprint >= 0.7 && < 0.8                 , ansi-terminal < 0.7                 , ansi-wl-pprint < 0.7@@ -271,7 +272,7 @@                 , ieee754 >= 0.7 && < 0.8                 , mtl >= 2.1 && < 2.3                 , network < 2.7-                , optparse-applicative >= 0.11 && < 0.13+                , optparse-applicative >= 0.11 && < 0.14                 , parsers >= 0.9 && < 0.13                 , pretty < 1.2                 , regex-tdfa >= 1.2@@ -288,7 +289,7 @@                 , vector < 0.12                 , vector-binary-instances < 0.3                 , zip-archive > 0.2.3.5 && < 0.4-                , safe+                , safe == 0.3.9                 , fsnotify >= 0.2 && < 2.2                 , async < 2.2 @@ -362,7 +363,7 @@                , filepath                , directory                , haskeline >= 0.7-               , optparse-applicative >= 0.11 && < 0.13+               , optparse-applicative >= 0.11 && < 0.14                , tagged                , tasty >= 0.8                , tasty-golden >= 2.0@@ -374,7 +375,7 @@     ghc-prof-options: -auto-all -caf-all-  ghc-options:      -threaded -rtsopts -funbox-strict-fields+  ghc-options:      -threaded -rtsopts -with-rtsopts=-N -funbox-strict-fields  Executable idris-codegen-c   Main-is:        Main.hs
libs/Makefile view
@@ -34,5 +34,4 @@ 	$(MAKE)	-C effects doc_clean 	$(MAKE)	-C pruviloj doc_clean - .PHONY: build install clean doc doc_clean
libs/base/Data/HVect.idr view
@@ -59,16 +59,16 @@       decEq (z::xs) (z::ys) | Yes Refl | No ctr = No (ctr . hvectInjective2)     decEq (x::xs) (y::ys) | No ctr = No (ctr . hvectInjective1) -interface Shows (k : Nat) (ts : Vect k Type) where+interface Shows (ts : Vect k Type) where   shows : HVect ts -> Vect k String -implementation Shows Z [] where+implementation Shows [] where   shows [] = [] -implementation (Show t, Shows k ts) => Shows (S k) (t::ts) where+implementation (Show t, Shows ts) => Shows (t::ts) where   shows (x::xs) = show x :: shows xs -implementation (Shows k ts) => Show (HVect ts) where+implementation (Shows ts) => Show (HVect ts) where   show xs = "[" ++ (pack . intercalate [','] . map unpack . toList $ shows xs) ++ "]"  ||| Extract an arbitrary element of the correct type.
libs/base/Data/List/Views.idr view
@@ -187,7 +187,7 @@ data VList : List a -> Type where      VNil : VList []      VOne : VList [x]-     VCons : {x : a} -> {y : a} -> {xs : List a} -> +     VCons : {x : a} -> {y : a} -> .{xs : List a} ->               (rec : VList xs) -> VList (x :: xs ++ [y])  total
libs/base/Data/Vect.idr view
@@ -9,13 +9,15 @@ infixr 7 ::  ||| Vectors: Generic lists with explicit length in the type+||| @ len the length of the list+||| @ elem the type of elements %elim-data Vect : Nat -> Type -> Type where+data Vect : (len : Nat) -> (elem : Type) -> Type where   ||| Empty vector-  Nil  : Vect Z a-  ||| A non-empty vector of length `S k`, consisting of a head element and-  ||| the rest of the list, of length `k`.-  (::) : (x : a) -> (xs : Vect k a) -> Vect (S k) a+  Nil  : Vect Z elem+  ||| A non-empty vector of length `S len`, consisting of a head element and+  ||| the rest of the list, of length `len`.+  (::) : (x : elem) -> (xs : Vect len elem) -> Vect (S len) elem  -- Hints for interactive editing %name Vect xs,ys,zs,ws@@ -28,14 +30,14 @@ ||| ||| **Note**: this is only useful if you don't already statically know the length ||| and you want to avoid matching the implicit argument for erasure reasons.-||| @ n the length (provably equal to the return value)+||| @ len the length (provably equal to the return value) ||| @ xs the vector-length : (xs : Vect n a) -> Nat+length : (xs : Vect len elem) -> Nat length [] = 0 length (x::xs) = 1 + length xs  ||| Show that the length function on vectors in fact calculates the length-private lengthCorrect : (n : Nat) -> (xs : Vect n a) -> length xs = n+private lengthCorrect : (len : Nat) -> (xs : Vect len elem) -> length xs = len lengthCorrect Z     []        = Refl lengthCorrect (S n) (x :: xs) = rewrite lengthCorrect n xs in Refl @@ -44,44 +46,44 @@ --------------------------------------------------------------------------------  ||| All but the first element of the vector-tail : Vect (S n) a -> Vect n a+tail : Vect (S len) elem -> Vect len elem tail (x::xs) = xs  ||| Only the first element of the vector-head : Vect (S n) a -> a+head : Vect (S len) elem -> elem head (x::xs) = x  ||| The last element of the vector-last : Vect (S n) a -> a+last : Vect (S len) elem -> elem last (x::[])    = x last (x::y::ys) = last $ y::ys  ||| All but the last element of the vector-init : Vect (S n) a -> Vect n a+init : Vect (S len) elem -> Vect len elem init (x::[])    = [] init (x::y::ys) = x :: init (y::ys)  ||| Extract a particular element from a vector-index : Fin n -> Vect n a -> a+index : Fin len -> Vect len elem -> elem index FZ     (x::xs) = x index (FS k) (x::xs) = index k xs   ||| Insert an element at a particular index-insertAt : Fin (S n) -> a -> Vect n a -> Vect (S n) a+insertAt : Fin (S len) -> elem -> Vect len elem -> Vect (S len) elem insertAt FZ     y xs      = y :: xs insertAt (FS k) y (x::xs) = x :: insertAt k y xs insertAt (FS k) y []      = absurd k  ||| Construct a new vector consisting of all but the indicated element-deleteAt : Fin (S n) -> Vect (S n) a -> Vect n a-deleteAt           FZ     (x::xs) = xs-deleteAt {n = S m} (FS k) (x::xs) = x :: deleteAt k xs-deleteAt {n = Z}   (FS k) (x::xs) = absurd k-deleteAt           _      []      impossible+deleteAt : Fin (S len) -> Vect (S len) elem -> Vect len elem+deleteAt             FZ     (x::xs) = xs+deleteAt {len = S m} (FS k) (x::xs) = x :: deleteAt k xs+deleteAt {len = Z}   (FS k) (x::xs) = absurd k+deleteAt             _      []      impossible  ||| Replace an element at a particlar index with another-replaceAt : Fin n -> t -> Vect n t -> Vect n t+replaceAt : Fin len -> elem -> Vect len elem -> Vect len elem replaceAt FZ     y (x::xs) = y :: xs replaceAt (FS k) y (x::xs) = x :: replaceAt k y xs @@ -89,7 +91,7 @@ ||| @ i the index to replace at ||| @ f the update function ||| @ xs the vector to replace in-updateAt : (i : Fin n) -> (f : t -> t) -> (xs : Vect n t) -> Vect n t+updateAt : (i : Fin len) -> (f : elem -> elem) -> (xs : Vect len elem) -> Vect len elem updateAt FZ     f (x::xs) = f x :: xs updateAt (FS k) f (x::xs) = x :: updateAt k f xs @@ -99,13 +101,13 @@  ||| Get the first n elements of a Vect ||| @ n the number of elements to take-take : (n : Nat) -> Vect (n + m) a -> Vect n a+take : (n : Nat) -> Vect (n + m) elem -> Vect n elem take Z     xs        = [] take (S k) (x :: xs) = x :: take k xs  ||| Remove the first n elements of a Vect ||| @ n the number of elements to remove-drop : (n : Nat) -> Vect (n + m) a -> Vect m a+drop : (n : Nat) -> Vect (n + m) elem -> Vect m elem drop Z     xs        = xs drop (S k) (x :: xs) = drop k xs @@ -113,7 +115,7 @@ ||| Boolean predicate. ||| ||| @ p the predicate-takeWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+takeWhile : (p : elem -> Bool) -> Vect len elem -> (q ** Vect q elem) takeWhile p []      = (_ ** []) takeWhile p (x::xs) =   let (len ** ys) = takeWhile p xs@@ -126,7 +128,7 @@ ||| Boolean predicate. ||| ||| @ p the predicate-dropWhile : (p : a -> Bool) -> Vect n a -> (q ** Vect q a)+dropWhile : (p : elem -> Bool) -> Vect len elem -> (q ** Vect q elem) dropWhile p [] = (_ ** []) dropWhile p (x::xs) =   if p x then@@ -139,9 +141,9 @@ --------------------------------------------------------------------------------  ||| Reverse the order of the elements of a vector-reverse : Vect n a -> Vect n a+reverse : Vect len elem -> Vect len elem reverse xs = go [] xs-  where go : Vect n a -> Vect m a -> Vect (n+m) a+  where go : Vect n elem -> Vect m elem -> Vect (n+m) elem         go {n}         acc []        = rewrite plusZeroRightNeutral n in acc         go {n} {m=S m} acc (x :: xs) = rewrite sym $ plusSuccRightSucc n m                                        in go (x::acc) xs@@ -149,11 +151,11 @@ ||| Alternate an element between the other elements of a vector ||| @ sep the element to intersperse ||| @ xs the vector to separate with `sep`-intersperse : (sep : a) -> (xs : Vect n a) -> Vect (n + pred n) a+intersperse : (sep : elem) -> (xs : Vect len elem) -> Vect (len + pred len) elem intersperse sep []      = [] intersperse sep (x::xs) = x :: intersperse' sep xs   where-    intersperse' : a -> Vect n a -> Vect (n + n) a+    intersperse' : elem -> Vect n elem -> Vect (n + n) elem     intersperse'         sep []      = []     intersperse' {n=S n} sep (x::xs) = rewrite sym $ plusSuccRightSucc n n                                        in sep :: x :: intersperse' sep xs@@ -163,17 +165,17 @@ --------------------------------------------------------------------------------  -fromList' : Vect n a -> (l : List a) -> Vect (length l + n) a+fromList' : Vect len elem -> (l : List elem) -> Vect (length l + len) elem fromList' ys [] = ys-fromList' {n} ys (x::xs) =-  rewrite (plusSuccRightSucc (length xs) n) ==>-          Vect (plus (length xs) (S n)) a in+fromList' {len} ys (x::xs) =+  rewrite (plusSuccRightSucc (length xs) len) ==>+          Vect (plus (length xs) (S len)) elem in   fromList' (x::ys) xs  ||| Convert a list to a vector. ||| ||| The length of the list should be statically known.-fromList : (l : List a) -> Vect (length l) a+fromList : (l : List elem) -> Vect (length l) elem fromList l =   rewrite (sym $ plusZeroRightNeutral (length l)) in   reverse $ fromList' [] l@@ -183,30 +185,31 @@ --------------------------------------------------------------------------------  ||| Append two vectors-(++) : Vect m a -> Vect n a -> Vect (m + n) a+(++) : (xs : Vect m elem) -> (ys : Vect n elem) -> Vect (m + n) elem (++) []      ys = ys (++) (x::xs) ys = x :: xs ++ ys -||| Repeate some value n times-||| @ n the number of times to repeat it+||| Repeate some value some number of times.+|||+||| @ len the number of times to repeat it ||| @ x the value to repeat-replicate : (n : Nat) -> (x : a) -> Vect n a+replicate : (len : Nat) -> (x : elem) -> Vect len elem replicate Z     x = [] replicate (S k) x = x :: replicate k x  ||| Merge two ordered vectors-mergeBy : (a -> a -> Ordering) -> Vect n a -> Vect m a -> Vect (n + m) a+mergeBy : (elem -> elem -> Ordering) -> (xs : Vect n elem) -> (ys : Vect m elem) -> Vect (n + m) elem mergeBy order [] [] = [] mergeBy order [] (x :: xs) = x :: xs-mergeBy {n = S k} order (x :: xs) [] = rewrite plusZeroRightNeutral (S k) in  +mergeBy {n = S k} order (x :: xs) [] = rewrite plusZeroRightNeutral (S k) in                                                x :: xs-mergeBy {n = S k} {m = S k'} order (x :: xs) (y :: ys) +mergeBy {n = S k} {m = S k'} order (x :: xs) (y :: ys)      = case order x y of             LT => x :: mergeBy order xs (y :: ys)-            _  => rewrite sym (plusSuccRightSucc k k') in +            _  => rewrite sym (plusSuccRightSucc k k') in                              y :: mergeBy order (x :: xs) ys -merge : Ord a => Vect n a -> Vect m a -> Vect (n + m) a+merge : Ord elem => Vect n elem -> Vect m elem -> Vect (n + m) elem merge = mergeBy compare  --------------------------------------------------------------------------------@@ -223,26 +226,26 @@ zipWith f (x::xs) (y::ys) = f x y :: zipWith f xs ys  ||| Combine three equal-length vectors into a vector with some function-zipWith3 : (a -> b -> c -> d) -> Vect n a -> Vect n b -> Vect n c -> Vect n d+zipWith3 : (a -> b -> c -> d) -> (xs : Vect n a) -> (ys : Vect n b) -> (zs : Vect n c) -> Vect n d zipWith3 f []      []      []      = [] zipWith3 f (x::xs) (y::ys) (z::zs) = f x y z :: zipWith3 f xs ys zs  ||| Combine two equal-length vectors pairwise-zip : Vect n a -> Vect n b -> Vect n (a, b)+zip : (xs : Vect n a) -> (ys : Vect n b) -> Vect n (a, b) zip = zipWith (\x,y => (x,y))  ||| Combine three equal-length vectors elementwise into a vector of tuples-zip3 : Vect n a -> Vect n b -> Vect n c -> Vect n (a, b, c)+zip3 : (xs : Vect n a) -> (ys : Vect n b) -> (zs : Vect n c) -> Vect n (a, b, c) zip3 = zipWith3 (\x,y,z => (x,y,z))  ||| Convert a vector of pairs to a pair of vectors-unzip : Vect n (a, b) -> (Vect n a, Vect n b)+unzip : (xs : Vect n (a, b)) -> (Vect n a, Vect n b) unzip []           = ([], []) unzip ((l, r)::xs) with (unzip xs)   | (lefts, rights) = (l::lefts, r::rights)  ||| Convert a vector of three-tuples to a triplet of vectors-unzip3 : Vect n (a, b, c) -> (Vect n a, Vect n b, Vect n c)+unzip3 : (xs : Vect n (a, b, c)) -> (Vect n a, Vect n b, Vect n c) unzip3 []            = ([], [], []) unzip3 ((l,c,r)::xs) with (unzip3 xs)   | (lefts, centers, rights) = (l::lefts, c::centers, r::rights)@@ -251,7 +254,7 @@ -- Equality -------------------------------------------------------------------------------- -implementation (Eq a) => Eq (Vect n a) where+implementation (Eq elem) => Eq (Vect len elem) where   (==) []      []      = True   (==) (x::xs) (y::ys) = x == y && xs == ys @@ -260,7 +263,7 @@ -- Order -------------------------------------------------------------------------------- -implementation Ord a => Ord (Vect n a) where+implementation Ord elem => Ord (Vect len elem) where   compare []      []      = EQ   compare (x::xs) (y::ys) = compare x y `thenCompare` compare xs ys @@ -283,7 +286,7 @@ ||| ||| @ f the partial function (expressed by returning `Maybe`) ||| @ xs the vector to check for results-mapMaybe : (f : a -> Maybe b) -> (xs : Vect n a) -> (m : Nat ** Vect m b)+mapMaybe : (f : a -> Maybe b) -> (xs : Vect len a) -> (m : Nat ** Vect m b) mapMaybe f []      = (_ ** []) mapMaybe f (x::xs) =   let (len ** ys) = mapMaybe f xs@@ -308,7 +311,7 @@ --------------------------------------------------------------------------------  ||| Flatten a vector of equal-length vectors-concat : Vect m (Vect n a) -> Vect (m * n) a+concat : (xss : Vect m (Vect n elem)) -> Vect (m * n) elem concat []      = [] concat (v::vs) = v ++ concat vs @@ -323,7 +326,7 @@ -- Scans -------------------------------------------------------------------------------- -scanl : (b -> a -> b) -> b -> Vect n a -> Vect (S n) b+scanl : (res -> elem -> res) -> res -> Vect len elem -> Vect (S len) res scanl f q []      = [q] scanl f q (x::xs) = q :: scanl f (f q x) xs @@ -335,37 +338,37 @@ ||| @ p the equality test ||| @ e the item to search for ||| @ xs the vector to search in-elemBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n a) -> Bool+elemBy : (p : elem -> elem -> Bool) -> (e : elem) -> (xs : Vect len elem) -> Bool elemBy p e []      = False elemBy p e (x::xs) = p e x || elemBy p e xs  ||| Use the default Boolean equality on elements to search for an item ||| @ x what to search for ||| @ xs where to search-elem : Eq a => (x : a) -> (xs : Vect n a) -> Bool+elem : Eq elem => (x : elem) -> (xs : Vect len elem) -> Bool elem = elemBy (==)  ||| Find the association of some key with a user-provided comparison ||| @ p the comparison operator for keys (True if they match) ||| @ e the key to look for-lookupBy : (p : a -> a -> Bool) -> (e : a) -> (xs : Vect n (a, b)) -> Maybe b+lookupBy : (p : key -> key -> Bool) -> (e : key) -> (xs : Vect n (key, val)) -> Maybe val lookupBy p e []           = Nothing lookupBy p e ((l, r)::xs) = if p e l then Just r else lookupBy p e xs  ||| Find the assocation of some key using the default Boolean equality test-lookup : Eq a => a -> Vect n (a, b) -> Maybe b+lookup : Eq key => key -> Vect n (key, val) -> Maybe val lookup = lookupBy (==)  ||| Check if any element of xs is found in elems by a user-provided comparison ||| @ p the comparison operator ||| @ elems the vector to search ||| @ xs what to search for-hasAnyBy : (p : a -> a -> Bool) -> (elems : Vect m a) -> (xs : Vect n a) -> Bool+hasAnyBy : (p : elem -> elem -> Bool) -> (elems : Vect m elem) -> (xs : Vect len elem) -> Bool hasAnyBy p elems []      = False hasAnyBy p elems (x::xs) = elemBy p x elems || hasAnyBy p elems xs  ||| Check if any element of xs is found in elems using the default Boolean equality test-hasAny : Eq a => Vect m a -> Vect n a -> Bool+hasAny : Eq elem => Vect m elem -> Vect len elem -> Bool hasAny = hasAnyBy (==)  --------------------------------------------------------------------------------@@ -374,31 +377,31 @@  ||| Find the first element of the vector that satisfies some test ||| @ p the test to satisfy-find : (p : a -> Bool) -> (xs : Vect n a) -> Maybe a+find : (p : elem -> Bool) -> (xs : Vect len elem) -> Maybe elem find p []      = Nothing find p (x::xs) = if p x then Just x else find p xs  ||| Find the index of the first element of the vector that satisfies some test-findIndex : (a -> Bool) -> Vect n a -> Maybe (Fin n)+findIndex : (elem -> Bool) -> Vect len elem -> Maybe (Fin len) findIndex p []        = Nothing findIndex p (x :: xs) = if p x then Just 0 else map FS (findIndex p xs)  ||| Find the indices of all elements that satisfy some test-findIndices : (a -> Bool) -> Vect m a -> List (Fin m)+findIndices : (elem -> Bool) -> Vect m elem -> List (Fin m) findIndices p []        = [] findIndices p (x :: xs) = let is = map FS $ findIndices p xs                            in if p x then 0 :: is else is -elemIndexBy : (a -> a -> Bool) -> a -> Vect m a -> Maybe (Fin m)+elemIndexBy : (elem -> elem -> Bool) -> elem -> Vect m elem -> Maybe (Fin m) elemIndexBy p e = findIndex $ p e -elemIndex : Eq a => a -> Vect m a -> Maybe (Fin m)+elemIndex : Eq elem => elem -> Vect m elem -> Maybe (Fin m) elemIndex = elemIndexBy (==) -elemIndicesBy : (a -> a -> Bool) -> a -> Vect m a -> List (Fin m)+elemIndicesBy : (elem -> elem -> Bool) -> elem -> Vect m elem -> List (Fin m) elemIndicesBy p e = findIndices $ p e -elemIndices : Eq a => a -> Vect m a -> List (Fin m)+elemIndices : Eq elem => elem -> Vect m elem -> List (Fin m) elemIndices = elemIndicesBy (==)  --------------------------------------------------------------------------------@@ -406,7 +409,7 @@ --------------------------------------------------------------------------------  ||| Find all elements of a vector that satisfy some test-filter : (a -> Bool) -> Vect n a -> (p ** Vect p a)+filter : (elem -> Bool) -> Vect len elem -> (p ** Vect p elem) filter p []      = ( _ ** [] ) filter p (x::xs) =   let (_ ** tail) = filter p xs@@ -416,10 +419,10 @@         (_ ** tail)  ||| Make the elements of some vector unique by some test-nubBy : (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)+nubBy : (elem -> elem -> Bool) -> Vect len elem -> (p ** Vect p elem) nubBy = nubBy' []   where-    nubBy' : Vect m a -> (a -> a -> Bool) -> Vect n a -> (p ** Vect p a)+    nubBy' : Vect m elem -> (elem -> elem -> Bool) -> Vect len elem -> (p ** Vect p elem)     nubBy' acc p []      = (_ ** [])     nubBy' acc p (x::xs) with (elemBy p x acc)       | True  = nubBy' acc p xs@@ -427,16 +430,16 @@         | (_ ** tail) = (_ ** x::tail)  ||| Make the elements of some vector unique by the default Boolean equality-nub : Eq a => Vect n a -> (p ** Vect p a)+nub : Eq elem => Vect len elem -> (p ** Vect p elem) nub = nubBy (==) -deleteBy : (a -> a -> Bool) -> a -> Vect n a -> (p ** Vect p a)+deleteBy : (elem -> elem -> Bool) -> elem -> Vect len elem -> (p ** Vect p elem) deleteBy _  _ []      = (_ ** []) deleteBy eq x (y::ys) =   let (len ** zs) = deleteBy eq x ys   in if x `eq` y then (_ ** ys) else (S len ** y ::zs) -delete : (Eq a) => a -> Vect n a -> (p ** Vect p a)+delete : (Eq elem) => elem -> Vect len elem -> (p ** Vect p elem) delete = deleteBy (==)  --------------------------------------------------------------------------------@@ -448,10 +451,10 @@ ||| It is equivalent to (take n xs, drop n xs) ||| @ n   the index to split at ||| @ xs  the Vect to split in two-splitAt : (n : Nat) -> (xs : Vect (n + m) a) -> (Vect n a, Vect m a)+splitAt : (n : Nat) -> (xs : Vect (n + m) elem) -> (Vect n elem, Vect m elem) splitAt n xs = (take n xs, drop n xs) -partition : (a -> Bool) -> Vect n a -> ((p ** Vect p a), (q ** Vect q a))+partition : (elem -> Bool) -> Vect len elem -> ((p ** Vect p elem), (q ** Vect q elem)) partition p []      = ((_ ** []), (_ ** [])) partition p (x::xs) =   let ((leftLen ** lefts), (rightLen ** rights)) = partition p xs in@@ -464,29 +467,29 @@ -- Predicates -------------------------------------------------------------------------------- -isPrefixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool+isPrefixOfBy : (elem -> elem -> Bool) -> Vect m elem -> Vect len elem -> Bool isPrefixOfBy p [] right        = True isPrefixOfBy p left []         = False isPrefixOfBy p (x::xs) (y::ys) = p x y && isPrefixOfBy p xs ys -isPrefixOf : Eq a => Vect m a -> Vect n a -> Bool+isPrefixOf : Eq elem => Vect m elem -> Vect len elem -> Bool isPrefixOf = isPrefixOfBy (==) -isSuffixOfBy : (a -> a -> Bool) -> Vect m a -> Vect n a -> Bool+isSuffixOfBy : (elem -> elem -> Bool) -> Vect m elem -> Vect len elem -> Bool isSuffixOfBy p left right = isPrefixOfBy p (reverse left) (reverse right) -isSuffixOf : Eq a => Vect m a -> Vect n a -> Bool+isSuffixOf : Eq elem => Vect m elem -> Vect len elem -> Bool isSuffixOf = isSuffixOfBy (==)  -------------------------------------------------------------------------------- -- Conversions -------------------------------------------------------------------------------- -maybeToVect : Maybe a -> (p ** Vect p a)+maybeToVect : Maybe elem -> (p ** Vect p elem) maybeToVect Nothing  = (_ ** []) maybeToVect (Just j) = (_ ** [j]) -vectToMaybe : Vect n a -> Maybe a+vectToMaybe : Vect len elem -> Maybe elem vectToMaybe []      = Nothing vectToMaybe (x::xs) = Just x @@ -494,25 +497,25 @@ -- Misc -------------------------------------------------------------------------------- -catMaybes : Vect n (Maybe a) -> (p ** Vect p a)+catMaybes : Vect n (Maybe elem) -> (p ** Vect p elem) catMaybes []             = (_ ** []) catMaybes (Nothing::xs)  = catMaybes xs catMaybes ((Just j)::xs) =   let (_ ** tail) = catMaybes xs    in (_ ** j::tail) -diag : Vect n (Vect n a) -> Vect n a+diag : Vect len (Vect len elem) -> Vect len elem diag []             = [] diag ((x::xs)::xss) = x :: diag (map tail xss) -range : {n : Nat} -> Vect n (Fin n)-range {n=Z}   = []-range {n=S _} = FZ :: map FS range+range : {len : Nat} -> Vect len (Fin len)+range {len=Z}   = []+range {len=S _} = FZ :: map FS range  ||| Transpose a Vect of Vects, turning rows into columns and vice versa. ||| ||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`.-transpose : {n : Nat} -> Vect m (Vect n a) -> Vect n (Vect m a)+transpose : {n : Nat} -> Vect m (Vect n elem) -> Vect n (Vect m elem) transpose []        = replicate _ [] transpose (x :: xs) = zipWith (::) x (transpose xs) @@ -527,7 +530,7 @@  ||| This monad is different from the List monad, (>>=) ||| uses the diagonal.-implementation Monad (Vect n) where+implementation Monad (Vect len) where     m >>= f = diag (map f m)  implementation Traversable (Vect n) where@@ -538,14 +541,14 @@ -- Show -------------------------------------------------------------------------------- -implementation Show a => Show (Vect n a) where+implementation Show elem => Show (Vect len elem) where     show = show . toList  -------------------------------------------------------------------------------- -- Properties -------------------------------------------------------------------------------- -vectConsCong : (x : a) -> (xs : Vect n a) -> (ys : Vect m a) -> (xs = ys) -> (x :: xs = x :: ys)+vectConsCong : (x : elem) -> (xs : Vect len elem) -> (ys : Vect m elem) -> (xs = ys) -> (x :: xs = x :: ys) vectConsCong x xs xs Refl = Refl  vectNilRightNeutral : (xs : Vect n a) -> xs ++ [] = xs@@ -553,7 +556,10 @@ vectNilRightNeutral (x :: xs) =   vectConsCong _ _ _ (vectNilRightNeutral xs) -vectAppendAssociative : (x : Vect xLen a) -> (y : Vect yLen a) -> (z : Vect zLen a) -> x ++ (y ++ z) = (x ++ y) ++ z+vectAppendAssociative : (xs : Vect xLen elem) ->+                        (ys : Vect yLen elem) ->+                        (zs : Vect zLen elem) ->+                        xs ++ (ys ++ zs) = (xs ++ ys) ++ zs vectAppendAssociative [] y z = Refl vectAppendAssociative (x :: xs) ys zs =   vectConsCong _ _ _ (vectAppendAssociative xs ys zs)@@ -599,7 +605,7 @@ noEmptyElem Here impossible  Uninhabited (Elem x []) where-  uninhabited = noEmptyElem +  uninhabited = noEmptyElem  ||| An item not in the head and not in the tail is not in the Vect at all neitherHereNorThere : {x, y : a} -> {xs : Vect n a} -> Not (x = y) -> Not (Elem x xs) -> Not (Elem x (y :: xs))@@ -634,7 +640,7 @@ ||| length in its type, otherwise return Nothing ||| @len the required length ||| @xs the vector with the desired length--- Needs to be Maybe rather than Dec, because if 'n' is unequal to m, we +-- Needs to be Maybe rather than Dec, because if 'n' is unequal to m, we -- only know we don't know how to make a Vect n a, not that one can't exist. exactLength : {m : Nat} -> -- expected at run-time               (len : Nat) -> (xs : Vect m a) -> Maybe (Vect len a)@@ -654,4 +660,3 @@          = Just (0 ** xs)   overLength {m = plus n (S x)} n xs | (CmpGT x)          = Just (S x ** rewrite plusCommutative (S x) n in xs)-
libs/base/Makefile view
@@ -4,8 +4,9 @@ build: 	$(IDRIS) --build ${PKG}.ipkg -install: +install: 	$(IDRIS) --install ${PKG}.ipkg+	${IDRIS} --installdoc ${PKG}.ipkg  clean: 	$(IDRIS) --clean ${PKG}.ipkg@@ -21,4 +22,4 @@ linecount: 	find . -name '*.idr' | xargs wc -l -.PHONY: build install clean rebuild linecount+.PHONY: build install clean rebuild linecount doc doc_clean
libs/base/System/Concurrency/Channels.idr view
@@ -16,10 +16,13 @@      MkPID : (pid : Ptr) -> PID  ||| Spawn a process in a new thread, returning the process ID+||| Returns `Nothing` if there are not enough resources to create the new thread export-spawn : (process : IO ()) -> IO PID+spawn : (process : IO ()) -> IO (Maybe PID) spawn proc = do pid <- fork proc-                pure (MkPID pid)+                if !(nullPtr pid)+                   then pure Nothing+                   else pure (Just (MkPID pid))  ||| Create a channel which connects this process to another process export@@ -61,3 +64,7 @@ unsafeRecv : (expected : Type) -> Channel -> IO (Maybe expected) unsafeRecv a (MkConc pid ch_id) = getMsgFrom {a} pid ch_id +||| Exit the thread immediately+export+stopThread : IO a+stopThread = Raw.stopThread 
libs/base/System/Concurrency/Raw.idr view
@@ -106,3 +106,9 @@              foreign FFI_C "idris_freeMsg" (Ptr -> IO ()) m              pure (Just x) +stopThread : IO a+stopThread = do vm <- getMyVM+                MkRaw res <- foreign FFI_C "idris_stopThread" (Ptr -> IO (Raw a)) vm+                pure res++
+ libs/contrib/Data/Fin/Extra.idr view
@@ -0,0 +1,9 @@+module Data.Fin.Extra++import Data.Fin++||| Proof that an element **n** of Fin **m** , when converted to Nat is smaller than the bound **m**.+public export+elemSmallerThanBound : (n : Fin m) -> LTE (finToNat n) m+elemSmallerThanBound FZ = LTEZero+elemSmallerThanBound (FS x) = LTESucc (elemSmallerThanBound x)
libs/contrib/Makefile view
@@ -4,8 +4,9 @@ build: 	$(IDRIS) --build ${PKG}.ipkg -install: +install: 	$(IDRIS) --install ${PKG}.ipkg+	${IDRIS} --installdoc ${PKG}.ipkg  clean: 	$(IDRIS) --clean ${PKG}.ipkg@@ -21,4 +22,4 @@ linecount: 	find . -name '*.idr' | xargs wc -l -.PHONY: build install clean rebuild linecount+.PHONY: build install clean rebuild linecount doc doc_clean
libs/contrib/contrib.ipkg view
@@ -25,4 +25,6 @@            Network.Cgi, Network.Socket, -          System.Concurrency.Process+          System.Concurrency.Process,++          Data.Fin.Extra
libs/effects/Makefile view
@@ -9,6 +9,7 @@  install: 	$(IDRIS) --install ${PKG}.ipkg+	${IDRIS} --installdoc ${PKG}.ipkg  rebuild: clean build 
libs/prelude/Builtins.idr view
@@ -160,7 +160,8 @@ par (Delay x) = x  ||| Assert to the totality checker that y is always structurally smaller than-||| x (which is typically a pattern argument)+||| x (which is typically a pattern argument, and *must* be in normal form+||| for this to work) ||| @ x the larger value (typically a pattern argument) ||| @ y the smaller value (typically an argument to a recursive call) assert_smaller : (x : a) -> (y : b) -> b
libs/prelude/Makefile view
@@ -4,8 +4,9 @@ build: 	$(IDRIS) --build ${PKG}.ipkg -install: +install: 	$(IDRIS) --install ${PKG}.ipkg+	${IDRIS} --installdoc ${PKG}.ipkg  clean: 	$(IDRIS) --clean ${PKG}.ipkg
libs/prelude/Prelude.idr view
@@ -156,8 +156,15 @@ total natEnumFromThenTo' : Nat -> Nat -> Nat -> List Nat natEnumFromThenTo' _ Z       _ = [] natEnumFromThenTo' n (S inc) m = map (plus n . (* (S inc))) (natRange (S (divNatNZ (minus m n) (S inc) SIsNotZ)))+ total natEnumFromThenTo : Nat -> Nat -> Nat -> List Nat-natEnumFromThenTo n next m = natEnumFromThenTo' n (minus next n) m+natEnumFromThenTo n next m = if n == m then [n]+                             else if n < m then natEnumFromThenTo' n (minus next n) m+                             else case minus n next of+                                  Z => []+                                  S step => List.reverse . map (+ (modNatNZ (minus n m) (S step) SIsNotZ)) $ natEnumFromThenTo' m (minus n next) n+    where modNatNZ : Nat -> (m : Nat) -> Not (m = 0) -> Nat+          modNatNZ n m nz = minus n $ mult m $ divNatNZ n m nz  interface Enum a where   total pred : a -> a@@ -197,8 +204,9 @@           go' n (x :: xs) = n + cast x :: go' n xs           go : Integer -> Integer -> List Integer           go n m = go' n (natRange (S (cast {to = Nat} (m - n))))-  enumFromThenTo _ 0   _ = []-  enumFromThenTo n next m = go (natRange (S (divNatNZ (fromInteger (abs (m - n))) (S (fromInteger ((abs (next - n)) - 1))) SIsNotZ)))+  enumFromThenTo n next m = if n == m then [n]+                            else if next - n == 0 || next - n < 0 /= m - n < 0 then []+                            else go (natRange (S (divNatNZ (fromInteger (abs (m - n))) (S (fromInteger ((abs (next - n)) - 1))) SIsNotZ)))     where go : List Nat -> List Integer           go [] = []           go (x :: xs) = n + (cast x * (next - n)) :: go xs@@ -217,8 +225,9 @@           go : Int -> Int -> List Int           go n m = go' [] (cast {to = Nat} (m - n)) m   enumFromThen n inc = n :: enumFromThen (inc + n) inc-  enumFromThenTo _ 0   _ = []-  enumFromThenTo n next m = go (natRange (S (divNatNZ (cast {to=Nat} (abs (m - n))) (S (cast {to=Nat} ((abs (next - n)) - 1))) SIsNotZ)))+  enumFromThenTo n next m = if n == m then [n]+                            else if next - n == 0 || next - n < 0 /= m - n < 0 then []+                            else go (natRange (S (divNatNZ (cast {to=Nat} (abs (m - n))) (S (cast {to=Nat} ((abs (next - n)) - 1))) SIsNotZ)))     where go : List Nat -> List Int           go [] = []           go (x :: xs) = n + (cast x * (next - n)) :: go xs
libs/prelude/Prelude/Interactive.idr view
@@ -89,6 +89,16 @@ getChar : IO Char getChar = map cast $ foreign FFI_C "getchar" (IO Int) +||| Disables buffering in both stdin and stdout:+||| so that output is written immediately (never stored in the buffer)+||| and the next input item is read and returned+|||+||| this is useful to circumvent problems with IO on some Windows systems+||| where stdout output right before a prompt is only shown after+||| the input-line from stdin is produced+disableBuffering : IO ()+disableBuffering = foreign FFI_C "idris_disableBuffering" (IO ())+ ||| Get the command-line arguments that the program was called with. partial getArgs : IO (List String)
libs/prelude/Prelude/Maybe.idr view
@@ -7,6 +7,7 @@ import Prelude.Cast import Prelude.Interfaces import Prelude.Foldable+import Prelude.Uninhabited  %access public export %default total@@ -37,6 +38,14 @@ ||| Proof that some `Maybe` is actually `Just` data IsJust : Maybe a -> Type where   ItIsJust : IsJust (Just x)++Uninhabited (IsJust Nothing) where+  uninhabited ItIsJust impossible++||| Decide whether a 'Maybe' is 'Just'+isItJust : (v : Maybe a) -> Dec (IsJust v)+isItJust (Just x) = Yes ItIsJust+isItJust Nothing = No absurd  -------------------------------------------------------------------------------- -- Misc
libs/prelude/Prelude/Nat.idr view
@@ -310,9 +310,19 @@ -- Division and modulus -------------------------------------------------------------------------------- +||| The proof that no successor of a natural number can be zero.+|||+||| ```idris example+||| modNatNZ 10 3 SIsNotZ+||| ``` SIsNotZ : {x: Nat} -> (S x = Z) -> Void SIsNotZ Refl impossible +||| Modulus function where the divisor is not zero.+|||+||| ```idris example+||| modNatNZ 100 2 SIsNotZ+||| ``` modNatNZ : Nat -> (y: Nat) -> Not (y = Z) -> Nat modNatNZ left Z         p = void (p Refl) modNatNZ left (S right) _ = mod' left left right@@ -329,6 +339,11 @@ modNat : Nat -> Nat -> Nat modNat left (S right) = modNatNZ left (S right) SIsNotZ +||| Division where the divisor is not zero.+|||+||| ```idris example+||| divNatNZ 100 2 SIsNotZ+||| ``` divNatNZ : Nat -> (y: Nat) -> Not (y = Z) -> Nat divNatNZ left Z         p = void (p Refl) divNatNZ left (S right) _ = div' left left right
libs/prelude/Prelude/Show.idr view
@@ -46,7 +46,7 @@   ||| @ x the value to convert   partial   show : (x : ty) -> String-  show = showPrec Open+  show x = showPrec Open x -- Eta expand to help totality checker    ||| Convert a value to its `String` representation in a certain precedence   ||| context.@@ -63,7 +63,7 @@   ||| @ x the value to convert   partial   showPrec : (d : Prec) -> (x : ty) -> String-  showPrec _ = show+  showPrec _ x = show x  ||| Surround a `String` with parentheses depending on a condition. |||
libs/prelude/Prelude/Strings.idr view
@@ -328,7 +328,7 @@ toLower x with (strM x)   toLower ""             | StrNil = ""   toLower (strCons c cs) | (StrCons c cs) =-    strCons (toLower c) (toLower (assert_smaller (strCons c cs) cs))+    strCons (toLower c) (toLower (assert_smaller (prim__strCons c cs) cs))  ||| Uppercases all characters in the string. |||@@ -339,7 +339,7 @@ toUpper x with (strM x)   toUpper ""             | StrNil = ""   toUpper (strCons c cs) | (StrCons c cs) =-    strCons (toUpper c) (toUpper (assert_smaller (strCons c cs) cs ))+    strCons (toUpper c) (toUpper (assert_smaller (prim__strCons c cs) cs ))  -------------------------------------------------------------------------------- -- Predicates
libs/pruviloj/Makefile view
@@ -9,6 +9,7 @@  install: 	$(IDRIS) --install ${PKG}.ipkg+	${IDRIS} --installdoc ${PKG}.ipkg  rebuild: clean build 
libs/pruviloj/Pruviloj/Derive/Eliminators.idr view
@@ -3,7 +3,7 @@ import Language.Reflection.Utils import Data.Vect -import Pruviloj.Core+import public Pruviloj.Core import Pruviloj.Internals.TyConInfo import Pruviloj.Internals import Pruviloj.Renamers@@ -63,7 +63,7 @@                 focus ihT                 attack                 for_ {b=()} argArgs $ \(n, b) =>-                  forall n (getBinderTy b)+                  forall n (binderTy b)                 let argTm : Raw = mkApp (Var recArg) (map (Var . fst) argArgs)                 argTmTy <- forget (snd !(check !getEnv argTm))                 argHoles <- apply (Var motiveName)@@ -239,7 +239,7 @@    where bindLam : List (TTName, Binder Raw) -> Raw -> Raw         bindLam [] x = x-        bindLam ((n, b)::rest) x = RBind n (Lam (getBinderTy b)) $ bindLam rest x+        bindLam ((n, b)::rest) x = RBind n (Lam (binderTy b)) $ bindLam rest x  getElimClauses : TyConInfo -> (elimn : TTName) ->                  List (TTName, List CtorArg, Raw) -> Elab (List (FunClause Raw))
libs/pruviloj/Pruviloj/Internals.idr view
@@ -1,7 +1,7 @@ ||| Internal details of the library, not for public consumption. module Pruviloj.Internals -+import Language.Reflection.Utils import Pruviloj.Core import Pruviloj.Renamers @@ -50,16 +50,6 @@ extractBinders tm = ([], tm)  -||| Get the type annotation from a binder-getBinderTy : Binder t -> t-getBinderTy (Lam t) = t-getBinderTy (Pi t _) = t-getBinderTy (Let t _) = t-getBinderTy (Hole t) = t-getBinderTy (GHole t) = t-getBinderTy (Guess t _) = t-getBinderTy (PVar t) = t-getBinderTy (PVTy t) = t  ||| Map a list `[x1, x2, ..., xn]` to `[(0, x1), (1, x2), ..., (n-1, xn)]` enumerate : List a -> List (Nat, a)@@ -70,11 +60,11 @@  bindPats : List (TTName, Binder Raw) -> Raw -> Raw bindPats [] res = res-bindPats ((n, b)::bs) res = RBind n (PVar (getBinderTy b)) $ bindPats bs res+bindPats ((n, b)::bs) res = RBind n (PVar (binderTy b)) $ bindPats bs res  bindPatTys : List (TTName, Binder Raw) -> Raw -> Raw bindPatTys [] res = res-bindPatTys ((n, b)::bs) res = RBind n (PVTy (getBinderTy b)) $ bindPatTys bs res+bindPatTys ((n, b)::bs) res = RBind n (PVTy (binderTy b)) $ bindPatTys bs res   ||| Helper for elaborating pattern clauses. This helper takes care of
libs/pruviloj/Pruviloj/Internals/TyConInfo.idr view
@@ -1,4 +1,4 @@-module Pruviloj.Derive.TyConInfo+module Pruviloj.Internals.TyConInfo  import Pruviloj.Core import Pruviloj.Internals
main/Main.hs view
@@ -1,17 +1,22 @@ module Main where -import Control.Monad ( when )-import System.Exit ( exitSuccess )+import System.Exit ( ExitCode(..), exitWith, exitSuccess ) +import Control.Monad ( unless, when, (>=>) )+import Data.Maybe    ( fromMaybe )+import Data.Foldable ( foldrM )+ import Idris.AbsSyntax-import Idris.Error import Idris.CmdOptions-import Idris.Info+import Idris.Error import Idris.Info.Show-import Idris.Package import Idris.Main+import Idris.Package +import Util.System (setupBundledCC)+ import Util.System ( setupBundledCC )+import System.Exit ( ExitCode(..), exitWith)  processShowOptions :: [Opt] -> Idris () processShowOptions opts = runIO $ do@@ -19,7 +24,8 @@   when (ShowLoggingCats `elem` opts)  $ showExitIdrisLoggingCategories   when (ShowIncs `elem` opts)         $ showExitIdrisFlagsInc   when (ShowLibs `elem` opts)         $ showExitIdrisFlagsLibs-  when (ShowLibdir `elem` opts)       $ showExitIdrisLibDir+  when (ShowLibDir `elem` opts)       $ showExitIdrisLibDir+  when (ShowDocDir `elem` opts)       $ showExitIdrisDocDir   when (ShowPkgs `elem` opts)         $ showExitIdrisInstalledPackages  check :: [Opt] -> (Opt -> Maybe a) -> ([a] -> Idris ()) -> Idris ()@@ -31,7 +37,8 @@  processClientOptions :: [Opt] -> Idris () processClientOptions opts = check opts getClient $ \fs -> case fs of-  (c:_) -> do+  []      -> ifail "No --client argument. This indicates a bug. Please report."+  (c : _) -> do     setVerbose False     setQuiet True     case getPort opts of@@ -48,7 +55,13 @@   check opts getPkgMkDoc $ \fs -> runIO $ do     mapM_ (documentPkg opts) fs   check opts getPkgTest $ \fs -> runIO $ do-    mapM_ (testPkg opts) fs++    codes <- mapM (testPkg opts) fs+    -- check if any of the tests exited with an exit code other+    -- than zero; if they did, exit with exit code 1+    unless (null $ filter (/= ExitSuccess) codes) $+       exitWith (ExitFailure 1)+   check opts getPkg $ \fs -> runIO $ do     mapM_ (buildPkg opts (WarnOnly `elem` opts)) fs   check opts getPkgREPL $ \fs -> case fs of
man/idris.1 view
@@ -1,6 +1,6 @@ .\" Manpage for Idris. .\" Contact <> to correct errors or typos.-.TH man 1 "25 March 2016" "0.12.3" "Idris man page"+.TH man 1 "28 November 2016" "0.99" "Idris man page" .SH NAME idris -\ a general purpose pure functional programming language with dependent types. .SH SYNOPSIS@@ -13,17 +13,29 @@ evaluation. Its features are influenced by Haskell and ML.  + Full dependent types with dependent pattern matching+ + Simple case expressions, where-clauses, with-rule+ + Pattern matching let- and lambda-bindings+ + Overloading via Interfaces (Type class-like), Monad comprehensions+ + do-notation, idiom brackets+ + Syntactic conveniences for lists, tuples, dependent pairs+ + Totality checking+ + Coinductive types+ + Indentation significant syntax, Extensible syntax+ + Tactic based theorem proving (influenced by Coq)+ + Cumulative universes+ + Simple Foreign Function Interface+ + Hugs style interactive environment  It is important to note that Idris is first and foremost a research tool
mkpkg.sh view
@@ -1,26 +1,64 @@ #!/bin/sh -VERSION=$1+set -euo pipefail -echo "Building version-$VERSION\n\n"-echo "Have you: set the release flag, checked the demos and the tutorial?"-read $foo+if [ "$#" -lt 1 ]; then+    echo "Usage $0 [version number] ?[idris bin location]"+    echo ""+    echo "The first argument is the version number"+    echo ""+    echo "The second argument is optional, and used to point to a"+    echo "custom location in which idris was recently built i.e."+    echo "withing .stack-work or .cabal-sandbox. The location must"+    echo "be given relative to the project root of a package in the "+    echo "libs/ directory."+    exit 1+fi +VERSION=${1:-}++echo "==> Building version-$VERSION"+echo ""+echo "Q: Have you: (a) set the release flag & (b) checked the demos and the tutorial?"+read ${FOO:-}+ git tag v$VERSION -a +echo "==> Building Source Distribution" cabal sdist  # Generate Idris library docs and put them in lib_docs.tar.gz in the root-make lib_doc+echo "==> Generating API Documentation."+echo "==> Determining version of Idris to use."+if [ -z ${2+x} ];+then+    echo "==> Using default location.";+    make lib_doc+else+    echo "==> Using custom location.";+    make -C libs IDRIS=$2 doc+fi+ DOCDIR=`mktemp -d /tmp/docsXXXXX`+ cp -r libs/base/base_doc "$DOCDIR" cp -r libs/prelude/prelude_doc "$DOCDIR" cp -r libs/effects/effects_doc "$DOCDIR" cp -r libs/contrib/contrib_doc "$DOCDIR"+ tar -czvf lib_docs.tar.gz -C "$DOCDIR" prelude_doc base_doc effects_doc contrib_doc +echo "==> Building Binaries" cabal configure --prefix=/usr/local+ cabal build++echo "==> Creating Package"+mkdir -p /tmp/idris-pkg/+ cabal copy --destdir=/tmp/idris-pkg/-pkgbuild --id org.idris-lang --root /tmp/idris-pkg/ idris-$VERSION.pkg  +pkgbuild --identifier org.idris-lang \+         --version "v$VERSION"       \+         --root /tmp/idris-pkg/      \+         idris-$VERSION.pkg
rts/idris_rts.c view
@@ -748,11 +748,22 @@      callvm->processes++; -    pthread_create(&t, &attr, runThread, td);+    int ok = pthread_create(&t, &attr, runThread, td); //    usleep(100);-    return vm;+    if (ok == 0) {+        return vm;+    } else {+        terminate(vm);+        return NULL;+    } } +void* idris_stopThread(VM* vm) {+    close_vm(vm);+    pthread_exit(NULL);+    return NULL;+}+ // VM is assumed to be a different vm from the one x lives on  VAL doCopyTo(VM* vm, VAL x) {@@ -1069,6 +1080,11 @@  const char* idris_getArg(int i) {     return __idris_argv[i];+}++void idris_disableBuffering() {+  setvbuf(stdin, NULL, _IONBF, 0);+  setvbuf(stdout, NULL, _IONBF, 0); }  void stackOverflow() {
rts/idris_rts.h view
@@ -309,6 +309,7 @@ void init_signals();  void* vmThread(VM* callvm, func f, VAL arg);+void* idris_stopThread(VM* vm);  // Copy a structure to another vm's heap VAL copyTo(VM* newVM, VAL x);@@ -392,6 +393,9 @@  int idris_numArgs(); const char *idris_getArg(int i);++// disable stdin/stdout buffering+void idris_disableBuffering();  // Handle stack overflow. // Just reports an error and exits.
samples/effects/TreeTag.idr view
@@ -20,13 +20,13 @@                       (Node Leaf "Bob" Leaf))  treeTagAux : BTree a -> { [STATE Int] } Eff (BTree (Int, a))-treeTagAux Leaf = return Leaf+treeTagAux Leaf = pure Leaf treeTagAux (Node l x r)     = do l' <- treeTagAux l          i <- get          put (i + 1)          r' <- treeTagAux r-         return (Node l' (i, x) r')+         pure (Node l' (i, x) r')  treeTag : (i : Int) -> BTree a -> BTree (Int, a) treeTag i x = runPure (do put i
samples/tutorial/classes.idr view
@@ -1,7 +1,7 @@ m_add : Maybe Int -> Maybe Int -> Maybe Int m_add x y = do x' <- x -- Extract value from x                y' <- y -- Extract value from y-               return (x' + y') -- Add them+               pure (x' + y') -- Add them  m_add' : Maybe Int -> Maybe Int -> Maybe Int m_add' x y = [ x' + y' | x' <- x, y' <- y ]
src/IRTS/BCImp.hs view
@@ -7,9 +7,9 @@ -} module IRTS.BCImp where +import Idris.Core.TT import IRTS.Lang import IRTS.Simplified-import Idris.Core.TT  data Reg = RVal | L Int 
src/IRTS/Bytecode.hs view
@@ -21,10 +21,11 @@ module IRTS.Bytecode where  +import Idris.Core.TT+import IRTS.Defunctionalise import IRTS.Lang import IRTS.Simplified-import IRTS.Defunctionalise-import Idris.Core.TT+ import Data.Maybe  data Reg = RVal | L Int | T Int | Tmp
src/IRTS/CodegenC.hs view
@@ -8,27 +8,27 @@ module IRTS.CodegenC (codegenC) where  import Idris.AbsSyntax+import Idris.Core.TT import IRTS.Bytecode+import IRTS.CodegenCommon+import IRTS.Defunctionalise import IRTS.Lang import IRTS.Simplified-import IRTS.Defunctionalise import IRTS.System-import IRTS.CodegenCommon-import Idris.Core.TT+ import Util.System -import Numeric-import Data.Char+import Control.Monad import Data.Bits+import Data.Char import Data.List (intercalate, nubBy)-import System.Process+import Debug.Trace+import Numeric+import System.Directory import System.Exit+import System.FilePath ((<.>), (</>)) import System.IO-import System.Directory-import System.FilePath ((</>), (<.>))-import Control.Monad--import Debug.Trace+import System.Process  codegenC :: CodeGenerator codegenC ci = do codegenC' (simpleDecls ci)@@ -66,8 +66,8 @@          let h = concatMap toDecl (map fst bc)          let cc = concatMap (uncurry toC) bc          let hi = concatMap ifaceC (concatMap getExp exports)-         d <- getDataDir-         mprog <- readFile (d </> "rts" </> "idris_main" <.> "c")+         d <- getIdrisCRTSDir+         mprog <- readFile (d </> "idris_main" <.> "c")          let cout = headers incs ++ debug dbg ++ h ++ wrappers ++ cc ++                      (if (exec == Executable) then mprog else hi)          case exec of
src/IRTS/CodegenCommon.hs view
@@ -8,11 +8,11 @@ -} module IRTS.CodegenCommon where -import GHC.Generics (Generic)- import Idris.Core.TT-import IRTS.Simplified import IRTS.Defunctionalise+import IRTS.Simplified++import GHC.Generics (Generic)  data DbgLevel = NONE | DEBUG | TRACE deriving Eq data OutputType = Raw | Object | Executable deriving (Eq, Show, Generic)
src/IRTS/CodegenJavaScript.hs view
@@ -5,44 +5,41 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE OverloadedStrings, PatternGuards #-} module IRTS.CodegenJavaScript (codegenJavaScript                              , codegenNode                              , JSTarget(..)                              ) where -import IRTS.JavaScript.AST- import Idris.AbsSyntax hiding (TypeCase)+import Idris.Core.TT import IRTS.Bytecode-import IRTS.Lang+import IRTS.CodegenCommon+import IRTS.Defunctionalise import IRTS.Exports+import IRTS.JavaScript.AST+import IRTS.Lang import IRTS.Simplified-import IRTS.Defunctionalise-import IRTS.CodegenCommon-import Idris.Core.TT import IRTS.System import Util.System +import Control.Applicative (pure, (<$>), (<*>)) import Control.Arrow import Control.Monad (mapM)-import Control.Applicative ((<$>), (<*>), pure) import Control.Monad.RWS hiding (mapM) import Control.Monad.State import Data.Char-import Numeric import Data.List+import qualified Data.Map.Strict as M import Data.Maybe-import Data.Word+import qualified Data.Text as T+import qualified Data.Text.IO as TIO import Data.Traversable hiding (mapM)-import System.IO+import Data.Word+import Numeric import System.Directory import System.FilePath--import qualified Data.Map.Strict as M-import qualified Data.Text as T-import qualified Data.Text.IO as TIO+import System.IO   data CompileInfo = CompileInfo { compileInfoApplyCases  :: [Int]@@ -121,27 +118,27 @@   -> OutputType   -> IO () codegenJS_all target definitions includes libs filename exports outputType = do-  let bytecode = map toBC definitions-  let info = initCompileInfo bytecode-  let js = concatMap (translateDecl info) bytecode-  let full = concatMap processFunction js+  let bytecode      = map toBC definitions+  let info          = initCompileInfo bytecode+  let js            = concatMap (translateDecl info) bytecode+  let full          = concatMap processFunction js   let exportedNames = map translateName ((getExpNames exports) ++ [sUN "call__IO"])-  let code = deadCodeElim exportedNames full-  let ext = takeExtension filename-  let isHtml = target == JavaScript && ext == ".html"-  let htmlPrologue = T.pack "<!doctype html><html><head><script>\n"-  let htmlEpilogue = T.pack "\n</script></head><body></body></html>"-  let (cons, opt) = optimizeConstructors code-  let (header, rt) = case target of-                          Node -> ("#!/usr/bin/env node\n", "-node")+  let code          = deadCodeElim exportedNames full+  let ext           = takeExtension filename+  let isHtml        = target == JavaScript && ext == ".html"+  let htmlPrologue  = T.pack "<!doctype html><html><head><script>\n"+  let htmlEpilogue  = T.pack "\n</script></head><body></body></html>"+  let (cons, opt)   = optimizeConstructors code+  let (header, rt)   = case target of+                          Node       -> ("#!/usr/bin/env node\n", "-node")                           JavaScript -> ("", "-browser")    included   <- concat <$> getIncludes includes-  path       <- (++) <$> getDataDir <*> (pure "/jsrts/")-  idrRuntime <- readFile $ path ++ "Runtime-common.js"-  tgtRuntime <- readFile $ concat [path, "Runtime", rt, ".js"]+  path       <- getIdrisJSRTSDir+  idrRuntime <- readFile $ path </> "Runtime-common.js"+  tgtRuntime <- readFile $ path </> concat ["Runtime", rt, ".js"]   jsbn       <- if compileInfoNeedsBigInt info-                   then readFile $ path ++ "jsbn/jsbn.js"+                   then readFile $ path </> "jsbn/jsbn.js"                    else return ""   let runtime = (  header                 ++ includeLibs libs
src/IRTS/Compiler.hs view
@@ -5,55 +5,50 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, TypeSynonymInstances, CPP #-}+{-# LANGUAGE CPP, PatternGuards, TypeSynonymInstances #-}  module IRTS.Compiler(compile, generate) where -import IRTS.Lang-import IRTS.LangOpts-import IRTS.Defunctionalise-import IRTS.Simplified-import IRTS.CodegenCommon-import IRTS.CodegenC-import IRTS.DumpBC-import IRTS.CodegenJavaScript-import IRTS.Inliner-import IRTS.Exports-import IRTS.Portable- import Idris.AbsSyntax import Idris.AbsSyntaxTree import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Erasure import Idris.Error import Idris.Output--import Debug.Trace--import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.Core.CaseTree+import IRTS.CodegenC+import IRTS.CodegenCommon+import IRTS.CodegenJavaScript+import IRTS.Defunctionalise+import IRTS.DumpBC+import IRTS.Exports+import IRTS.Inliner+import IRTS.Lang+import IRTS.LangOpts+import IRTS.Portable+import IRTS.Simplified -import Control.Category import Prelude hiding (id, (.))  import Control.Applicative+import Control.Category import Control.Monad.State--import           Data.Maybe-import           Data.List-import           Data.Ord-import           Data.IntSet (IntSet)-import qualified Data.IntSet          as IS-import qualified Data.Map             as M-import qualified Data.Set             as S--import System.Process-import System.IO-import System.Exit+import Data.IntSet (IntSet)+import qualified Data.IntSet as IS+import Data.List+import qualified Data.Map as M+import Data.Maybe+import Data.Ord+import qualified Data.Set as S+import Debug.Trace import System.Directory import System.Environment-import System.FilePath ((</>), addTrailingPathSeparator)+import System.Exit+import System.FilePath (addTrailingPathSeparator, (</>))+import System.IO+import System.Process  -- |  Compile to simplified forms and return CodegenInfo compile :: Codegen -> FilePath -> Maybe Term -> Idris CodegenInfo
src/IRTS/Defunctionalise.hs view
@@ -24,15 +24,15 @@                           , module IRTS.Lang                           ) where -import IRTS.Lang-import Idris.Core.TT import Idris.Core.CaseTree+import Idris.Core.TT+import IRTS.Lang -import Debug.Trace-import Data.Maybe-import Data.List import Control.Monad import Control.Monad.State+import Data.List+import Data.Maybe+import Debug.Trace  data DExp = DV LVar           | DApp Bool Name [DExp] -- True = tail call
src/IRTS/DumpBC.hs view
@@ -7,11 +7,11 @@ -} module IRTS.DumpBC where +import Idris.Core.TT+import IRTS.Bytecode import IRTS.Lang import IRTS.Simplified-import Idris.Core.TT -import IRTS.Bytecode import Data.List  interMap :: [a] -> [b] -> (a -> [b]) -> [b]
src/IRTS/Exports.hs view
@@ -9,9 +9,9 @@ module IRTS.Exports(findExports, getExpNames) where  import Idris.AbsSyntax-import Idris.Core.TT import Idris.Core.CaseTree import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Error import IRTS.Lang 
src/IRTS/Inliner.hs view
@@ -8,7 +8,6 @@ module IRTS.Inliner where  import Idris.Core.TT- import IRTS.Defunctionalise  inline :: DDefs -> DDefs
src/IRTS/JavaScript/AST.hs view
@@ -5,14 +5,12 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE OverloadedStrings, PatternGuards #-} module IRTS.JavaScript.AST where -import Data.Word import Data.Char (isDigit)- import qualified Data.Text as T+import Data.Word  data JSType = JSIntTy             | JSStringTy
src/IRTS/Lang.hs view
@@ -5,16 +5,15 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, DeriveFunctor, DeriveGeneric #-}+{-# LANGUAGE DeriveFunctor, DeriveGeneric, PatternGuards #-}  module IRTS.Lang where -import Control.Monad.State hiding (lift)-import Control.Applicative hiding (Const)--import Idris.Core.TT import Idris.Core.CaseTree+import Idris.Core.TT +import Control.Applicative hiding (Const)+import Control.Monad.State hiding (lift) import Data.List import Debug.Trace import GHC.Generics (Generic)@@ -319,7 +318,7 @@                                        LCon lv t cn args' lsubst n new (LOp op args) = let args' = map (lsubst n new) args in                                  LOp op args'-lsubst n new (LForeign fd rd args) +lsubst n new (LForeign fd rd args)      = let args' = map (\(d, a) -> (d, lsubst n new a)) args in            LForeign fd rd args' lsubst n new (LCase t e alts) = let e' = lsubst n new e
src/IRTS/LangOpts.hs view
@@ -5,16 +5,16 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, DeriveFunctor #-}+{-# LANGUAGE DeriveFunctor, PatternGuards #-}  module IRTS.LangOpts where -import Control.Monad.State hiding (lift)-import Control.Applicative hiding (Const)--import IRTS.Lang-import Idris.Core.TT import Idris.Core.CaseTree+import Idris.Core.TT+import IRTS.Lang++import Control.Applicative hiding (Const)+import Control.Monad.State hiding (lift) import Data.List import Debug.Trace 
src/IRTS/Portable.hs view
@@ -8,19 +8,17 @@ {-# LANGUAGE OverloadedStrings #-} module IRTS.Portable (writePortable) where -import Data.Aeson-import qualified Data.ByteString.Lazy as B-import qualified Data.Text as T- import Idris.Core.CaseTree import Idris.Core.TT- import IRTS.Bytecode import IRTS.CodegenCommon import IRTS.Defunctionalise import IRTS.Lang import IRTS.Simplified +import Data.Aeson+import qualified Data.ByteString.Lazy as B+import qualified Data.Text as T import System.IO  data CodegenFile = CGFile {
src/IRTS/Simplified.hs view
@@ -7,13 +7,13 @@ -} module IRTS.Simplified(simplifyDefs, SDecl(..), SExp(..), SAlt(..)) where -import IRTS.Defunctionalise-import Idris.Core.TT import Idris.Core.CaseTree+import Idris.Core.TT import Idris.Core.Typecheck-import Data.Maybe-import Control.Monad.State+import IRTS.Defunctionalise +import Control.Monad.State+import Data.Maybe import Debug.Trace  data SExp = SV LVar
src/IRTS/System.hs view
@@ -7,47 +7,58 @@ -} {-# LANGUAGE CPP #-} module IRTS.System( getDataFileName-                  , getDataDir-                  , getTargetDir                   , getCC                   , getLibFlags+                  , getIdrisDataDir                   , getIdrisLibDir+                  , getIdrisDocDir+                  , getIdrisCRTSDir+                  , getIdrisJSRTSDir                   , getIncFlags                   , getEnvFlags                   , version                   ) where -import Data.List.Split--import Control.Applicative ((<$>))-import Data.Maybe (fromMaybe)-import System.FilePath ((</>), addTrailingPathSeparator)-import System.Environment- #ifdef FREESTANDING-import Target_idris import Paths_idris (version)+import Target_idris #else import Paths_idris #endif -overrideDataDirWith :: String -> IO FilePath-overrideDataDirWith envVar = do-  envValue <- lookupEnv envVar+import Control.Applicative ((<$>))+import Data.List.Split+import Data.Maybe (fromMaybe)+import System.Environment+import System.FilePath (addTrailingPathSeparator, (</>))+++getIdrisDataDir :: IO String+getIdrisDataDir = do+  envValue <- lookupEnv "TARGET"   case envValue of     Nothing -> do       ddir <- getDataDir-      return (ddir </> "libs")+      return ddir     Just ddir -> return ddir +overrideIdrisSubDirWith :: String  -- ^ Sub directory in `getDataDir` location.+                        -> String  -- ^ Environment variable to get new location from.+                        -> IO FilePath+overrideIdrisSubDirWith fp envVar = do+  envValue <- lookupEnv envVar+  case envValue of+    Nothing -> do+      ddir <- getIdrisDataDir+      return (ddir </> fp)+    Just ddir -> return ddir+ getCC :: IO String getCC = fromMaybe "gcc" <$> lookupEnv "IDRIS_CC"  getEnvFlags :: IO [String] getEnvFlags = maybe [] (splitOn " ") <$> lookupEnv "IDRIS_CFLAGS" -getTargetDir :: IO String-getTargetDir = overrideDataDirWith "TARGET"  #if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS)\     || defined(openbsd_HOST_OS) || defined(netbsd_HOST_OS)@@ -64,11 +75,21 @@ gmpLib = [] #endif -getLibFlags = do dir <- getDataDir-                 return $ ["-L" ++ (dir </> "rts"),+getLibFlags = do dir <- getIdrisCRTSDir+                 return $ ["-L" ++ dir,                            "-lidris_rts"] ++ extraLib ++ gmpLib ++ ["-lpthread"] -getIdrisLibDir = addTrailingPathSeparator <$> overrideDataDirWith "IDRIS_LIBRARY_PATH"+getIdrisLibDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "libs" "IDRIS_LIBRARY_PATH" -getIncFlags = do dir <- getDataDir-                 return $ ("-I" ++ dir </> "rts") : extraInclude+getIdrisDocDir = addTrailingPathSeparator <$> overrideIdrisSubDirWith "docs" "IDRIS_DOC_PATH"++getIdrisJSRTSDir = do+  ddir <- getIdrisDataDir+  return $ addTrailingPathSeparator (ddir </> "jsrts")++getIdrisCRTSDir = do+  ddir <- getIdrisDataDir+  return $ addTrailingPathSeparator (ddir </> "rts")++getIncFlags = do dir <- getIdrisCRTSDir+                 return $ ("-I" ++ dir) : extraInclude
src/Idris/ASTUtils.hs view
@@ -41,19 +41,20 @@     Field(), cg_usedpos, ctxt_lookup, fgetState, fmodifyState   , fputState, idris_fixities, ist_callgraph, ist_optimisation   , known_interfaces, known_terms, opt_detaggable, opt_inaccessible-  , opts_idrisCmdline, repl_definitions+  , opt_forceable, opts_idrisCmdline, repl_definitions   ) where -import Control.Category+import Idris.AbsSyntaxTree+import Idris.Core.Evaluate+import Idris.Core.TT++import Prelude hiding (id, (.))+ import Control.Applicative+import Control.Category import Control.Monad.State.Class import Data.Maybe-import Prelude hiding (id, (.)) -import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.AbsSyntaxTree- data Field rec fld = Field     { fget :: rec -> fld     , fset :: fld -> rec -> rec@@ -110,6 +111,7 @@       maybe_default Optimise         { inaccessible = []         , detaggable = False+        , forceable = []         }     . ctxt_lookup n     . Field idris_optimisation (\v ist -> ist{ idris_optimisation = v })@@ -121,12 +123,14 @@ opt_detaggable :: Field OptInfo Bool opt_detaggable = Field detaggable (\v opt -> opt{ detaggable = v }) +opt_forceable :: Field OptInfo [Int]+opt_forceable = Field forceable (\v opt -> opt{ forceable = v })  -- | callgraph record for the given (exact) name ist_callgraph :: Name -> Field IState CGInfo ist_callgraph n =       maybe_default CGInfo-        { calls = [], scg = [], usedpos = []+        { calls = [], allCalls = Nothing, scg = [], usedpos = []         }     . ctxt_lookup n     . Field idris_callgraph (\v ist -> ist{ idris_callgraph = v })
src/Idris/AbsSyntax.hs view
@@ -5,53 +5,47 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,-             TypeSynonymInstances, PatternGuards #-}+{-# LANGUAGE DeriveFunctor, FlexibleInstances, MultiParamTypeClasses,+             PatternGuards, TypeSynonymInstances #-}  module Idris.AbsSyntax(     module Idris.AbsSyntax   , module Idris.AbsSyntaxTree   ) where -import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Typecheck import Idris.AbsSyntaxTree import Idris.Colours+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Core.Typecheck import Idris.Docstrings import Idris.IdeMode hiding (Opt(..)) import IRTS.CodegenCommon-import Util.DynamicLinker -import System.Console.Haskeline-import System.IO-import System.Directory (canonicalizePath, doesFileExist)+import Util.DynamicLinker+import Util.Pretty+import Util.ScreenSize+import Util.System  import Control.Applicative import Control.Monad (liftM3) import Control.Monad.State--import Data.List hiding (insert,union) import Data.Char-import qualified Data.Text as T import Data.Either+import Data.Generics.Uniplate.Data (descend, descendM)+import Data.List hiding (insert, union) import qualified Data.Map as M import Data.Maybe import qualified Data.Set as S+import qualified Data.Text as T import Data.Word (Word)--import Data.Generics.Uniplate.Data (descend, descendM)- import Debug.Trace--import System.IO.Error(isUserError, ioeGetErrorString, tryIOError)- import Network (PortID(PortNumber))--import Util.Pretty-import Util.ScreenSize-import Util.System+import System.Console.Haskeline+import System.Directory (canonicalizePath, doesFileExist)+import System.IO+import System.IO.Error (ioeGetErrorString, isUserError, tryIOError)  getContext :: Idris Context getContext = do i <- getIState; return (tt_ctxt i)@@ -214,6 +208,13 @@ setFlags :: Name -> [FnOpt] -> Idris () setFlags n fs = do i <- getIState; putIState $ i { idris_flags = addDef n fs (idris_flags i) } +addFnOpt :: Name -> FnOpt -> Idris ()+addFnOpt n f = do i <- getIState+                  let fls = case lookupCtxtExact n (idris_flags i) of+                                 Nothing -> []+                                 Just x -> x+                  setFlags n (f : fls)+ setFnInfo :: Name -> FnInfo -> Idris () setFnInfo n fs = do i <- getIState; putIState $ i { idris_fninfo = addDef n fs (idris_fninfo i) } @@ -270,9 +271,9 @@ addCalls n calls    = do i <- getIState         case lookupCtxtExact n (idris_callgraph i) of-             Nothing -> addToCG n (CGInfo calls [] [])-             Just (CGInfo cs scg used) ->-                addToCG n (CGInfo (nub (calls ++ cs)) scg used)+             Nothing -> addToCG n (CGInfo calls Nothing [] [])+             Just (CGInfo cs ans scg used) ->+                addToCG n (CGInfo (nub (calls ++ cs)) ans scg used)  addTyInferred :: Name -> Idris () addTyInferred n@@ -364,15 +365,36 @@  -- | Trace all the names in a call graph starting at the given name getAllNames :: Name -> Idris [Name]-getAllNames n = allNames [] n+getAllNames n = do i <- getIState+                   case getCGAllNames i n of+                        Just ns -> return ns+                        Nothing -> do ns <- allNames [] n+                                      addCGAllNames i n ns+                                      return ns +getCGAllNames :: IState -> Name -> Maybe [Name]+getCGAllNames i n = case lookupCtxtExact n (idris_callgraph i) of+                         Just ci -> allCalls ci+                         _ -> Nothing++addCGAllNames :: IState -> Name -> [Name] -> Idris ()+addCGAllNames i n ns+      = case lookupCtxtExact n (idris_callgraph i) of+             Just ci -> addToCG n (ci { allCalls = Just ns })+             _ -> addToCG n (CGInfo [] (Just ns) [] [])+ allNames :: [Name] -> Name -> Idris [Name] allNames ns n | n `elem` ns = return [] allNames ns n = do i <- getIState-                   case lookupCtxtExact n (idris_callgraph i) of-                      Just ns' -> do more <- mapM (allNames (n:ns)) (calls ns')-                                     return (nub (n : concat more))-                      _ -> return [n]+                   case getCGAllNames i n of+                        Just ns -> return ns+                        Nothing -> case lookupCtxtExact n (idris_callgraph i) of+                                        Just ci -> +                                          do more <- mapM (allNames (n:ns)) (calls ci)+                                             let ns' = nub (n : concat more)+                                             addCGAllNames i n ns'+                                             return ns'+                                        _ -> return [n]  addCoercion :: Name -> Idris () addCoercion n = do i <- getIState@@ -450,10 +472,10 @@ addImplementation int res n i     = do ist <- getIState          case lookupCtxt n (idris_interfaces ist) of-                [CI a b c d e ins fds] ->-                     do let cs = addDef n (CI a b c d e (addI i ins) fds) (idris_interfaces ist)+                [CI a b c d e f g ins fds] ->+                     do let cs = addDef n (CI a b c d e f g (addI i ins) fds) (idris_interfaces ist)                         putIState $ ist { idris_interfaces = cs }-                _ -> do let cs = addDef n (CI (sMN 0 "none") [] [] [] [] [(i, res)] []) (idris_interfaces ist)+                _ -> do let cs = addDef n (CI (sMN 0 "none") [] [] [] [] [] [] [(i, res)] []) (idris_interfaces ist)                         putIState $ ist { idris_interfaces = cs }   where addI, insI :: Name -> [(Name, Bool)] -> [(Name, Bool)]         addI i ins | int = (i, res) : ins@@ -668,9 +690,9 @@    where pErase (CaseOp c t tys orig tot cds)             = CaseOp c t tys orig [] (pErase' cds)          pErase x = x-         pErase' (CaseDefs _ (cs, c) _ rs)+         pErase' (CaseDefs (cs, c) rs)              = let c' = (cs, fmap pEraseType c) in-                   CaseDefs c' c' c' rs+                   CaseDefs c' rs  checkUndefined :: FC -> Name -> Idris () checkUndefined fc n@@ -2545,7 +2567,7 @@ getPkgDir _ = Nothing  getPkg :: Opt -> Maybe (Bool, String)-getPkg (PkgBuild str) = Just (False, str)+getPkg (PkgBuild   str) = Just (False, str) getPkg (PkgInstall str) = Just (True, str) getPkg _ = Nothing @@ -2563,9 +2585,10 @@  -- | Returns None if given an Opt which is not PkgMkDoc --   Otherwise returns Just x, where x is the contents of PkgMkDoc-getPkgMkDoc :: Opt          -- ^ Opt to extract-            -> Maybe String -- ^ Result-getPkgMkDoc (PkgMkDoc str) = Just str+getPkgMkDoc :: Opt                  -- ^ Opt to extract+            -> Maybe (Bool, String) -- ^ Result+getPkgMkDoc (PkgDocBuild  str)  = Just (False,str)+getPkgMkDoc (PkgDocInstall str) = Just (True,str) getPkgMkDoc _              = Nothing  getPkgTest :: Opt          -- ^ the option to extract
src/Idris/AbsSyntaxTree.hs view
@@ -5,54 +5,48 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,-             DeriveDataTypeable, DeriveGeneric, TypeSynonymInstances,-             PatternGuards #-}+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveGeneric,+             FlexibleInstances, MultiParamTypeClasses, PatternGuards,+             TypeSynonymInstances #-}  module Idris.AbsSyntaxTree where -import Idris.Core.TT-import Idris.Core.Evaluate+import Idris.Colours import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Core.Typecheck import Idris.Docstrings-import IRTS.Lang import IRTS.CodegenCommon-import Util.Pretty+import IRTS.Lang import Util.DynamicLinker--import Idris.Colours--import System.Console.Haskeline-import System.IO+import Util.Pretty  import Prelude hiding ((<$>))  import Control.Applicative ((<|>))--import Control.Monad.Trans.State.Strict-import Control.Monad.Trans.Except import qualified Control.Monad.Trans.Class as Trans (lift)-+import Control.Monad.Trans.Except+import Control.Monad.Trans.State.Strict+import Data.Char import Data.Data (Data)+import Data.Either+import Data.Foldable (Foldable) import Data.Function (on)-import Data.Generics.Uniplate.Data (universe, children)+import Data.Generics.Uniplate.Data (children, universe) import Data.List hiding (group)-import Data.Char import qualified Data.Map.Strict as M-import qualified Data.Text as T-import Data.Either-import qualified Data.Set as S-import Data.Word (Word) import Data.Maybe (fromMaybe, mapMaybe, maybeToList)+import qualified Data.Set as S+import qualified Data.Text as T import Data.Traversable (Traversable) import Data.Typeable-import Data.Foldable (Foldable)-import GHC.Generics (Generic)-import Network.Socket(PortNumber)-+import Data.Word (Word) import Debug.Trace-+import GHC.Generics (Generic)+import Network.Socket (PortNumber)+import System.Console.Haskeline+import System.IO import Text.PrettyPrint.Annotated.Leijen  data ElabWhat = ETypes | EDefns | EAll@@ -327,9 +321,10 @@ type UsageReason = (Name, Int)  -- fn_name, its_arg_number  data CGInfo = CGInfo {-    calls   :: [Name]-  , scg     :: [SCGEntry]-  , usedpos :: [(Int, [UsageReason])]+    calls    :: [Name] -- Immediate calls+  , allCalls :: Maybe [Name] -- Calls and descendents (built as required, for PE)+  , scg      :: [SCGEntry]+  , usedpos  :: [(Int, [UsageReason])]   } deriving (Show, Generic) {-! deriving instance Binary CGInfo@@ -367,7 +362,7 @@               | IBCMetaInformation Name MetaInformation               | IBCTotal Name Totality               | IBCInjective Name Injectivity-              | IBCFlags Name [FnOpt]+              | IBCFlags Name               | IBCFnInfo Name FnInfo               | IBCTrans Name (Term, Term)               | IBCErrRev (Term, Term)@@ -492,7 +487,8 @@          | IdemodeSocket          | ShowAll          | ShowLibs-         | ShowLibdir+         | ShowLibDir+         | ShowDocDir          | ShowIncs          | ShowPkgs          | ShowLoggingCats@@ -524,7 +520,8 @@          | PkgClean String          | PkgCheck String          | PkgREPL String-         | PkgMkDoc String -- IdrisDoc+         | PkgDocBuild String -- IdrisDoc+         | PkgDocInstall String          | PkgTest String          | PkgIndex FilePath          | WarnOnly@@ -589,7 +586,7 @@   data Static = Static | Dynamic-  deriving (Show, Eq, Data, Generic, Typeable)+  deriving (Show, Eq, Ord, Data, Generic, Typeable) {-! deriving instance Binary Static !-}@@ -612,7 +609,7 @@                       , pstatic  :: Static                       , pscript  :: PTerm                       }-             deriving (Show, Eq, Data, Generic, Typeable)+             deriving (Show, Eq, Ord, Data, Generic, Typeable)  {-! deriving instance Binary Plicity@@ -640,11 +637,13 @@  data FnOpt = Inlinable -- ^ always evaluate when simplifying            | TotalFn | PartialFn | CoveringFn-           | Coinductive | AssertTotal+           | AllGuarded -- ^ all delayed arguments guaranteed guarded by constructors+           | AssertTotal             -- | interface dictionary, eval only when a function            -- argument, and further evaluation results.            | Dictionary+           | OverlappingDictionary -- ^ Interface dictionary which may overlap            | Implicit                       -- ^ implicit coercion            | NoImplicit                     -- ^ do not apply implicit coercions            | CExport String                 -- ^ export, with a C name@@ -652,6 +651,12 @@            | ErrorReverse                   -- ^ attempt to reverse normalise before showing in error            | Reflection                     -- ^ a reflecting function, compile-time only            | Specialise [(Name, Maybe Int)] -- ^ specialise it, freeze these names+           | UnfoldIface Name [Name]+                  -- ^ Unfold given interface name in the definition, the+                  -- top level methods, and anything which has+                  -- the interface name as an argument. This is to unfold+                  -- things for termination checking, as interfaces will otherwise+                  -- cause problems            | Constructor -- ^ Data constructor type            | AutoHint    -- ^ use in auto implicit search            | PEGenerated -- ^ generated by partial evaluator@@ -1035,7 +1040,7 @@ data PunInfo = IsType              | IsTerm              | TypeOrTerm-             deriving (Eq, Show, Data, Typeable, Generic)+             deriving (Eq, Show, Ord, Data, Typeable, Generic)  -- | High level language terms data PTerm = PQuote Raw         -- ^ Inclusion of a core term into the@@ -1101,12 +1106,12 @@            | PConstSugar FC PTerm              -- ^ A desugared constant. The FC is a precise source              -- location that will be used to highlight it later.-       deriving (Eq, Data, Typeable, Generic)+       deriving (Eq, Ord, Data, Typeable, Generic)  data PAltType = ExactlyOne Bool -- ^ flag sets whether delay is allowed               | FirstSuccess               | TryImplicit-       deriving (Eq, Data, Generic, Typeable)+       deriving (Eq, Ord, Data, Generic, Typeable)  -- | Transform the FCs in a PTerm. The first function transforms the -- general-purpose FCs, and the second transforms those that are used@@ -1225,7 +1230,7 @@                 | TFail [ErrorReportPart]                 | Qed | Abandon                 | SourceFC-    deriving (Show, Eq, Functor, Foldable, Traversable, Data, Generic, Typeable)+    deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Data, Generic, Typeable) {-! deriving instance Binary PTactic' !-}@@ -1271,7 +1276,7 @@             | DoBindP FC t t [(t,t)]             | DoLet  FC Name FC t t   -- ^ second FC is precise name location             | DoLetP FC t t-    deriving (Eq, Functor, Data, Generic, Typeable)+    deriving (Eq, Ord, Functor, Data, Generic, Typeable) {-! deriving instance Binary PDo' !-}@@ -1311,13 +1316,13 @@                             , getScript :: t                             , getTm     :: t                             }-             deriving (Show, Eq, Functor, Data, Generic, Typeable)+             deriving (Show, Eq, Ord, Functor, Data, Generic, Typeable)  data ArgOpt = AlwaysShow             | HideDisplay             | InaccessibleArg             | UnknownImp-            deriving (Show, Eq, Data, Generic, Typeable)+            deriving (Show, Eq, Ord, Data, Generic, Typeable)  instance Sized a => Sized (PArg' a) where   size (PImp p _ l nm trm)            = 1 + size nm + size trm@@ -1402,7 +1407,9 @@   , interface_methods                  :: [(Name, (Bool, FnOpts, PTerm))] -- ^ flag whether it's a "data" method   , interface_defaults                 :: [(Name, (Name, PDecl))]         -- ^ method name -> default impl   , interface_default_super_interfaces :: [PDecl]+  , interface_impparams                :: [Name]   , interface_params                   :: [Name]+  , interface_constraints              :: [PTerm]   , interface_implementations          :: [(Name, Bool)] -- ^ the Bool is whether to include in implementation search, so named implementations are excluded   , interface_determiners              :: [Int]   } deriving (Show, Generic)@@ -1433,6 +1440,7 @@ data OptInfo = Optimise {     inaccessible :: [(Int,Name)]  -- includes names for error reporting   , detaggable :: Bool+  , forceable :: [Int] -- argument positions which are forced by other values   } deriving (Show, Generic) {-! deriving instance Binary OptInfo@@ -1789,9 +1797,18 @@       | Just n <- snat ppo d p e = depth d $ annotate (AnnData "Nat" "") (text (show n))     prettySe d p bnd (PRef fc _ n) = prettyName True (ppopt_impl ppo) bnd n     prettySe d p bnd (PLam fc n nfc ty sc) =-      depth d . bracket p startPrec . group . align . hang 2 $-      text "\\" <> prettyBindingOf n False <+> text "=>" <$>-      prettySe (decD d) startPrec ((n, False):bnd) sc+      let (ns, sc') = getLamNames [n] sc in+          depth d . bracket p startPrec . group . align . hang 2 $+          text "\\" <> prettyBindingsOf ns False <+> text "=>" <$>+          prettySe (decD d) startPrec ((n, False):bnd) sc'+      where+        getLamNames acc (PLam fc n nfc ty sc) = getLamNames (n : acc) sc+        getLamNames acc sc = (reverse acc, sc)++        prettyBindingsOf [] t = text ""+        prettyBindingsOf [n] t = prettyBindingOf n t+        prettyBindingsOf (n : ns) t = prettyBindingOf n t <> text "," <+>+                                      prettyBindingsOf ns t     prettySe d p bnd (PLet fc n nfc ty v sc) =       depth d . bracket p startPrec . group . align $       kwd "let" <+> (group . align . hang 2 $ prettyBindingOf n False <+> text "=" <$> prettySe (decD d) startPrec bnd v) </>@@ -2548,5 +2565,5 @@ getErasureInfo :: IState -> Name -> [Int] getErasureInfo ist n =     case lookupCtxtExact n (idris_optimisation ist) of-        Just (Optimise inacc detagg) -> map fst inacc+        Just (Optimise inacc detag force) -> map fst inacc         Nothing -> []
src/Idris/Apropos.hs view
@@ -8,12 +8,12 @@ module Idris.Apropos (apropos, aproposModules) where  import Idris.AbsSyntax-import Idris.Core.Evaluate (ctxtAlist, Def(..))-import Idris.Core.TT (Name(..), Type, TT(..), NameType(..), Binder(..), Const(..),-                      lookupCtxtExact, toAlist)-import Idris.Docstrings (Docstring, DocTerm, containsText)+import Idris.Core.Evaluate (Def(..), ctxtAlist)+import Idris.Core.TT (Binder(..), Const(..), Name(..), NameType(..), TT(..),+                      Type, lookupCtxtExact, toAlist)+import Idris.Docstrings (DocTerm, Docstring, containsText) -import Data.List (nub, nubBy, intersperse)+import Data.List (intersperse, nub, nubBy) import qualified Data.Text as T  -- | Find definitions that are relevant to all space-delimited components of
src/Idris/CaseSplit.hs view
@@ -28,33 +28,29 @@   ) where  import Idris.AbsSyntax-import Idris.AbsSyntaxTree (Idris, IState, PTerm)-import Idris.ElabDecls+import Idris.AbsSyntaxTree (IState, Idris, PTerm)+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Core.Typecheck import Idris.Delaborate-import Idris.Parser-import Idris.Parser.Helpers+import Idris.Elab.Term+import Idris.Elab.Value+import Idris.ElabDecls import Idris.Error import Idris.Output--import Idris.Elab.Value-import Idris.Elab.Term--import Idris.Core.TT-import Idris.Core.Typecheck-import Idris.Core.Evaluate+import Idris.Parser+import Idris.Parser.Helpers -import Data.Maybe-import Data.Char-import Data.List (isPrefixOf, isSuffixOf) import Control.Monad import Control.Monad.State.Strict-+import Data.Char+import Data.List (isPrefixOf, isSuffixOf)+import Data.Maybe+import Debug.Trace+import Text.Parser.Char (anyChar) import Text.Parser.Combinators-import Text.Parser.Char(anyChar)-import Text.Trifecta(Result(..), parseString)+import Text.Trifecta (Result(..), parseString) import Text.Trifecta.Delta--import Debug.Trace  -- | Given a variable to split, and a term application, return a list -- of variable updates, paired with a flag to say whether the given
src/Idris/Chaser.hs view
@@ -11,22 +11,21 @@   , ModuleTree(..)   ) where -import Idris.Core.TT-import Idris.Parser import Idris.AbsSyntax-import Idris.Imports-import Idris.Unlit+import Idris.Core.TT import Idris.Error import Idris.IBC+import Idris.Imports+import Idris.Parser+import Idris.Unlit -import System.FilePath-import System.Directory-import Data.Time.Clock-import Control.Monad.Trans import Control.Monad.State+import Control.Monad.Trans import Data.List-+import Data.Time.Clock import Debug.Trace+import System.Directory+import System.FilePath import Util.System (readSource, writeSource)  data ModuleTree = MTree { mod_path :: IFileType,
src/Idris/CmdOptions.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-| Module      : Idris.CmdOptions Description : A parser for the CmdOptions for the Idris executable.@@ -13,27 +14,27 @@   , getPkgREPL, getPkgTest, getPort, getIBCSubDir   ) where +import Idris.AbsSyntax (getClient, getIBCSubDir, getPkg, getPkgCheck,+                        getPkgClean, getPkgMkDoc, getPkgREPL, getPkgTest,+                        getPort, opt) import Idris.AbsSyntaxTree-import Idris.AbsSyntax (opt, getClient, getPkg, getPkgCheck, getPkgClean, getPkgMkDoc-  , getPkgREPL, getPkgTest, getPort, getIBCSubDir)--- import Idris.REPL import Idris.Info (getIdrisVersion)-+-- import Idris.REPL import IRTS.CodegenCommon -import Options.Applicative-import Options.Applicative.Arrows-import Options.Applicative.Types (ReadM(..)) import Control.Monad.Trans (lift)-import Control.Monad.Trans.Reader (ask) import Control.Monad.Trans.Except (throwE)+import Control.Monad.Trans.Reader (ask) import Data.Char import Data.Maybe--import Text.ParserCombinators.ReadP hiding (many, option)-+#if MIN_VERSION_optparse_applicative(0,13,0)+import Data.Monoid ((<>))+#endif+import Options.Applicative+import Options.Applicative.Arrows+import Options.Applicative.Types (ReadM(..)) import Safe (lastMay)-+import Text.ParserCombinators.ReadP hiding (many, option) import qualified Text.PrettyPrint.ANSI.Leijen as PP  runArgParser :: IO [Opt]@@ -129,7 +130,8 @@   <|> flag' ShowLoggingCats (long "listlogcats" <> help "Display logging categories")   <|> flag' ShowLibs        (long "link"        <> help "Display link flags")   <|> flag' ShowPkgs        (long "listlibs"    <> help "Display installed libraries")-  <|> flag' ShowLibdir      (long "libdir"      <> help "Display library directory")+  <|> flag' ShowLibDir      (long "libdir"      <> help "Display library directory")+  <|> flag' ShowDocDir      (long "docdir"      <> help "Display idrisdoc install directory")   <|> flag' ShowIncs        (long "include"     <> help "Display the includes flags")    <|> flag' Verbose (short 'V' <> long "verbose" <> help "Loud verbosity")@@ -144,13 +146,14 @@   <|> (Port <$> option portReader (long "port" <> metavar "PORT" <> help "REPL TCP port - pass \"none\" to not bind any port"))    -- Package commands-  <|> (PkgBuild   <$> strOption (long "build"    <> metavar "IPKG" <> help "Build package"))-  <|> (PkgInstall <$> strOption (long "install"  <> metavar "IPKG" <> help "Install package"))-  <|> (PkgREPL    <$> strOption (long "repl"     <> metavar "IPKG" <> help "Launch REPL, only for executables"))-  <|> (PkgClean   <$> strOption (long "clean"    <> metavar "IPKG" <> help "Clean package"))-  <|> (PkgMkDoc   <$> strOption (long "mkdoc"    <> metavar "IPKG" <> help "Generate IdrisDoc for package"))-  <|> (PkgCheck   <$> strOption (long "checkpkg" <> metavar "IPKG" <> help "Check package only"))-  <|> (PkgTest    <$> strOption (long "testpkg"  <> metavar "IPKG" <> help "Run tests for package"))+  <|> (PkgBuild      <$> strOption (long "build"      <> metavar "IPKG" <> help "Build package"))+  <|> (PkgInstall    <$> strOption (long "install"    <> metavar "IPKG" <> help "Install package"))+  <|> (PkgREPL       <$> strOption (long "repl"       <> metavar "IPKG" <> help "Launch REPL, only for executables"))+  <|> (PkgClean      <$> strOption (long "clean"      <> metavar "IPKG" <> help "Clean package"))+  <|> (PkgDocBuild   <$> strOption (long "mkdoc"      <> metavar "IPKG" <> help "Generate IdrisDoc for package"))+  <|> (PkgDocInstall <$> strOption (long "installdoc" <> metavar "IPKG" <> help "Install IdrisDoc for package"))+  <|> (PkgCheck      <$> strOption (long "checkpkg"   <> metavar "IPKG" <> help "Check package only"))+  <|> (PkgTest       <$> strOption (long "testpkg"    <> metavar "IPKG" <> help "Run tests for package"))    -- Misc options   <|> (BCAsm <$> strOption (long "bytecode"))
src/Idris/Completion.hs view
@@ -7,28 +7,26 @@ -} module Idris.Completion (replCompletion, proverCompletion) where -import Idris.Core.Evaluate (definitions, ctxtAlist)-import Idris.Core.TT- import Idris.AbsSyntax (runIO) import Idris.AbsSyntaxTree+import Idris.Colours+import Idris.Core.Evaluate (ctxtAlist, definitions)+import Idris.Core.TT import Idris.Help import Idris.Imports (installedPackages)-import Idris.Colours-import Idris.Parser.Helpers(opChars)+import Idris.Parser.Expr (TacticArg(..)) import qualified Idris.Parser.Expr (constants, tactics)-import Idris.Parser.Expr (TacticArg (..))+import Idris.Parser.Helpers (opChars) import Idris.REPL.Parser (allHelp, setOptions)-import Control.Monad.State.Strict +import Control.Monad.State.Strict+import Data.Char (toLower) import Data.List-import Data.Maybe-import Data.Char(toLower) import qualified Data.Map.Strict as Map+import Data.Maybe import qualified Data.Text as T--import System.Console.Haskeline import System.Console.ANSI (Color)+import System.Console.Haskeline  commands = [ n | (names, _, _) <- allHelp ++ extraHelp, n <- names ] 
src/Idris/Core/Binary.hs view
@@ -8,15 +8,15 @@ {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Core.Binary where -import Control.Applicative ((<*>), (<$>))-import Control.Monad (liftM2)-import Control.DeepSeq (($!!))+import Idris.Core.TT +import Control.Applicative ((<$>), (<*>))+import Control.DeepSeq (($!!))+import Control.Monad (liftM2) import Data.Binary-import Data.Vector.Binary import qualified Data.Text as T import qualified Data.Text.Encoding as E-import Idris.Core.TT+import Data.Vector.Binary  instance Binary ErrorReportPart where   put (TextPart msg) = do putWord8 0 ; put msg@@ -639,6 +639,7 @@                 TType x1 -> do putWord8 7                                put x1                 Impossible -> putWord8 8+                Inferred x1 -> put x1 -- drop the 'Inferred'                 UType x1 -> do putWord8 10                                put x1         get
src/Idris/Core/CaseTree.hs view
@@ -18,8 +18,8 @@ in order to allow for better optimisation opportunities.  -}-{-# LANGUAGE PatternGuards, DeriveFunctor, TypeSynonymInstances,-    DeriveGeneric #-}+{-# LANGUAGE DeriveFunctor, DeriveGeneric, PatternGuards, TypeSynonymInstances+             #-}  module Idris.Core.CaseTree (     CaseDef(..), SC, SC'(..), CaseAlt, CaseAlt'(..), ErasureInfo@@ -31,11 +31,12 @@ import Idris.Core.TT  import Control.Applicative hiding (Const)-import Control.Monad.State import Control.Monad.Reader-import Data.Maybe+import Control.Monad.State import Data.List hiding (partition)-import qualified Data.List(partition)+import qualified Data.List (partition)+import Data.Maybe+import qualified Data.Set as S import Debug.Trace import GHC.Generics (Generic) @@ -153,33 +154,34 @@ findCalls = findCalls' False  findCalls' :: Bool -> SC -> [Name] -> [(Name, [[Name]])]-findCalls' ignoreasserts sc topargs = nub $ nu' topargs sc where-    nu' ps (Case _ n alts) = nub (concatMap (nua (n : ps)) alts)-    nu' ps (ProjCase t alts) = nub $ nut ps t ++ concatMap (nua ps) alts-    nu' ps (STerm t)     = nub $ nut ps t-    nu' ps _ = []+findCalls' ignoreasserts sc topargs = S.toList $ nu' topargs sc where+    nu' ps (Case _ n alts) = S.unions $ map (nua (n : ps)) alts+    nu' ps (ProjCase t alts) = S.unions $ nut ps t : map (nua ps) alts+    nu' ps (STerm t)     = nut ps t+    nu' ps _ = S.empty -    nua ps (ConCase n i args sc) = nub (nu' (ps ++ args) sc)-    nua ps (FnCase n args sc) = nub (nu' (ps ++ args) sc)+    nua ps (ConCase n i args sc) = nu' (ps ++ args) sc+    nua ps (FnCase n args sc) = nu' (ps ++ args) sc     nua ps (ConstCase _ sc) = nu' ps sc     nua ps (SucCase _ sc) = nu' ps sc     nua ps (DefaultCase sc) = nu' ps sc -    nut ps (P _ n _) | n `elem` ps = []-                     | otherwise = [(n, [])] -- tmp+    nut ps (P _ n _) | n `elem` ps = S.empty+                     | otherwise = S.singleton (n, [])     nut ps fn@(App _ f a)         | (P _ n _, args) <- unApply fn-             = if ignoreasserts && n == sUN "assert_total" -                  then []-                  else if n `elem` ps -                          then nut ps f ++ nut ps a-                          else [(n, map argNames args)] ++ concatMap (nut ps) args-        | (P (TCon _ _) n _, _) <- unApply fn = []-        | otherwise = nut ps f ++ nut ps a-    nut ps (Bind n (Let t v) sc) = nut ps v ++ nut (n:ps) sc+             = if ignoreasserts && n == sUN "assert_total"+                  then S.empty+                  else if n `elem` ps+                          then S.union (nut ps f) (nut ps a)+                          else S.insert (n, map argNames args) +                                   (S.unions $ map (nut ps) args)+        | (P (TCon _ _) n _, _) <- unApply fn = S.empty+        | otherwise = S.union (nut ps f) (nut ps a)+    nut ps (Bind n (Let t v) sc) = S.union (nut ps v) (nut (n:ps) sc)     nut ps (Proj t _) = nut ps t     nut ps (Bind n b sc) = nut (n:ps) sc-    nut ps _ = []+    nut ps _ = S.empty      argNames tm = let ns = directUse tm in                       filter (\x -> x `elem` ns) topargs@@ -242,14 +244,18 @@ runCaseBuilder :: ErasureInfo -> CaseBuilder a -> (CS -> (a, CS)) runCaseBuilder ei bld = runState $ runReaderT bld ei -data Phase = CompileTime | RunTime+data Phase = CoverageCheck [Int] -- list of positions explicitly given+           | CompileTime +           | RunTime     deriving (Show, Eq)  -- Generate a simple case tree -- Work Right to Left  simpleCase :: Bool -> SC -> Bool ->-              Phase -> FC -> [Int] -> +              Phase -> FC -> +              -- Following two can be empty lists when Phase = CoverageCheck+              [Int] -> -- Inaccessible argument positions               [(Type, Bool)] -> -- (Argument type, whether it's canonical)               [([Name], Term, Term)] ->               ErasureInfo ->@@ -289,7 +295,7 @@           -- Check that all pattern variables are reachable by a case split           -- Otherwise, they won't make sense on the RHS.           chkAccessible (avs, l, c)-               | phase == RunTime || reflect = return (l, c)+               | phase /= CompileTime || reflect = return (l, c)                | otherwise = do mapM_ (acc l) avs                                 return (l, c) @@ -343,6 +349,7 @@  data Pat = PCon Bool Name Int [Pat]          | PConst Const+         | PInferred Pat          | PV Name Type          | PSuc Pat -- special case for n+1 on Integer          | PReflected Name [Pat]@@ -381,6 +388,7 @@      toPat' []   (P Bound n ty) = PV n ty     toPat' args (App _ f a)    = toPat' (a : args) f+    toPat' args (Inferred tm)  = PInferred (toPat' args tm)     toPat' [] (Constant x) | isTypeConst x = PTyPat                            | otherwise     = PConst x @@ -431,12 +439,26 @@ -- The first argument means [(Name, IsInaccessible)].  order :: Phase -> [(Name, Bool)] -> [Clause] -> [Bool] -> ([Name], [Clause])--- do nothing at compile time: FIXME (EB): Put this in after checking +-- do nothing at compile time: FIXME (EB): Put this in after checking -- implications for Franck's reflection work... see issue 3233--- order CompileTime ns cs _ = (map fst ns, cs) +-- order CompileTime ns cs _ = (map fst ns, cs) order _ []  cs cans = ([], cs) order _ ns' [] cans = (map fst ns', [])-order phase ns' cs cans +order (CoverageCheck pos) ns' cs cans +    = let ns_out = pick 0 [] (map fst ns')+          cs_out = map pickClause cs in+          (ns_out, cs_out)+  where+    pickClause (pats, def) = (pick 0 [] pats, def)++    -- Order the list so that things in a position in 'pos' are in the first+    -- part, then all the other things later. Otherwise preserve order.+    pick i skipped [] = reverse skipped+    pick i skipped (x : xs) +         | i `elem` pos = x : pick (i + 1) skipped xs+         | otherwise    = pick (i + 1) (x : skipped) xs++order phase ns' cs cans     = let patnames = transpose (map (zip ns') (map (zip cans) (map fst cs)))           -- only sort the arguments where there is no clash in           -- constructor tags between families, the argument type is canonical,@@ -444,7 +466,7 @@           -- clash, because otherwise we can't reliable make the           -- case distinction on evaluation           (patnames_ord, patnames_rest)-                = Data.List.partition (noClash . map snd) patnames +                = Data.List.partition (noClash . map snd) patnames           patnames_ord' = case phase of                                CompileTime -> patnames_ord                                -- reversing tends to make better case trees@@ -460,7 +482,7 @@     rebuild patnames clause = (map (snd . snd) patnames, snd clause)      noClash [] = True-    noClash ((can, p) : ps) = can && not (any (clashPat p) (map snd ps)) +    noClash ((can, p) : ps) = can && not (any (clashPat p) (map snd ps))                                   && noClash ps      clashPat (PCon _ _ _ _) (PConst _) = True@@ -471,7 +493,7 @@     clashPat _ _ = False      -- this compares (+isInaccessible, -numberOfCases)-    moreDistinct xs ys +    moreDistinct xs ys         = compare (snd . fst . head $ xs, numNames [] (map snd ys))                   (snd . fst . head $ ys, numNames [] (map snd xs)) @@ -482,6 +504,41 @@     numNames xs (_ : ps) = numNames xs ps     numNames xs [] = length xs +-- Reorder the patterns in the clause so that the PInferred patterns come+-- last. Also strip 'PInferred' from the top level patterns so that we can+-- go ahead and match.+orderByInf :: [Name] -> [Clause] -> ([Name], [Clause])+orderByInf vs cs = let alwaysInf = getInf cs in+                       (selectInf alwaysInf vs,+                        map deInf (map (selectExp alwaysInf) cs))+  where+    getInf [] = []+    getInf [(pats, def)] = infPos 0 pats+    getInf ((pats, def) : cs) = infPos 0 pats `intersect` getInf cs++    selectExp :: [Int] -> Clause -> Clause+    selectExp infs (pats, def)+         = let (notInf, inf) = splitPats 0 infs [] [] pats in+               (notInf ++ inf, def)++    selectInf :: [Int] -> [a] -> [a]+    selectInf infs ns = let (notInf, inf) = splitPats 0 infs [] [] ns in+                            notInf ++ inf++    splitPats i infpos notInf inf [] = (reverse notInf, reverse inf)+    splitPats i infpos notInf inf (p : ps)+         | i `elem` infpos = splitPats (i + 1) infpos notInf (p : inf) ps+         | otherwise = splitPats (i + 1) infpos (p : notInf) inf ps++    infPos i [] = []+    infPos i (PInferred p : ps) = i : infPos (i + 1) ps+    infPos i (_ : ps) = infPos (i + 1) ps++    deInf (pats, def) = (map deInfPat pats, def)++    deInfPat (PInferred p) = p+    deInfPat p = p+ match :: [Name] -> [Clause] -> SC -- error case                             -> CaseBuilder SC match [] (([], ret) : xs) err@@ -490,8 +547,9 @@          case snd ret of             Impossible -> return ImpossibleCase             tm -> return $ STerm tm -- run out of arguments-match vs cs err = do let ps = partition cs-                     mixture vs ps err+match vs cs err = do let (vs', de_inf) = orderByInf vs cs+                         ps = partition de_inf+                     mixture vs' ps err  mixture :: [Name] -> [Partition] -> SC -> CaseBuilder SC mixture vs [] err = return err
src/Idris/Core/Constraints.hs view
@@ -7,12 +7,12 @@ -} module Idris.Core.Constraints ( ucheck ) where -import Idris.Core.TT ( TC(..), UExp(..), UConstraint(..), FC(..),-                       ConstraintFC(..), Err'(..) )+import Idris.Core.TT (ConstraintFC(..), Err'(..), FC(..), TC(..),+                      UConstraint(..), UExp(..))  import Control.Applicative import Control.Monad.State.Strict-import Data.List ( partition )+import Data.List (partition) import qualified Data.Map.Strict as M import qualified Data.Set as S import Debug.Trace
src/Idris/Core/DeepSeq.hs view
@@ -10,9 +10,9 @@  module Idris.Core.DeepSeq where -import Idris.Core.TT import Idris.Core.CaseTree import Idris.Core.Evaluate+import Idris.Core.TT  import Control.DeepSeq 
src/Idris/Core/Elaborate.hs view
@@ -10,29 +10,30 @@ primitives. -} -{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, PatternGuards #-} module Idris.Core.Elaborate (     module Idris.Core.Elaborate   , module Idris.Core.ProofState   ) where +import Idris.Core.DeepSeq+import Idris.Core.Evaluate import Idris.Core.ProofState-import Idris.Core.ProofTerm(bound_in, getProofTerm, mkProofTerm, bound_in_term,-                            refocus)+import Idris.Core.ProofTerm (bound_in, bound_in_term, getProofTerm, mkProofTerm,+                             refocus) import Idris.Core.TT-import Idris.Core.Evaluate import Idris.Core.Typecheck import Idris.Core.Unify-import Idris.Core.DeepSeq+import Idris.Core.WHNF +import Util.Pretty hiding (fill)+ import Control.DeepSeq import Control.Monad.State.Strict import Data.Char import Data.List import Debug.Trace -import Util.Pretty hiding (fill)- data ElabState aux = ES (ProofState, aux) String (Maybe (ElabState aux))   deriving Show @@ -422,9 +423,12 @@ simplify :: Elab' aux () simplify = processTactic' Simplify -hnf_compute :: Elab' aux ()-hnf_compute = processTactic' HNF_Compute+whnf_compute :: Elab' aux ()+whnf_compute = processTactic' WHNF_Compute +whnf_compute_args :: Elab' aux ()+whnf_compute_args = processTactic' WHNF_ComputeArgs+ eval_in :: Raw -> Elab' aux () eval_in t = processTactic' (EvalIn t) @@ -575,7 +579,7 @@        -- Count arguments to check if we need to normalise the type        let usety = if argsOK (finalise ty) imps                       then finalise ty-                      else normalise ctxt env (finalise ty)+                      else whnfArgs ctxt env (finalise ty)        claims <- -- trace (show (fn, imps, ty, map fst env, normalise ctxt env (finalise ty))) $                  mkClaims usety imps [] (map fst env)        ES (p, a) s prev <- get@@ -697,7 +701,7 @@     do ty <- get_type (Var n)        ctxt <- get_context        env <- get_env-       claims <- doClaims (hnf ctxt env ty) args []+       claims <- doClaims (normalise ctxt env ty) args []        prep_fill n (map fst claims)        let eclaims = sortBy (\ (_, x) (_,y) -> priOrder x y) claims        elabClaims [] False claims@@ -745,7 +749,7 @@             = do g <- goal                  ctxt <- get_context                  env <- get_env-                 case (normalise ctxt env g) of+                 case (whnf ctxt env g) of                     Bind _ (Pi _ _ _) _ -> return ()                     _ -> do a <- getNameFrom (sMN 0 "__pargTy")                             b <- getNameFrom (sMN 0 "__pretTy")@@ -820,7 +824,7 @@        focus s; attack;        ctxt <- get_context        env <- get_env-       case normalise ctxt env fty of+       case whnf ctxt env fty of             -- if f gives a function type, unify our argument type with             -- f's expected argument type             Bind _ (Pi _ argty _) _ -> unifyGoal (forget argty)
src/Idris/Core/Evaluate.hs view
@@ -5,13 +5,14 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, BangPatterns,-             PatternGuards, DeriveGeneric #-}+{-# LANGUAGE BangPatterns, DeriveGeneric, FlexibleInstances,+             MultiParamTypeClasses, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}  module Idris.Core.Evaluate(normalise, normaliseTrace, normaliseC,                 normaliseAll, normaliseBlocking, toValue, quoteTerm,-                rt_simplify, simplify, specialise, hnf, convEq, convEq',+                rt_simplify, simplify, inlineSmall,+                specialise, unfold, convEq, convEq',                 Def(..), CaseInfo(..), CaseDefs(..),                 Accessibility(..), Injectivity, Totality(..), PReason(..), MetaInformation(..),                 Context, initContext, ctxtAlist, next_tvar,@@ -19,24 +20,24 @@                 addDatatype, addCasedef, simplifyCasedef, addOperator,                 lookupNames, lookupTyName, lookupTyNameExact, lookupTy, lookupTyExact,                 lookupP, lookupP_all, lookupDef, lookupNameDef, lookupDefExact, lookupDefAcc, lookupDefAccExact, lookupVal,-                mapDefCtxt,+                mapDefCtxt, tcReducible,                 lookupTotal, lookupTotalExact, lookupInjectiveExact,-                lookupNameTotal, lookupMetaInformation, lookupTyEnv, isTCDict, +                lookupNameTotal, lookupMetaInformation, lookupTyEnv, isTCDict,                 isCanonical, isDConName, canBeDConName, isTConName, isConName, isFnName,                 Value(..), Quote(..), initEval, uniqueNameCtxt, uniqueBindersCtxt, definitions,                 isUniverse) where -import Debug.Trace+import Idris.Core.CaseTree+import Idris.Core.TT+ import Control.Applicative hiding (Const)-import Control.Monad.State -- not Strict!-import qualified Data.Binary as B+import Control.Monad.State import Data.Binary hiding (get, put)+import qualified Data.Binary as B import Data.Maybe (listToMaybe)+import Debug.Trace import GHC.Generics (Generic) -import Idris.Core.TT-import Idris.Core.CaseTree- data EvalState = ES { limited :: [(Name, Int)],                       nexthole :: Int,                       blocking :: Bool }@@ -45,10 +46,10 @@ type Eval a = State EvalState a  data EvalOpt = Spec-             | HNF-             | Simplify+             | Simplify Bool -- ^ whether to expand lets or not              | AtREPL              | RunTT+             | Unfold   deriving (Show, Eq)  initEval = ES [] 0 False@@ -131,10 +132,7 @@          (tm, limited st)  -- | Like normalise, but we only reduce functions that are marked as okay to--- inline (and probably shouldn't reduce lets?)--- 20130908: now only used to reduce for totality checking. Inlining should--- be done elsewhere.-+-- inline, and lets  simplify :: Context -> Env -> TT Name -> TT Name simplify ctxt env t    = evalState (do val <- eval False ctxt [(sUN "lazy", 0),@@ -146,9 +144,18 @@                                            (sUN "prim__syntactic_eq", 0),                                            (sUN "fork", 0)]                                  (map finalEntry env) (finalise t)-                                 [Simplify]+                                 [Simplify True]                    quote 0 val) initEval +-- | Like simplify, but we only reduce functions that are marked as okay to+-- inline, and don't reduce lets +inlineSmall :: Context -> Env -> TT Name -> TT Name+inlineSmall ctxt env t+   = evalState (do val <- eval False ctxt []+                                 (map finalEntry env) (finalise t)+                                 [Simplify False]+                   quote 0 val) initEval+ -- | Simplify for run-time (i.e. basic inlining) rt_simplify :: Context -> Env -> TT Name -> TT Name rt_simplify ctxt env t@@ -162,12 +169,19 @@                                  [RunTT]                    quote 0 val) initEval --- | Reduce a term to head normal form-hnf :: Context -> Env -> TT Name -> TT Name-hnf ctxt env t-   = evalState (do val <- eval False ctxt []-                                 (map finalEntry env)-                                 (finalise t) [HNF]+-- | Unfold the given names in a term, the given number of times in a stack.+-- Preserves 'let'.+-- This is primarily to support inlining of the given names, and can also+-- help with partial evaluation by allowing a rescursive definition to be+-- unfolded once only.+-- Specifically used to unfold definitions using interfaces before going to+-- the totality checker (otherwise mutually recursive definitions in+-- implementations will not work...)+unfold :: Context -> Env -> [(Name, Int)] -> TT Name -> TT Name+unfold ctxt env ns t+   = evalState (do val <- eval False ctxt ns+                               (map finalEntry env) (finalise t)+                               [Unfold]                    quote 0 val) initEval  @@ -187,22 +201,25 @@ unbindEnv env tm = error "Impossible case occurred: couldn't unbind env."  usable :: Bool -- specialising+          -> Bool -- unfolding only           -> Int -- Reduction depth limit (when simplifying/at REPL)           -> Name -> [(Name, Int)] -> Eval (Bool, [(Name, Int)]) -- usable _ _ ns@((MN 0 "STOP", _) : _) = return (False, ns)-usable False depthlimit n [] = return (True, [])-usable True depthlimit n ns+usable False uf depthlimit n [] = return (True, [])+usable True uf depthlimit n ns   = do ES ls num b <- get        if b then return (False, ns)             else case lookup n ls of                     Just 0 -> return (False, ns)                     Just i -> return (True, ns)                     _ -> return (False, ns)-usable False depthlimit n ns+usable False uf depthlimit n ns   = case lookup n ns of          Just 0 -> return (False, ns)          Just i -> return $ (True, (n, abs (i-1)) : filter (\ (n', _) -> n/=n') ns)-         _ -> return $ (True, (n, depthlimit) : filter (\ (n', _) -> n/=n') ns)+         _ -> return $ if uf +                          then (False, ns)+                          else (True, (n, depthlimit) : filter (\ (n', _) -> n/=n') ns)   fnCount :: Int -> Name -> Eval ()@@ -231,10 +248,11 @@         [EvalOpt] -> Eval Value eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where     spec = Spec `elem` opts-    simpl = Simplify `elem` opts+    simpl = Simplify True `elem` opts || Simplify False `elem` opts+    simpl_inline = Simplify False `elem` opts     runtime = RunTT `elem` opts     atRepl = AtREPL `elem` opts-    hnf = HNF `elem` opts+    unfold = Unfold `elem` opts      -- returns 'True' if the function should block     -- normal evaluation should return false@@ -243,33 +261,33 @@            = if always then False                        else not (inl || dict) || elem n stk        | simpl-           = (not (inl || dict) || elem n stk)+           = (not inl || elem n stk)              || (n == sUN "prim__syntactic_eq")        | otherwise = False -    getCases cd | simpl = cases_totcheck cd+    getCases cd | simpl = cases_compiletime cd                 | runtime = cases_runtime cd                 | otherwise = cases_compiletime cd      ev ntimes stk top env (P _ n ty)         | Just (Let t v) <- lookup n genv = ev ntimes stk top env v     ev ntimes_in stk top env (P Ref n ty)-      | not top && hnf = liftM (VP Ref n) (ev ntimes stk top env ty)-      | otherwise          = do let limit = if simpl then 100 else 10000-              (u, ntimes) <- usable spec limit n ntimes_in-              let red = u && (tcReducible n ctxt || spec || atRepl || runtime+              (u, ntimes) <- usable spec unfold limit n ntimes_in+              let red = u && (tcReducible n ctxt || spec || atRepl +                                || runtime || unfold                                 || sUN "assert_total" `elem` stk)               if red then-               do let val = lookupDefAcc n (spec || atRepl || runtime) ctxt+               do let val = lookupDefAccExact n (spec || unfold || atRepl || runtime) ctxt                   case val of-                    [(Function _ tm, Public)] ->+                    Just (Function _ tm, Public) ->                            ev ntimes (n:stk) True env tm-                    [(TyDecl nt ty, _)] -> do vty <- ev ntimes stk True env ty-                                              return $ VP nt n vty-                    [(CaseOp ci _ _ _ _ cd, acc)]-                         | (acc == Public || acc == Hidden || sUN "assert_total" `elem` stk) &&-                             null (fst (cases_totcheck cd)) -> -- unoptimised version+                    Just (TyDecl nt ty, _) -> do vty <- ev ntimes stk True env ty+                                                 return $ VP nt n vty+                    Just (CaseOp ci _ _ _ _ cd, acc)+                         | (acc == Public || acc == Hidden) &&+--                                || sUN "assert_total" `elem` stk) &&+                             null (fst (cases_compiletime cd)) -> -- unoptimised version                        let (ns, tree) = getCases cd in                          if blockSimplify ci n stk                             then liftM (VP Ref n) (ev ntimes stk top env ty)@@ -281,12 +299,12 @@                     _ -> liftM (VP Ref n) (ev ntimes stk top env ty)                else liftM (VP Ref n) (ev ntimes stk top env ty)     ev ntimes stk top env (P nt n ty)-         = liftM (VP nt n) (ev ntimes stk top env ty)+        = liftM (VP nt n) (ev ntimes stk top env ty)     ev ntimes stk top env (V i)-                     | i < length env && i >= 0 = return $ snd (env !! i)-                     | otherwise      = return $ VV i+        | i < length env && i >= 0 = return $ snd (env !! i)+        | otherwise      = return $ VV i     ev ntimes stk top env (Bind n (Let t v) sc)-        | not runtime || occurrences n sc < 2+        | (not (runtime || simpl_inline || unfold)) || occurrences n sc < 2            = do v' <- ev ntimes stk top env v --(finalise v)                 sc' <- ev ntimes stk top ((n, v') : env) sc                 wknV (-1) sc'@@ -315,7 +333,7 @@     -- block reduction immediately under codata (and not forced)     ev ntimes stk top env               (App _ (App _ (App _ d@(P _ (UN dly) _) l@(P _ (UN lco) _)) t) arg)-       | dly == txt "Delay" && lco == txt "Infinite" && not simpl+       | dly == txt "Delay" && lco == txt "Infinite" && not (unfold || simpl)             = do let (f, _) = unApply arg                  let ntimes' = case f of                                     P _ fn _ -> (fn, 0) : ntimes@@ -329,8 +347,8 @@                  evApply ntimes' stk top env [l',t',arg'] d'     -- Treat "assert_total" specially, as long as it's defined!     ev ntimes stk top env (App _ (App _ (P _ n@(UN at) _) _) arg)-       | [(CaseOp _ _ _ _ _ _, _)] <- lookupDefAcc n (spec || atRepl || runtime) ctxt,-         at == txt "assert_total" && not simpl+       | Just (CaseOp _ _ _ _ _ _, _) <- lookupDefAccExact n (spec || atRepl || runtime) ctxt,+         at == txt "assert_total" && not (simpl || unfold)             = ev ntimes (n : stk) top env arg     ev ntimes stk top env (App _ f a)            = do f' <- ev ntimes stk False env f@@ -348,6 +366,7 @@     ev ntimes stk top env (Constant c) = return $ VConstant c     ev ntimes stk top env Erased    = return VErased     ev ntimes stk top env Impossible  = return VImpossible+    ev ntimes stk top env (Inferred tm) = ev ntimes stk top env tm     ev ntimes stk top env (TType i)   = return $ VType i     ev ntimes stk top env (UType u)   = return $ VUType u @@ -357,9 +376,9 @@           = apply ntimes stk top env f args      reapply ntimes stk top env f@(VP Ref n ty) args-       = let val = lookupDefAcc n (spec || atRepl || runtime) ctxt in+       = let val = lookupDefAccExact n (spec || atRepl || runtime) ctxt in          case val of-              [(CaseOp ci _ _ _ _ cd, acc)] ->+              Just (CaseOp ci _ _ _ _ cd, acc) ->                  let (ns, tree) = getCases cd in                      do c <- evCase ntimes n (n:stk) top env ns args tree                         case c of@@ -377,18 +396,15 @@               app <- apply ntimes stk top env a' as               wknV 1 app     apply ntimes_in stk top env f@(VP Ref n ty) args-      | not top && hnf = case args of-                            [] -> return f-                            _ -> return $ unload env f args-      | otherwise          = do let limit = if simpl then 100 else 10000-              (u, ntimes) <- usable spec limit n ntimes_in-              let red = u && (tcReducible n ctxt || spec || atRepl || runtime+              (u, ntimes) <- usable spec unfold limit n ntimes_in+              let red = u && (tcReducible n ctxt || spec || atRepl +                                || unfold || runtime                                 || sUN "assert_total" `elem` stk)               if red then-                 do let val = lookupDefAcc n (spec || atRepl || runtime) ctxt+                 do let val = lookupDefAccExact n (spec || unfold || atRepl || runtime) ctxt                     case val of-                      [(CaseOp ci _ _ _ _ cd, acc)]+                      Just (CaseOp ci _ _ _ _ cd, acc)                            | acc == Public || acc == Hidden ->                            -- unoptimised version                        let (ns, tree) = getCases cd in@@ -399,7 +415,7 @@                                    case c of                                       (Nothing, _) -> return $ unload env (VP Ref n ty) args                                       (Just v, rest) -> evApply ntimes stk top env rest v-                      [(Operator _ i op, _)]  ->+                      Just (Operator _ i op, _)  ->                         if (i <= length args)                            then case op (take i args) of                               Nothing -> return $ unload env (VP Ref n ty) args@@ -687,7 +703,7 @@                                        caseeq ((x,y):ps) xdef ydef                         _ -> return False -    sameCase :: [(Name, Name)] -> Name -> Name -> [Term] -> [Term] -> +    sameCase :: [(Name, Name)] -> Name -> Name -> [Term] -> [Term] ->                 StateT UCs TC Bool     sameCase ps x y xargs yargs           = case (lookupDef x ctxt, lookupDef y ctxt) of@@ -697,7 +713,7 @@                   [CaseOp _ _ _ _ _ yd])                        -> let (xin, xdef) = cases_compiletime xd                               (yin, ydef) = cases_compiletime yd in-                            do liftM2 (&&) +                            do liftM2 (&&)                                   (do ok <- zipWithM (ceq ps)                                               (drop (length xin) xargs)                                               (drop (length yin) yargs)@@ -734,9 +750,7 @@ --                   [Name] SC -- Run time cae definitions  data CaseDefs = CaseDefs {-                  cases_totcheck :: !([Name], SC),                   cases_compiletime :: !([Name], SC),-                  cases_inlined :: !([Name], SC),                   cases_runtime :: !([Name], SC)                 }   deriving Generic@@ -764,11 +778,8 @@     show (Operator ty _ _) = "Operator: " ++ show ty     show (CaseOp (CaseInfo inlc inla inlr) ty atys ps_in ps cd)       = let (ns, sc) = cases_compiletime cd-            (ns_t, sc_t) = cases_totcheck cd             (ns', sc') = cases_runtime cd in           "Case: " ++ show ty ++ " " ++ show ps ++ "\n" ++-                                        "TOTALITY CHECK TIME:\n\n" ++-                                        show ns_t ++ " " ++ show sc_t ++ "\n\n" ++                                         "COMPILE TIME:\n\n" ++                                         show ns ++ " " ++ show sc ++ "\n\n" ++                                         "RUN TIME:\n\n" ++@@ -928,42 +939,37 @@               [(Type, Bool)] -> -- argument types, whether canonical               [Int] ->  -- inaccessible arguments               [Either Term (Term, Term)] ->-              [([Name], Term, Term)] -> -- totality               [([Name], Term, Term)] -> -- compile time-              [([Name], Term, Term)] -> -- inlined               [([Name], Term, Term)] -> -- run time               Type -> Context -> TC Context addCasedef n ei ci@(CaseInfo inline alwaysInline tcdict)            tcase covering reflect asserted argtys inacc-           ps_in ps_tot ps_inl ps_ct ps_rt ty uctxt+           ps_in ps_ct ps_rt ty uctxt     = do let ctxt = definitions uctxt              access = case lookupDefAcc n False uctxt of                            [(_, acc)] -> acc                            _ -> Public-         totalityTime <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_tot ei          compileTime <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_ct ei-         inlined <- simpleCase tcase covering reflect CompileTime emptyFC inacc argtys ps_inl ei          runtime <- simpleCase tcase covering reflect RunTime emptyFC inacc argtys ps_rt ei-         ctxt' <- case (totalityTime, compileTime, inlined, runtime) of-                    (CaseDef args_tot sc_tot _,-                     CaseDef args_ct sc_ct _,-                     CaseDef args_inl sc_inl _,+         ctxt' <- case (compileTime, runtime) of+                    ( CaseDef args_ct sc_ct _,                      CaseDef args_rt sc_rt _) ->                        let inl = alwaysInline -- tcdict                            inlc = (inl || small n args_ct sc_ct) && (not asserted)                            inlr = inl || small n args_rt sc_rt-                           cdef = CaseDefs (args_tot, sc_tot)-                                           (args_ct, sc_ct)-                                           (args_inl, sc_inl)+                           cdef = CaseDefs (args_ct, sc_ct)                                            (args_rt, sc_rt)                            op = (CaseOp (ci { case_inlinable = inlc })-                                                ty argtys ps_in ps_tot cdef,+                                                ty argtys ps_in ps_ct cdef,                                  False, access, Unchecked, EmptyMI)                        in return $ addDef n op ctxt --                    other -> tfail (Msg $ "Error adding case def: " ++ show other)          return uctxt { definitions = ctxt' } --- simplify a definition for totality checking+-- simplify a definition by inlining+-- (Note: This used to be for totality checking, and now it's actually a+-- no-op, but I'm keeping it here because I'll be putting it back with some+-- more carefully controlled inlining at some stage. --- EB) simplifyCasedef :: Name -> ErasureInfo -> Context -> TC Context simplifyCasedef n ei uctxt    = do let ctxt = definitions uctxt@@ -975,7 +981,7 @@                              pdef = map debind ps_in'                          CaseDef args sc _ <- simpleCase False (STerm Erased) False CompileTime emptyFC [] atys pdef ei                          return $ addDef n (CaseOp ci-                                              ty atys ps_in' ps (cd { cases_totcheck = (args, sc) }),+                                              ty atys ps_in' ps (cd { cases_compiletime = (args, sc) }),                                               inj, acc, tot, metainf) ctxt                     _ -> return ctxt@@ -989,7 +995,7 @@                                 (vs, x', y')     debind (Left x)       = let (vs, x') = depat [] x in                                 (vs, x', Impossible)-    simpl (Right (x, y)) = Right (x, simplify uctxt [] y)+    simpl (Right (x, y)) = Right (x, y) -- inline uctxt [] y)     simpl t = t  addOperator :: Name -> Type -> Int -> ([Value] -> Maybe Value) ->
src/Idris/Core/Execute.hs view
@@ -6,48 +6,43 @@ Maintainer  : The Idris Community. -} -{-# LANGUAGE PatternGuards, ExistentialQuantification, CPP #-}+{-# LANGUAGE CPP, ExistentialQuantification, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Core.Execute (execute) where  import Idris.AbsSyntax import Idris.AbsSyntaxTree-import IRTS.Lang(FDesc(..), FType(..))--import Idris.Primitives(Prim(..), primitives)--import Idris.Core.TT-import Idris.Core.Evaluate import Idris.Core.CaseTree-+import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Error--import Debug.Trace+import Idris.Primitives (Prim(..), primitives)+import IRTS.Lang (FDesc(..), FType(..))  import Util.DynamicLinker import Util.System  import Control.Applicative hiding (Const) import Control.Exception+import Control.Monad hiding (forM) import Control.Monad.Trans-import Control.Monad.Trans.State.Strict import Control.Monad.Trans.Except (ExceptT, runExceptT, throwE)-import Control.Monad hiding (forM)-import Data.Maybe+import Control.Monad.Trans.State.Strict import Data.Bits-import Data.Traversable (forM)-import Data.Time.Clock.POSIX (getPOSIXTime) import qualified Data.Map as M+import Data.Maybe+import Data.Time.Clock.POSIX (getPOSIXTime)+import Data.Traversable (forM)+import Debug.Trace+import System.IO  #ifdef IDRIS_FFI-import Foreign.LibFFI import Foreign.C.String+import Foreign.LibFFI import Foreign.Marshal.Alloc (free) import Foreign.Ptr #endif -import System.IO- #ifndef IDRIS_FFI execute :: Term -> Idris Term execute tm = fail "libffi not supported, rebuild Idris with -f FFI"@@ -180,9 +175,9 @@          [Function _ tm] -> doExec env ctxt tm          [TyDecl _ _] -> return (EP Ref n EErased) -- abstract def          [Operator tp arity op] -> return (EP Ref n EErased) -- will be special-cased later-         [CaseOp _ _ _ _ _ (CaseDefs _ ([], STerm tm) _ _)] -> -- nullary fun+         [CaseOp _ _ _ _ _ (CaseDefs ([], STerm tm) _)] -> -- nullary fun              doExec env ctxt tm-         [CaseOp _ _ _ _ _ (CaseDefs _ (ns, sc) _ _)] -> return (EP Ref n EErased)+         [CaseOp _ _ _ _ _ (CaseDefs (ns, sc) _)] -> return (EP Ref n EErased)          [] -> execFail . Msg $ "Could not find " ++ show n ++ " in definitions."          other | length other > 1 -> execFail . Msg $ "Multiple definitions found for " ++ show n                | otherwise        -> execFail . Msg . take 500 $ "got to " ++ show other ++ " lookup up " ++ show n@@ -217,6 +212,7 @@                               doExec env ctxt ((x:xs) !! i) doExec env ctxt Erased = return EErased doExec env ctxt Impossible = fail "Tried to execute an impossible case"+doExec env ctxt (Inferred t) = doExec env ctxt t doExec env ctxt (TType u) = return (EType u) doExec env ctxt (UType u) = return (EUType u) @@ -275,10 +271,10 @@                                            execApp env ctxt r (drop arity args)                       _ -> return (mkEApp f args)                else return (mkEApp f args)-         [CaseOp _ _ _ _ _ (CaseDefs _ ([], STerm tm) _ _)] -> -- nullary fun+         [CaseOp _ _ _ _ _ (CaseDefs ([], STerm tm) _)] -> -- nullary fun              do rhs <- doExec env ctxt tm                 execApp env ctxt rhs args-         [CaseOp _ _ _ _ _ (CaseDefs _ (ns, sc) _ _)] ->+         [CaseOp _ _ _ _ _ (CaseDefs (ns, sc) _)] ->              do res <- execCase env ctxt ns sc args                 return $ fromMaybe (mkEApp f args) res          thing -> return $ mkEApp f args@@ -402,6 +398,12 @@                       "The argument to isNull should be a pointer or file handle or string, but it was " ++                       show ptr ++                       ". Are all cases covered?"++    | Just (FFun "idris_disableBuffering" _ _) <- foreignFromTT arity ty fn xs+       = do execIO $ hSetBuffering stdin NoBuffering+            execIO $ hSetBuffering stdout NoBuffering+            execApp env ctxt ioUnit (drop arity xs)+  -- Right now, there's no way to send command-line arguments to the executor, -- so just return 0.
src/Idris/Core/ProofState.hs view
@@ -10,7 +10,7 @@ evaluation/checking inside the proof system, etc. -} -{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, PatternGuards #-} module Idris.Core.ProofState(     ProofState(..), newProof, envAtFocus, goalAtFocus   , Tactic(..), Goal(..), processTactic, nowElaboratingPS@@ -18,20 +18,21 @@   , keepGiven, getProvenance   ) where -import Idris.Core.Typecheck import Idris.Core.Evaluate+import Idris.Core.ProofTerm import Idris.Core.TT+import Idris.Core.Typecheck import Idris.Core.Unify-import Idris.Core.ProofTerm+import Idris.Core.WHNF -import Control.Monad.State.Strict+import Util.Pretty hiding (fill)+ import Control.Applicative hiding (empty) import Control.Arrow ((***))+import Control.Monad.State.Strict import Data.List import Debug.Trace -import Util.Pretty hiding (fill)- data ProofState = PS { thname            :: Name,                        holes             :: [Name], -- ^ holes still to be solved                        usedns            :: [Name], -- ^ used names, don't use again@@ -81,7 +82,8 @@             | Compute             | ComputeLet Name             | Simplify-            | HNF_Compute+            | WHNF_Compute+            | WHNF_ComputeArgs             | EvalIn Raw             | CheckIn Raw             | Intro (Maybe Name)@@ -651,7 +653,7 @@                   Nothing -> x        let t' = case t of                     x@(Bind y (Pi _ s _) _) -> x-                    _ -> hnf ctxt env t+                    _ -> normalise ctxt env t        (tyv, tyt) <- lift $ check ctxt env ty --        ns <- lift $ unify ctxt env tyv t'        case t' of@@ -668,7 +670,7 @@ intro mn ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =     do let t' = case t of                     x@(Bind y (Pi _ s _) _) -> x-                    _ -> hnf ctxt env t+                    _ -> normalise ctxt env t        case t' of            Bind y (Pi _ s _) t ->                let n = case mn of@@ -825,7 +827,7 @@ patbind n ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =     do let t' = case t of                     x@(Bind y (PVTy s) t) -> x-                    _ -> hnf ctxt env t+                    _ -> normalise ctxt env t        case t' of            Bind y (PVTy s) t -> let t' = updsubst y (P Bound n s) t in                                     return $ Bind n (PVar s) (Bind x (Hole t') (P Bound x t'))@@ -837,13 +839,18 @@     do return $ Bind x (Hole (normalise ctxt env ty)) sc compute ctxt env t = return t -hnf_compute :: RunTactic-hnf_compute ctxt env (Bind x (Hole ty) sc) =-    do let ty' = hnf ctxt env ty in---          trace ("HNF " ++ show (ty, ty')) $+whnf_compute :: RunTactic+whnf_compute ctxt env (Bind x (Hole ty) sc) =+    do let ty' = whnf ctxt env ty in            return $ Bind x (Hole ty') sc-hnf_compute ctxt env t = return t+whnf_compute ctxt env t = return t +whnf_compute_args :: RunTactic+whnf_compute_args ctxt env (Bind x (Hole ty) sc) =+    do let ty' = whnfArgs ctxt env ty in+           return $ Bind x (Hole ty') sc+whnf_compute_args ctxt env t = return t+ -- reduce let bindings only simplify :: RunTactic simplify ctxt env (Bind x (Hole ty) sc) =@@ -1131,7 +1138,8 @@          mktac (StartUnify n)    = start_unify n          mktac Compute           = compute          mktac Simplify          = Idris.Core.ProofState.simplify-         mktac HNF_Compute       = hnf_compute+         mktac WHNF_Compute      = whnf_compute+         mktac WHNF_ComputeArgs  = whnf_compute_args          mktac (Intro n)         = intro n          mktac (IntroTy ty n)    = introTy ty n          mktac (Forall n i t)    = forall n i t
src/Idris/Core/ProofTerm.hs view
@@ -6,7 +6,7 @@ Maintainer  : The Idris Community. -} -{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, PatternGuards #-} module Idris.Core.ProofTerm(     ProofTerm, Goal(..), mkProofTerm, getProofTerm   , resetProofTerm@@ -16,9 +16,9 @@   , goal, atHole   ) where -import Idris.Core.Typecheck import Idris.Core.Evaluate import Idris.Core.TT+import Idris.Core.Typecheck  import Control.Monad.State.Strict import Data.List
src/Idris/Core/TT.hs view
@@ -22,8 +22,8 @@    * We have a simple collection of tactics which we use to elaborate source      programs with implicit syntax into fully explicit terms. -}-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor,-             DeriveDataTypeable, DeriveGeneric, PatternGuards #-}+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveGeneric,+             FunctionalDependencies, MultiParamTypeClasses, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Core.TT(     AppStatus(..), ArithTy(..), Binder(..), Const(..), Ctxt(..)@@ -38,7 +38,7 @@   , bindingOf, bindTyArgs, caseName, constDocs, constIsType, deleteDefExact   , discard, emptyContext, emptyFC, explicitNames, fc_end, fc_fname   , fc_start, fcIn, fileFC, finalise, fmapMB, forget, forgetEnv-  , freeNames, getArgTys, getRetTy, implicitable, instantiate, internalNS+  , freeNames, getArgTys, getRetTy, substRetTy, implicitable, instantiate, internalNS   , intTyName, isInjective, isTypeConst, lookupCtxt   , lookupCtxtExact, lookupCtxtName, mapCtxt, mkApp, nativeTyWidth   , nextName, noOccurrence, nsroot, occurrences@@ -51,40 +51,39 @@   , uniqueNameFrom, uniqueNameSet, unList, updateDef, vToP, weakenTm   ) where +import Util.Pretty hiding (Str)+ -- Work around AMP without CPP-import Prelude (Eq(..), Show(..), Ord(..), Functor(..), Monad(..), String, Int,-                Integer, Ordering(..), Maybe(..), Num(..), Bool(..), Enum(..),-                Read(..), FilePath, Double, (&&), (||), ($), (.), div, error, flip,-                fst, snd, not, mod, read, otherwise)+import Prelude (Bool(..), Double, Enum(..), Eq(..), FilePath, Functor(..), Int,+                Integer, Maybe(..), Monad(..), Num(..), Ord(..), Ordering(..),+                Read(..), Show(..), String, div, error, flip, fst, mod, not,+                otherwise, read, snd, ($), (&&), (.), (||)) -import Control.Applicative (Applicative (..), Alternative)-import qualified Control.Applicative as A (Alternative (..))+import Control.Applicative (Alternative, Applicative(..))+import qualified Control.Applicative as A (Alternative(..)) import Control.DeepSeq (($!!)) import Control.Monad.State.Strict-import Control.Monad.Trans.Except (Except (..))-import Debug.Trace-import qualified Data.Map.Strict as Map+import Control.Monad.Trans.Except (Except(..))+import Data.Binary hiding (get, put)+import qualified Data.Binary as B import Data.Char import Data.Data (Data)-import Data.Monoid (mconcat)-import Numeric (showIntAtBase)-import qualified Data.Text as T+import Data.Foldable (Foldable) import Data.List hiding (group, insert)-import Data.Set(Set, member, fromList, insert)+import qualified Data.Map.Strict as Map import Data.Maybe (listToMaybe)-import Data.Foldable (Foldable)+import Data.Monoid (mconcat)+import Data.Set (Set, fromList, insert, member)+import qualified Data.Text as T import Data.Traversable (Traversable) import Data.Typeable (Typeable) import Data.Vector.Unboxed (Vector) import qualified Data.Vector.Unboxed as V-import qualified Data.Binary as B-import Data.Binary hiding (get, put)+import Debug.Trace import Foreign.Storable (sizeOf) import GHC.Generics (Generic)--import Numeric.IEEE (IEEE (identicalIEEE))--import Util.Pretty hiding (Str)+import Numeric (showIntAtBase)+import Numeric.IEEE (IEEE(identicalIEEE))  data Option = TTypeInTType             | CheckConv@@ -235,7 +234,7 @@                      | TermPart Term                      | RawPart Raw                      | SubReport [ErrorReportPart]-                       deriving (Show, Eq, Data, Generic, Typeable)+                       deriving (Show, Eq, Ord, Data, Generic, Typeable)   data Provenance = ExpectedType@@ -243,7 +242,7 @@                 | InferredVal                 | GivenVal                 | SourceTerm Term-  deriving (Show, Eq, Data, Generic, Typeable)+  deriving (Show, Eq, Ord, Data, Generic, Typeable) {-! deriving instance Binary Err !-}@@ -308,7 +307,7 @@           | RunningElabScript (Err' t) -- ^ The error occurred during a top-level elaboration script           | ElabScriptStaging Name           | FancyMsg [ErrorReportPart]-  deriving (Eq, Functor, Data, Generic, Typeable)+  deriving (Eq, Ord, Functor, Data, Generic, Typeable)  type Err = Err' Term @@ -821,7 +820,7 @@          | RType          | RUType Universe          | RConstant Const-  deriving (Show, Eq, Data, Generic, Typeable)+  deriving (Show, Eq, Ord, Data, Generic, Typeable)  instance Sized Raw where   size (Var name) = 1@@ -941,7 +940,7 @@   size _ = 1  instance Show UExp where-    show (UVar ns x) +    show (UVar ns x)        | x < 26 = ns ++ "." ++ [toEnum (x + fromEnum 'a')]        | otherwise = ns ++ "." ++ toEnum ((x `mod` 26) + fromEnum 'a') : show (x `div` 26)     show (UVal x) = show x@@ -1009,6 +1008,9 @@                              -- (-1) is a special case for 'subtract one from BI'           | Erased -- ^ an erased term           | Impossible -- ^ special case for totality checking+          | Inferred (TT n) -- ^ For building case trees when coverage checkimg only.+                            -- Marks a term as being inferred by the machine, rather than+                            -- given by the programmer           | TType UExp -- ^ the type of types at some level           | UType Universe -- ^ Uniqueness type universe (disjoint from TType)   deriving (Ord, Functor, Data, Generic, Typeable)@@ -1056,6 +1058,7 @@   size (TType u) = 1 + size u   size (Proj a _) = 1 + size a   size Impossible = 1+  size (Inferred t) = size t   size (UType u) = 1 + size u  instance Pretty a o => Pretty (TT a) o where@@ -1289,7 +1292,7 @@   st (Bind x b sc) = Bind x (fmap st b) (st sc)   st t = t -  eqAlpha as (P _ x _) (P _ y _) +  eqAlpha as (P _ x _) (P _ y _)        = x == y || (x, y) `elem` as || (y, x) `elem` as   eqAlpha as (V x) (V y) = x == y   eqAlpha as (Bind x xb xs) (Bind y yb ys)@@ -1301,7 +1304,7 @@        = eqAlpha as xt yt && eqAlpha as xv yv   eqAlphaB as (Guess xt xv) (Guess yt yv)        = eqAlpha as xt yt && eqAlpha as xv yv-  eqAlphaB as bx by = eqAlpha as (binderTy bx) (binderTy by) +  eqAlphaB as bx by = eqAlpha as (binderTy bx) (binderTy by)  -- | Return number of occurrences of V 0 or bound name i the term occurrences :: Eq n => n -> TT n -> Int@@ -1380,6 +1383,7 @@ termSmallerThan x (Constant c) = True termSmallerThan x Erased = True termSmallerThan x Impossible = True+termSmallerThan x (Inferred t) = termSmallerThan x t termSmallerThan x (TType u) = True termSmallerThan x (UType u) = True @@ -1422,6 +1426,7 @@ safeForgetEnv env Erased    = Just $ RConstant Forgot safeForgetEnv env (Proj tm i) = error "Don't know how to forget a projection" safeForgetEnv env Impossible = error "Don't know how to forget Impossible"+safeForgetEnv env (Inferred t) = safeForgetEnv env t  -- | Introduce a 'Bind' into the given term for each element of the -- given list of (name, binder) pairs.@@ -1450,6 +1455,14 @@ getRetTy (Bind n (Pi _ _ _) sc)   = getRetTy sc getRetTy sc = sc +-- | As getRetTy but substitutes names for de Bruijn indices+substRetTy :: TT n -> TT n+substRetTy (Bind n (PVar ty) sc) = substRetTy (substV (P Ref n ty) sc)+substRetTy (Bind n (PVTy ty) sc) = substRetTy (substV (P Ref n ty) sc)+substRetTy (Bind n (Pi _ ty _) sc) = substRetTy (substV (P Ref n ty) sc)+substRetTy sc = sc+   + uniqueNameFrom :: [Name] -> [Name] -> Name uniqueNameFrom []           hs = uniqueName (nextName (sUN "x")) hs uniqueNameFrom (s : supply) hs@@ -1576,6 +1589,7 @@     prettySe p env Erased debug = text "[_]"     prettySe p env (TType i) debug = text "Type" <+> (text . show $ i)     prettySe p env Impossible debug = text "Impossible"+    prettySe p env (Inferred tm) debug = text "<" <+> prettySe p env tm debug <+> text ">"     prettySe p env (UType u) debug = text (show u)      -- Render a `Binder` and its name@@ -1621,6 +1635,7 @@     se p env (Constant c) = show c     se p env Erased = "[__]"     se p env Impossible = "[impossible]"+    se p env (Inferred t) = "<" ++ se p env t ++ ">"     se p env (TType i) = "Type " ++ show i     se p env (UType u) = show u @@ -1729,6 +1744,7 @@       text "!" <> text (show i)     pp p bound Erased = text "<<<erased>>>"     pp p bound Impossible = text "<<<impossible>>>"+    pp p bound (Inferred t) = text "<" <+> pp p bound t <+> text ">"     pp p bound (TType ue) = annotate (AnnType "Type" "The type of types") $                             text "Type"     pp p bound (UType u) = text (show u)
src/Idris/Core/Typecheck.hs view
@@ -6,17 +6,17 @@ Maintainer  : The Idris Community. -} -{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,+{-# LANGUAGE DeriveFunctor, FlexibleInstances, MultiParamTypeClasses,              PatternGuards #-}  module Idris.Core.Typecheck where +import Idris.Core.Evaluate+import Idris.Core.TT+ import Control.Monad.State-import Debug.Trace import qualified Data.Vector.Unboxed as V (length)--import Idris.Core.TT-import Idris.Core.Evaluate+import Debug.Trace  -- To check conversion, normalise each term wrt the current environment. -- Since we haven't converted everything to de Bruijn indices yet, we'll have to@@ -83,7 +83,7 @@ check :: Context -> Env -> Raw -> TC (Term, Type) check ctxt env tm      -- Holes allowed, so constraint namespace doesn't matter-     = evalStateT (check' True [] ctxt env tm) (0, []) +     = evalStateT (check' True [] ctxt env tm) (0, [])  check' :: Bool -> String -> Context -> Env -> Raw -> StateT UCs TC (Term, Type) check' holes tcns ctxt env top = chk (TType (UVar tcns (-5))) Nothing env top where@@ -116,7 +116,7 @@            let fty' = case uniqueBinders (map fst env) (finalise fty) of                         ty@(Bind x (Pi i s k) t) -> ty                         _ -> uniqueBinders (map fst env)-                                 $ case hnf ctxt env fty of+                                 $ case normalise ctxt env fty of                                      ty@(Bind x (Pi i s k) t) -> ty                                      _ -> normalise ctxt env fty            case fty' of@@ -138,7 +138,7 @@            let fty' = case uniqueBinders (map fst env) (finalise fty) of                         ty@(Bind x (Pi i s k) t) -> ty                         _ -> uniqueBinders (map fst env)-                                 $ case hnf ctxt env fty of+                                 $ case normalise ctxt env fty of                                      ty@(Bind x (Pi i s k) t) -> ty                                      _ -> normalise ctxt env fty            (av, aty) <- chk u Nothing env a@@ -343,7 +343,7 @@                      StateT [(Name, (UniqueUse, Universe))] TC ()     chkBinderName env n b        = do let rawty = forgetEnv (map fst env) (binderTy b)-            (_, kind) <- lift $ check ctxt env rawty +            (_, kind) <- lift $ check ctxt env rawty             case kind of                  UType UniqueType -> do ns <- get                                         if n `elem` borrowed
src/Idris/Core/Unify.hs view
@@ -19,13 +19,13 @@   , unrecoverable   ) where -import Idris.Core.TT import Idris.Core.Evaluate+import Idris.Core.TT  import Control.Monad import Control.Monad.State.Strict-import Data.Maybe import Data.List+import Data.Maybe import Debug.Trace  -- terms which need to be injective, with the things we're trying to unify
src/Idris/Core/WHNF.hs view
@@ -8,18 +8,19 @@  {-# LANGUAGE PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-}-module Idris.Core.WHNF(whnf, WEnv) where+module Idris.Core.WHNF(whnf, whnfArgs, WEnv) where -import Idris.Core.TT import Idris.Core.CaseTree import Idris.Core.Evaluate hiding (quote) import qualified Idris.Core.Evaluate as Evaluate+import Idris.Core.TT  import Debug.Trace  -- | A stack entry consists of a term and the environment it is to be -- evaluated in (i.e. it's a thunk) type StackEntry = (Term, WEnv)+ data WEnv = WEnv Int -- number of free variables                  [(Term, WEnv)]   deriving Show@@ -34,10 +35,11 @@ -- environment it was encountered in, so that when we quote back to a term -- we get the substitutions right. -data WHNF = WDCon Int Int Bool Name (Type, WEnv) -- ^ data constructor+data WHNF = WDCon Int Int Bool Name (Term, WEnv) -- ^ data constructor           | WTCon Int Int Name (Type, WEnv) -- ^ type constructor-          | WPRef Name (Type, WEnv) -- ^irreducible global (e.g. a postulate)-          | WBind Name (Binder Term) (Term, WEnv)+          | WPRef Name (Term, WEnv) -- ^irreducible global (e.g. a postulate)+          | WV Int+          | WBind Name (Binder (Term, WEnv)) (Term, WEnv)           | WApp WHNF (Term, WEnv)           | WConstant Const           | WProj WHNF Int@@ -46,24 +48,56 @@           | WErased           | WImpossible --- | Reduce a *closed* term to weak head normal form.-whnf :: Context -> Term -> Term-whnf ctxt tm = quote (do_whnf ctxt (WEnv 0 []) tm)+-- NOTE: These aren't yet ready to be used in practice - there's still a+-- bug or two in the handling of de Bruijn indices. -do_whnf :: Context -> WEnv -> Term -> WHNF-do_whnf ctxt env tm = eval env [] tm+-- | Reduce a term to weak head normal form.+whnf :: Context -> Env -> Term -> Term+-- whnf ctxt env tm = let res = whnf' ctxt env tm in+--                        trace (show tm ++ "\n==>\n" ++ show res ++ "\n") res+whnf ctxt env tm = +   inlineSmall ctxt env $ -- reduce small things in body. This is primarily+                          -- to get rid of any noisy "assert_smaller/assert_total"+                          -- and evaluate any simple operators, which makes things+                          -- easier to read.+     whnf' ctxt env tm+whnf' ctxt env tm = +     quote (do_whnf ctxt (map finalEntry env) (finalise tm))++-- | Reduce a type so that all arguments are expanded+whnfArgs :: Context -> Env -> Term -> Term+whnfArgs ctxt env tm = inlineSmall ctxt env $ finalise (whnfArgs' ctxt env tm)+whnfArgs' ctxt env tm+    = case whnf' ctxt env tm of+           -- The assumption is that de Bruijn indices refer to local things+           -- (so not in the external environment) so we need to instantiate+           -- the name+           Bind n b@(Pi _ ty _) sc -> +                    Bind n b (whnfArgs' ctxt ((n,b):env) +                             (subst n (P Bound n ty) sc))+           res -> tm++finalEntry :: (Name, Binder (TT Name)) -> (Name, Binder (TT Name))+finalEntry (n, b) = (n, fmap finalise b)++do_whnf :: Context -> Env -> Term -> WHNF+do_whnf ctxt genv tm = eval (WEnv 0 []) [] tm   where     eval :: WEnv -> Stack -> Term -> WHNF     eval wenv@(WEnv d env) stk (V i)          | i < length env = let (tm, env') = env !! i in                                 eval env' stk tm-         | otherwise = error "Can't happen: WHNF scope error"+         | otherwise = WV i     eval wenv@(WEnv d env) stk (Bind n (Let t v) sc)          = eval (WEnv d ((v, wenv) : env)) stk sc-    eval (WEnv d env) [] (Bind n b sc) = WBind n b (sc, WEnv (d + 1) env)-    eval (WEnv d env) ((tm, tenv) : stk) (Bind n b sc)+    eval (WEnv d env) ((tm, tenv) : stk) (Bind n b@(Lam _) sc)          = eval (WEnv d ((tm, tenv) : env)) stk sc+    eval wenv@(WEnv d env) stk (Bind n b sc) -- stk must be empty if well typed+         =let n' = uniqueName n (map fst genv) in+              WBind n' (fmap (\t -> (t, wenv)) b) (sc, WEnv (d + 1) env) +    eval env stk (P nt n ty) +         | Just (Let t v) <- lookup n genv = eval env stk v     eval env stk (P nt n ty) = apply env nt n ty stk     eval env stk (App _ f a) = eval env ((a, env) : stk) f     eval env stk (Constant c) = unload (WConstant c) stk@@ -73,30 +107,34 @@      eval env stk Erased = unload WErased stk     eval env stk Impossible = unload WImpossible stk+    eval env stk (Inferred tm) = eval env stk tm     eval env stk (TType u) = unload (WType u) stk     eval env stk (UType u) = unload (WUType u) stk      apply :: WEnv -> NameType -> Name -> Type -> Stack -> WHNF-    apply env nt n ty stk+    apply env nt n ty stk            = let wp = case nt of                           DCon t a u -> WDCon t a u n (ty, env)                           TCon t a -> WTCon t a n (ty, env)                           Ref -> WPRef n (ty, env)                           _ -> WPRef n (ty, env)                         in-            case lookupDefExact n ctxt of-                 Just (CaseOp ci _ _ _ _ cd) ->-                      let (ns, tree) = cases_compiletime cd in-                          case evalCase env ns tree stk of-                               Just w -> w-                               Nothing -> unload wp stk-                 Just (Operator _ i op) ->+            if not (tcReducible n ctxt)+               then unload wp stk+               else case lookupDefAccExact n False ctxt of+                         Just (CaseOp ci _ _ _ _ cd, acc) +                             | acc == Public || acc == Hidden ->+                          let (ns, tree) = cases_compiletime cd in+                              case evalCase env ns tree stk of+                                   Just w -> w+                                   Nothing -> unload wp stk+                         Just (Operator _ i op, acc) ->                           if i <= length stk                              then case runOp env op (take i stk) (drop i stk) of                                   Just v -> v                                   Nothing -> unload wp stk                              else unload wp stk-                 _ -> unload wp stk+                         _ -> unload wp stk      unload :: WHNF -> Stack -> WHNF     unload f [] = f@@ -112,6 +150,8 @@                   -- aren't run on constants are themselves pretty ugly                   -- (it's prim__believe_me and prim__syntacticEq, for                   -- example) so let's not worry too much...+                  -- We will need to deal with believe_me before dropping this+                  -- into the type checker, though.                   Just val -> Just $ eval env rest (quoteTerm val)                   _ -> Nothing @@ -189,7 +229,9 @@ quote (WDCon t a u n (ty, env)) = P (DCon t a u) n (quoteEnv env ty) quote (WTCon t a n (ty, env)) = P (TCon t a) n (quoteEnv env ty) quote (WPRef n (ty, env)) = P Ref n (quoteEnv env ty)-quote (WBind n ty (sc, env)) = Bind n ty (quoteEnv env sc)+quote (WV i) = V i+quote (WBind n b (sc, env)) = Bind n (fmap (\ (t, env) -> quoteEnv env t) b) +                                     (quoteEnv env sc) quote (WApp f (a, env)) = App Complete (quote f) (quoteEnv env a) quote (WConstant c) = Constant c quote (WProj t i) = Proj (quote t) i@@ -201,10 +243,13 @@ quoteEnv :: WEnv -> Term -> Term quoteEnv (WEnv d ws) tm = qe' d ws tm   where+    -- d is number of free variables in the external environment+    -- (all bound in the scope of 'ws')     qe' d ts (V i)-        | i < d = V i-        | otherwise = let (tm, env) = ts !! (i - d) in-                          quoteEnv env tm+        | (i - d) < length ts && (i - d) >= 0+              = let (tm, env) = ts !! (i - d) in+                    quoteEnv env tm+        | otherwise = V i     qe' d ts (Bind n b sc)         = Bind n (fmap (qe' d ts) b) (qe' (d + 1) ts sc)     qe' d ts (App c f a)
src/Idris/Coverage.hs view
@@ -1,921 +1,375 @@ {-| Module      : Idris.Coverage-Description : The coverage and totality checkers for Idris are in this module.-Copyright   :-License     : BSD3-Maintainer  : The Idris Community.--}-{-# LANGUAGE PatternGuards #-}-module Idris.Coverage where--import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.Core.CaseTree--import Idris.AbsSyntax-import Idris.Delaborate-import Idris.Error-import Idris.Output (iWarn, iputStrLn)--import Data.Char-import Data.List-import Data.Either-import Data.Maybe-import Debug.Trace--import Control.Monad.State.Strict---- | Generate a pattern from an 'impossible' LHS.------ We need this to eliminate the pattern clauses which have been--- provided explicitly from new clause generation.-mkPatTm :: PTerm -> Idris Term-mkPatTm t = do i <- getIState-               let timp = addImpl' True [] [] [] i t-               evalStateT (toTT (mapPT deNS timp)) 0-  where-    toTT (PRef _ _ n) = do i <- lift getIState-                           case lookupNameDef n (tt_ctxt i) of-                                [(n', TyDecl nt _)] -> return $ P nt n' Erased-                                _ -> return $ P Ref n Erased-    toTT (PApp _ t args) = do t' <- toTT t-                              args' <- mapM (toTT . getTm) args-                              return $ mkApp t' args'-    toTT (PDPair _ _ _ l _ r) = do l' <- toTT l-                                   r' <- toTT r-                                   return $ mkApp (P Ref sigmaCon Erased) [Erased, Erased, l', r']-    toTT (PPair _ _ _ l r) = do l' <- toTT l-                                r' <- toTT r-                                return $ mkApp (P Ref pairCon Erased) [Erased, Erased, l', r']-    -- For alternatives, pick the first and drop the namespaces. It doesn't-    -- really matter which is taken since matching will ignore the namespace.-    toTT (PAlternative _ _ (a : as)) = toTT a-    toTT _ = do v <- get-                put (v + 1)-                return (P Bound (sMN v "imp") Erased)--    deNS (PRef f hl (NS n _)) = PRef f hl n-    deNS t = t---- | Given a list of LHSs, generate a extra clauses which cover the remaining--- cases. The ones which haven't been provided are marked 'absurd' so--- that the checker will make sure they can't happen.------ This will only work after the given clauses have been typechecked and the--- names are fully explicit!-genClauses :: FC -> Name -> [Term] -> [PTerm] -> Idris [PTerm]-genClauses fc n xs given-   = do i <- getIState-        let lhs_tms = map (\x -> flattenArgs $ delab' i x True True) xs-        -- if a placeholder was given, don't bother generating cases for it-        let lhs_tms' = zipWith mergePlaceholders lhs_tms-                          (map (stripUnmatchable i) (map flattenArgs given))-        let lhss = map pUnApply lhs_tms'-        nty <- case lookupTyExact n (tt_ctxt i) of-                    Just t -> return (normalise (tt_ctxt i) [] t)-                    _ -> fail "Can't happen - genClauses, lookupTyExact"--        let argss = transpose lhss-        let all_args = map (genAll i) (zip (genPH i nty) argss)-        logCoverage 5 $ "COVERAGE of " ++ show n-        logCoverage 5 $ "using type " ++ show nty-        logCoverage 5 $ "non-concrete args " ++ show (genPH i nty)--        logCoverage 5 $ show (lhs_tms, lhss)-        logCoverage 5 $ "Args are: " ++ show argss-        logCoverage 5 $ show (map length argss) ++ "\nAll args:\n" ++ show (map length all_args)-        logCoverage 10 $ "All args are: " ++ show all_args-        logCoverage 3 $ "Original: \n" ++-             showSep "\n" (map (\t -> showTmImpls (delab' i t True True)) xs)-        -- add an infinite supply of explicit arguments to update the possible-        -- cases for (the return type may be variadic, or function type, so-        -- there may be more case splitting that the idris_implicits record-        -- suggests)-        let parg = case lookupCtxt n (idris_implicits i) of-                        (p : _) ->-                          p ++ repeat (PExp 0 [] (sMN 0 "gcarg") Placeholder)-                        _       -> repeat (pexp Placeholder)-        let tryclauses = mkClauses parg all_args-        logCoverage 3 $ show (length tryclauses) ++ " initially to check"-        logCoverage 2 $ showSep "\n" (map (showTm i) tryclauses)-        let new = filter (noMatch i) (nub tryclauses)-        logCoverage 2 $ show (length new) ++ " clauses to check for impossibility"-        logCoverage 4 $ "New clauses: \n" ++ showSep "\n" (map (showTm i) new)---           ++ " from:\n" ++ showSep "\n" (map (showImp True) tryclauses)-        return new---         return (map (\t -> PClause n t [] PImpossible []) new)-  where getLHS i term-            | (f, args) <- unApply term = map (\t -> delab' i t True True) args-            | otherwise = []--        -- if an argument has a non-concrete type (i.e. it's a function-        -- that calculates something from a previous argument) we'll also-        -- need to generate a placeholder pattern for it since it could be-        -- anything based on earlier values-        genPH :: IState -> Type -> [Bool]-        genPH ist (Bind n (Pi _ ty _) sc) = notConcrete ist ty : genPH ist sc-        genPH ist ty = []--        notConcrete ist t | (P _ n _, args) <- unApply t,-                           not (isConName n (tt_ctxt ist)) = True-        notConcrete _ _ = False--        pUnApply (PApp _ f args) = map getTm args-        pUnApply _ = []--        flattenArgs (PApp fc (PApp _ f as) as')-             = flattenArgs (PApp fc f (as ++ as'))-        flattenArgs t = t--        -- Return whether the given clause matches none of the input clauses-        -- (xs)-        noMatch i tm = all (\x -> case matchClause i (stripUnmatchable i (delab' i x True True)) tm of-                                       Right ms -> False-                                       Left miss -> True) xs---        mergePlaceholders :: PTerm -> PTerm -> PTerm-        mergePlaceholders x Placeholder = Placeholder-        mergePlaceholders (PApp fc f args) (PApp fc' f' args')-            = PApp fc' f' (zipWith mergePArg args args')-           where mergePArg x y = let xtm = mergePlaceholders (getTm x) (getTm y) in-                                     x { getTm = xtm}-        mergePlaceholders x _ = x--        mkClauses :: [PArg] -> [[PTerm]] -> [PTerm]-        mkClauses parg args-            | all (== [Placeholder]) args = []-        mkClauses parg args-            = do args' <- mkArg args-                 let tm = PApp fc (PRef fc [] n) (zipWith upd args' parg)-                 return tm-          where-            mkArg :: [[PTerm]] -> [[PTerm]]-            mkArg [] = return []-            mkArg (a : as) = do a' <- a-                                as' <- mkArg as-                                return (a':as')---- | Does this error result rule out a case as valid when coverage checking?-validCoverageCase :: Context -> Err -> Bool-validCoverageCase ctxt (CantUnify _ (topx, _) (topy, _) e _ _)-    = let topx' = normalise ctxt [] topx-          topy' = normalise ctxt [] topy in-          not (sameFam topx' topy' || not (validCoverageCase ctxt e))-  where sameFam topx topy-            = case (unApply topx, unApply topy) of-                   ((P _ x _, _), (P _ y _, _)) -> x == y-                   _ -> False-validCoverageCase ctxt (InfiniteUnify _ _ _) = False-validCoverageCase ctxt (CantConvert _ _ _) = False-validCoverageCase ctxt (At _ e) = validCoverageCase ctxt e-validCoverageCase ctxt (Elaborating _ _ _ e) = validCoverageCase ctxt e-validCoverageCase ctxt (ElaboratingArg _ _ _ e) = validCoverageCase ctxt e-validCoverageCase ctxt _ = True---- | Check whether an error is recoverable in the sense needed for--- coverage checking.-recoverableCoverage :: Context -> Err -> Bool-recoverableCoverage ctxt (CantUnify r (topx, _) (topy, _) e _ _)-    = let topx' = normalise ctxt [] topx-          topy' = normalise ctxt [] topy in-          r || checkRec topx' topy'-  where -- different notion of recoverable than in unification, since we-        -- have no metavars -- just looking to see if a constructor is failing-        -- to unify with a function that may be reduced later-        checkRec (App _ f a) p@(P _ _ _) = checkRec f p-        checkRec p@(P _ _ _) (App _ f a) = checkRec p f-        checkRec fa@(App _ _ _) fa'@(App _ _ _)-            | (f, as) <- unApply fa,-              (f', as') <- unApply fa'-                 = if (length as /= length as')-                      then checkRec f f'-                      else checkRec f f' && and (zipWith checkRec as as')-        checkRec (P xt x _) (P yt y _) = x == y || ntRec xt yt-        checkRec _ _ = False--        ntRec x y | Ref <- x = True-                  | Ref <- y = True-                  | (Bound, Bound) <- (x, y) = True-                  | otherwise = False -- name is different, unrecoverable-recoverableCoverage ctxt (At _ e) = recoverableCoverage ctxt e-recoverableCoverage ctxt (Elaborating _ _ _ e) = recoverableCoverage ctxt e-recoverableCoverage ctxt (ElaboratingArg _ _ _ e) = recoverableCoverage ctxt e-recoverableCoverage _ _ = False--genAll :: IState -> (Bool, [PTerm]) -> [PTerm]-genAll i (addPH, args)-   = case filter (/=Placeholder) $ fnub $ mergePHs $ fnub (concatMap otherPats (fnub args)) of-          [] -> [Placeholder]-          xs -> ph xs-  where-    ph ts = if addPH then Placeholder : ts else ts--    -- Merge patterns with placeholders in other patterns, to ensure we've-    -- covered all possible generated cases-    -- e.g. if we have (True, _) (False, _) (_, True) (_, False) -    -- we should merge these to get (True, True), (False, False)-    -- (False, True) and (True, False)-    mergePHs :: [PTerm] -> [PTerm]-    mergePHs xs = mergePHs' xs xs--    mergePHs' [] all = []-    mergePHs' (x : xs) all = mergePH x all ++ mergePHs' xs all--    mergePH :: PTerm -> [PTerm] -> [PTerm]-    mergePH tm [] = []-    mergePH tm (x : xs) -          | Just merged <- mergePTerm tm x = merged : mergePH tm xs-          | otherwise = mergePH tm xs--    mergePTerm :: PTerm -> PTerm -> Maybe PTerm-    mergePTerm x Placeholder = Just x-    mergePTerm Placeholder x = Just x-    mergePTerm tm@(PRef fc1 hl1 n1) (PRef fc2 hl2 n2)-          | n1 == n2 = Just tm-    mergePTerm (PPair fc1 hl1 p1 x1 y1) (PPair fc2 hl2 p2 x2 y2)-          = do x <- mergePTerm x1 x2-               y <- mergePTerm y1 y2-               Just (PPair fc1 hl1 p1 x y)-    mergePTerm (PDPair fc1 hl1 p1 x1 t1 y1) (PDPair fc2 hl2 p2 x2 t2 y2)-          = do x <- mergePTerm x1 x2-               y <- mergePTerm y1 y2-               t <- mergePTerm t1 t2-               Just (PDPair fc1 hl1 p1 x t y)-    mergePTerm (PApp fc1 f1 args1) (PApp fc2 f2 args2)-          = do fm <- mergePTerm f1 f2-               margs <- mergeArgs args1 args2-               Just (PApp fc1 fm margs)-      where-        mergeArgs [] [] = Just []-        mergeArgs (a : as) (b : bs)-                  = do ma_in <- mergePTerm (getTm a) (getTm b)-                       let ma = a { getTm = ma_in }-                       mas <- mergeArgs as bs-                       Just (ma : mas)-        mergeArgs _ _ = Nothing-    mergePTerm x y | x == y = Just x-                   | otherwise = Nothing--    -- for every constant in a term (at any level) take next one to make sure-    -- that constants which are not explicitly handled are covered-    nextConst (PConstant fc c) = PConstant NoFC (nc' c)-    nextConst o = o--    nc' (I c) = I (c + 1)-    nc' (BI c) = BI (c + 1)-    nc' (Fl c) = Fl (c + 1)-    nc' (B8 c) = B8 (c + 1)-    nc' (B16 c) = B16 (c + 1)-    nc' (B32 c) = B32 (c + 1)-    nc' (B64 c) = B64 (c + 1)-    nc' (Ch c) = Ch (chr $ ord c + 1)-    nc' (Str c) = Str (c ++ "'")-    nc' o = o--    otherPats :: PTerm -> [PTerm]-    otherPats o@(PRef fc hl n) = ph $ ops fc n [] o-    otherPats o@(PApp _ (PRef fc hl n) xs) = ph $ ops fc n xs o-    otherPats o@(PPair fc hls _ l r)-        = ph $ ops fc pairCon-                ([pimp (sUN "A") Placeholder True,-                  pimp (sUN "B") Placeholder True] ++-                 [pexp l, pexp r]) o-    otherPats o@(PDPair fc hls p t _ v)-        = ph $ ops fc sigmaCon-                ([pimp (sUN "a") Placeholder True,-                  pimp (sUN "P") Placeholder True] ++-                 [pexp t,pexp v]) o-    otherPats o@(PConstant _ c) = ph [o, nextConst o]-    otherPats arg = return Placeholder--    ops fc n xs o-        | (TyDecl c@(DCon _ arity _) ty : _) <- lookupDef n (tt_ctxt i)-            = do xs' <- mapM otherPats (map getExpTm xs)-                 let p = resugar (PApp fc (PRef fc [] n) (zipWith upd xs' xs))-                 let tyn = getTy n (tt_ctxt i)-                 case lookupCtxt tyn (idris_datatypes i) of-                         (TI ns _ _ _ _ : _) -> p : map (mkPat fc) (ns \\ [n])-                         _ -> [p]-    ops fc n arg o = return Placeholder--    getExpTm (PImp _ True _ _ _) = Placeholder -- machine inferred, no point!-    getExpTm t = getTm t--    -- put it back to its original form-    resugar (PApp _ (PRef fc hl n) [_,_,t,v])-      | n == sigmaCon-        = PDPair fc [] TypeOrTerm (getTm t) Placeholder (getTm v)-    resugar (PApp _ (PRef fc hl n) [_,_,l,r])-      | n == pairCon-        = PPair fc [] IsTerm (getTm l) (getTm r)-    resugar t = t--    dropForce force (x : xs) i | i `elem` force-        = upd Placeholder x : dropForce force xs (i + 1)-    dropForce force (x : xs) i = x : dropForce force xs (i + 1)-    dropForce _ [] _ = []---    getTy n ctxt = case lookupTy n ctxt of-                          (t : _) -> case unApply (getRetTy t) of-                                        (P _ tyn _, _) -> tyn-                                        x -> error $ "Can't happen getTy 1 " ++ show (n, x)-                          _ -> error "Can't happen getTy 2"--    mkPat fc x = case lookupCtxt x (idris_implicits i) of-                      (pargs : _)-                         -> PApp fc (PRef fc [] x) (map (upd Placeholder) pargs)-                      _ -> error "Can't happen - genAll"--    fnub :: [PTerm] -> [PTerm]-    fnub xs = fnub' [] xs--    fnub' :: [PTerm] -> [PTerm] -> [PTerm]-    fnub' acc (x : xs) | x `qelem` acc = fnub' acc (filter (not.(quickEq x)) xs)-                       | otherwise = fnub' (x : acc) xs-    fnub' acc [] = acc--    -- quick check for constructor equality-    quickEq :: PTerm -> PTerm -> Bool-    quickEq (PConstant _ n) (PConstant _ n') = n == n'-    quickEq (PRef _ _ n) (PRef _ _ n') = n == n'-    quickEq (PPair _ _ _ l r) (PPair _ _ _ l' r') = quickEq l l' && quickEq r r'-    quickEq (PApp _ t as) (PApp _ t' as')-        | length as == length as'-           = quickEq t t' && and (zipWith quickEq (map getTm as) (map getTm as'))-    quickEq Placeholder Placeholder = True-    quickEq x y = False--    qelem :: PTerm -> [PTerm] -> Bool-    qelem x [] = False-    qelem x (y : ys) | x `quickEq` y = True-                     | otherwise = qelem x ys---upd :: t -> PArg' t -> PArg' t-upd p' p = p { getTm = p' }---- | Check whether function and all descendants cover all cases--- (partial is okay, as long as it's due to recursion)-checkAllCovering :: FC -> [Name] -> Name -> Name -> Idris ()-checkAllCovering fc done top n | not (n `elem` done)-   = do i <- get-        case lookupTotal n (tt_ctxt i) of-             [tot@(Partial NotCovering)] ->-                    do let msg = show top ++ " is " ++ show tot ++ " due to " ++ show n-                       putIState i { idris_totcheckfail = (fc, msg) : idris_totcheckfail i }-                       addIBC (IBCTotCheckErr fc msg)-             [Partial _] ->-                case lookupCtxt n (idris_callgraph i) of-                     [cg] -> mapM_ (checkAllCovering fc (n : done) top)-                                   (calls cg)-                     _ -> return ()-             x -> return () -- stop if total-checkAllCovering _ _ _ _ = return ()---- | Check if, in a given group of type declarations mut_ns, the--- constructor cn : ty is strictly positive, and update the context--- accordingly-checkPositive :: [Name]       -- ^ the group of type declarations-              -> (Name, Type) -- ^ the constructor-              -> Idris Totality-checkPositive mut_ns (cn, ty')-    = do i <- getIState-         let ty = delazy' True (normalise (tt_ctxt i) [] ty')-         let p = cp i ty-         let tot = if p then Total (args ty) else Partial NotPositive-         let ctxt' = setTotal cn tot (tt_ctxt i)-         putIState (i { tt_ctxt = ctxt' })-         logCoverage 5 $ "Constructor " ++ show cn ++ " is " ++ show tot ++ " with " ++ show mut_ns-         addIBC (IBCTotal cn tot)-         return tot-  where-    args t = [0..length (getArgTys t)-1]--    cp i (Bind n (Pi _ aty _) sc)-         = posArg i aty && cp i sc-    cp i t | (P _ n' _ , args) <- unApply t,-             n' `elem` mut_ns = all noRec args-    cp i _ = True--    posArg ist (Bind _ (Pi _ nty _) sc) = noRec nty && posArg ist sc-    posArg ist t = posParams ist t--    noRec arg = all (\x -> x `notElem` mut_ns) (allTTNames arg)--    -- If the type appears recursively in a parameter argument, that's-    -- fine, otherwise if it appears in an argument it's not fine.-    posParams ist t | (P _ n _, args) <- unApply t-       = case lookupCtxtExact n (idris_datatypes ist) of-              Just ti -> checkParamsOK (param_pos ti) 0 args-              Nothing -> and (map (posParams ist) args)-    posParams ist t = noRec t--    checkParamsOK ppos i [] = True-    checkParamsOK ppos i (p : ps)-          | i `elem` ppos = checkParamsOK ppos (i + 1) ps-          | otherwise = noRec p && checkParamsOK ppos (i + 1) ps---- | Calculate the totality of a function from its patterns.  Either--- follow the size change graph (if inductive) or check for--- productivity (if coinductive)-calcTotality :: FC -> Name -> [([Name], Term, Term)] -> Idris Totality-calcTotality fc n pats-    = do i <- getIState-         let opts = case lookupCtxt n (idris_flags i) of-                            [fs] -> fs-                            _ -> []-         case mapMaybe (checkLHS i) (map (\ (_, l, r) -> l) pats) of-            (failure : _) -> return failure-            _ -> checkSizeChange n-  where-    checkLHS i (P _ fn _)-        = case lookupTotalExact fn (tt_ctxt i) of-               Just (Partial _) -> return (Partial (Other [fn]))-               _ -> Nothing-    checkLHS i (App _ f a) = mplus (checkLHS i f) (checkLHS i a)-    checkLHS _ _ = Nothing--checkTotality :: [Name] -> FC -> Name -> Idris Totality-checkTotality path fc n-    | n `elem` path = return (Partial (Mutual (n : path)))-    | otherwise = do-        t <- getTotality n-        i <- getIState-        ctxt' <- do ctxt <- getContext-                    tclift $ simplifyCasedef n (getErasureInfo i) ctxt-        setContext ctxt'-        ctxt <- getContext-        i <- getIState-        let opts = case lookupCtxt n (idris_flags i) of-                            [fs] -> fs-                            _ -> []-        t' <- case t of-                Unchecked ->-                    case lookupDef n ctxt of-                        [CaseOp _ _ _ _ pats _] ->-                            do t' <- if AssertTotal `elem` opts-                                        then return $ Total []-                                        else calcTotality fc n pats-                               logCoverage 2 $ "Set to " ++ show t'-                               setTotality n t'-                               addIBC (IBCTotal n t')-                               return t'-                        [TyDecl (DCon _ _ _) ty] ->-                            case unApply (getRetTy ty) of-                              (P _ tyn _, _) -> do-                                 let ms = case lookupCtxt tyn (idris_datatypes i) of-                                       [TI _ _ _ _ xs@(_:_)] -> xs-                                       ts -> [tyn]-                                 checkPositive ms (n, ty)-                              _-> return $ Total []-                        _ -> return $ Total []-                x -> return x-        case t' of-            Total _ -> return t'-            Productive -> return t'-            e -> do w <- cmdOptType WarnPartial-                    if TotalFn `elem` opts-                       then do totalityError t'; return t'-                       else do when (w && not (PartialFn `elem` opts)) $-                                   warnPartial n t'-                               return t'-  where-    totalityError t = do i <- getIState-                         let msg = show n ++ " is " ++ show t-                         putIState i { idris_totcheckfail = (fc, msg) : idris_totcheckfail i}-                         addIBC (IBCTotCheckErr fc msg)--    warnPartial n t-       = do i <- getIState-            case lookupDef n (tt_ctxt i) of-               [x] -> do-                  iWarn fc . pprintErr i . Msg $ "Warning - " ++ show n ++ " is " ++ show t---                                ++ "\n" ++ show x---                   let cg = lookupCtxtName Nothing n (idris_callgraph i)---                   iputStrLn (show cg)---checkDeclTotality :: (FC, Name) -> Idris Totality-checkDeclTotality (fc, n)-    = do logCoverage 2 $ "Checking " ++ show n ++ " for totality"-         i <- getIState-         let opts = case lookupCtxtExact n (idris_flags i) of-                              Just fs -> fs-                              _ -> []-         when (CoveringFn `elem` opts) $ checkAllCovering fc [] n n-         t <- checkTotality [] fc n-         return t---- If the name calls something which is partial, set it as partial-verifyTotality :: (FC, Name) -> Idris ()-verifyTotality (fc, n)-    = do logCoverage 2 $ "Checking " ++ show n ++ "'s descendents are total"-         ist <- getIState-         case lookupTotalExact n (tt_ctxt ist) of-              Just (Total _) -> do-                 let ns = getNames (tt_ctxt ist)--                 case getPartial ist [] ns of-                      Nothing -> return ()-                      Just bad -> do let t' = Partial (Other bad)-                                     logCoverage 2 $ "Set to " ++ show t'-                                     setTotality n t'-                                     addIBC (IBCTotal n t')-              _ -> return ()-  where-    getNames ctxt = case lookupDefExact n ctxt of-                         Just (CaseOp  _ _ _ _ _ defs)-                           -> let (top, def) = cases_compiletime defs in-                                  map fst (findCalls' True def top)-                         _ -> []--    getPartial ist [] [] = Nothing-    getPartial ist bad [] = Just bad-    getPartial ist bad (n : ns)-        = case lookupTotalExact n (tt_ctxt ist) of-               Just (Partial _) -> getPartial ist (n : bad) ns-               _ -> getPartial ist bad ns---- | Calculate the size change graph for this definition------ SCG for a function f consists of a list of:---    (g, [(a1, sizechange1), (a2, sizechange2), ..., (an, sizechangen)])------ where g is a function called--- a1 ... an are the arguments of f in positions 1..n of g--- sizechange1 ... sizechange2 is how their size has changed wrt the input--- to f---    Nothing, if the argument is unrelated to the input-buildSCG :: (FC, Name) -> Idris ()-buildSCG (_, n) = do-   ist <- getIState-   case lookupCtxt n (idris_callgraph ist) of-       [cg] -> case lookupDefExact n (tt_ctxt ist) of-           Just (CaseOp _ _ _ pats _ cd) ->-             let (args, sc) = cases_totcheck cd in-               do logCoverage 2 $ "Building SCG for " ++ show n ++ " from\n"-                                ++ show pats ++ "\n" ++ show sc-                  let newscg = buildSCG' ist n (rights pats) args-                  logCoverage 5 $ "SCG is: " ++ show newscg-                  addToCG n ( cg { scg = newscg } )-           _ -> return () -- CG comes from a type declaration only-       [] -> logCoverage 5 $ "Could not build SCG for " ++ show n ++ "\n"-       x -> error $ "buildSCG: " ++ show (n, x)--delazy = delazy' False -- not lazy codata-delazy' all t@(App _ f a)-     | (P _ (UN l) _, [_, _, arg]) <- unApply t,-       l == txt "Force" = delazy' all arg-     | (P _ (UN l) _, [P _ (UN lty) _, _, arg]) <- unApply t,-       l == txt "Delay" && (all || lty /= txt "Infinite") = delazy arg-     | (P _ (UN l) _, [P _ (UN lty) _, arg]) <- unApply t,-       l == txt "Delayed" && (all || lty /= txt "Infinite") = delazy' all arg-delazy' all (App s f a) = App s (delazy' all f) (delazy' all a)-delazy' all (Bind n b sc) = Bind n (fmap (delazy' all) b) (delazy' all sc)-delazy' all t = t--data Guardedness = Toplevel | Unguarded | Guarded | Delayed-  deriving Show--buildSCG' :: IState -> Name -> [(Term, Term)] -> [Name] -> [SCGEntry]-buildSCG' ist topfn pats args = nub $ concatMap scgPat pats where-  scgPat (lhs, rhs) = let lhs' = delazy lhs-                          rhs' = delazy rhs-                          (f, pargs) = unApply (dePat lhs') in-                            findCalls [] Toplevel (dePat rhs') (patvars lhs')-                                      (zip pargs [0..])--  -- Under a delay, calls are excluded from the graph - if it's a call to a-  -- non-total function we'll find that in the final totality check-  findCalls cases Delayed ap@(P _ n _) pvs args = []-  findCalls cases guarded ap@(App _ f a) pvs pargs-     -- under a call to "assert_total", don't do any checking, just believe-     -- that it is total.-     | (P _ (UN at) _, [_, _]) <- unApply ap,-       at == txt "assert_total" = []-     -- don't go under calls to functions which are asserted total-     | (P _ n _, _) <- unApply ap,-       Just opts <- lookupCtxtExact n (idris_flags ist),-       AssertTotal `elem` opts = []-     -- under a guarded call to "Delay Infinite", we are 'Delayed', so don't-     -- check under guarded constructors.-     | (P _ (UN del) _, [_,_,arg]) <- unApply ap,-       Guarded <- guarded,-       del == txt "Delay"-           = findCalls cases Delayed arg pvs pargs-     | (P _ n _, args) <- unApply ap,-       Delayed <- guarded,-       isConName n (tt_ctxt ist)-           = -- Still under a 'Delay' and constructor guarded, so check-             -- just the arguments to the constructor, remaining Delayed-             concatMap (\x -> findCalls cases guarded x pvs pargs) args-     | (P _ ifthenelse _, [_, _, t, e]) <- unApply ap,-       ifthenelse == sNS (sUN "ifThenElse") ["Bool", "Prelude"]-       -- Continue look inside if...then...else blocks-       -- TODO: Consider whether we should do this for user defined ifThenElse-       -- rather than just the one in the Prelude as a special case-       = findCalls cases guarded t pvs pargs ++-         findCalls cases guarded e pvs pargs-     | (P _ n _, args) <- unApply ap,-       caseName n && n /= topfn,-       notPartial (lookupTotalExact n (tt_ctxt ist))-       -- case block - look inside the block, as long as it was covering-       -- (i.e. not currently set at Partial) to get a more accurate size-       -- change result from the top level patterns (also to help pass-       -- information through from guarded corecursion accurately)-       = concatMap (\x -> findCalls cases Unguarded x pvs pargs) args ++-             if n `notElem` cases-                then findCallsCase (n : cases) guarded n args pvs pargs-                else []-     | (P _ n _, args) <- unApply ap,-       Delayed <- guarded-       -- Under a delayed recursive call just check the arguments-           = concatMap (\x -> findCalls cases Unguarded x pvs pargs) args-     | (P _ n _, args) <- unApply ap-        -- Ordinary call, not under a delay.-        -- If n is a constructor, set 'args' as Guarded-        = let nguarded = case guarded of-                              Unguarded -> Unguarded-                              x -> if isConName n (tt_ctxt ist)-                                      then Guarded-                                      else Unguarded in-              mkChange n args pargs ++-                 concatMap (\x -> findCalls cases nguarded x pvs pargs) args-    where notPartial (Just (Partial NotCovering)) = False-          notPartial _ = True-  findCalls cases guarded (App _ f a) pvs pargs-        = findCalls cases Unguarded f pvs pargs ++ findCalls cases Unguarded a pvs pargs-  findCalls cases guarded (Bind n (Let t v) e) pvs pargs-        = findCalls cases Unguarded t pvs pargs ++-          findCalls cases Unguarded v pvs pargs ++ findCalls cases guarded e (n : pvs) pargs-  findCalls cases guarded (Bind n t e) pvs pargs-        = findCalls cases Unguarded (binderTy t) pvs pargs ++-          findCalls cases guarded e (n : pvs) pargs-  findCalls cases guarded (P _ f _ ) pvs pargs-      | not (f `elem` pvs) = [(f, [])]-  findCalls _ _ _ _ _ = []--  -- Assumption is that names are preserved in the case block (shadowing-  -- dealt with by the elaborator) so we can just assume the top level names-  -- are okay for building the size change-  findCallsCase cases guarded n args pvs pargs-      = case lookupDefExact n (tt_ctxt ist) of-           Just (CaseOp _ _ _ pats _ cd) ->-                concatMap (fccPat cases pvs pargs args guarded) (rights pats)-           Nothing -> []--  fccPat cases pvs pargs args g (lhs, rhs)-      = let lhs' = delazy lhs-            rhs' = delazy rhs-            (f, pargs_case) = unApply (dePat lhs')-            -- pargs is a pair of a term, and the argument position that-            -- term appears in. If any of the arguments to the case block-            -- are also on the lhs, we also want those patterns to appear-            -- in the parg list so that we'll spot patterns which are-            -- smaller than then-            newpargs = newPArg args pargs-            -- Now need to update the rhs of the case with the names in the-            -- outer definition: In rhs', wherever we see what's in pargs_case,-            -- replace it with the corresponding thing in pargs-            csubs = zip pargs_case args-            newrhs = doCaseSubs csubs (dePat rhs')-            pargs' = pargs ++ addPArg newpargs pargs_case in-               findCalls cases g newrhs pvs pargs'-    where-      doCaseSubs [] tm = tm-      doCaseSubs ((x, x') : cs) tm-           = doCaseSubs (subIn x x' cs) (substTerm x x' tm)--      subIn x x' [] = []-      subIn x x' ((l, r) : cs)-          = (substTerm x x' l, substTerm x x' r) : subIn x x' cs--  addPArg (Just (t, i) : ts) (t' : ts') = (t', i) : addPArg ts ts'-  addPArg (Nothing : ts) (t' : ts') = addPArg ts ts'-  addPArg _ _ = []--  newPArg :: [Term] -> [(Term, Int)] -> [Maybe (Term, Int)]-  newPArg (t : ts) pargs = case lookup t pargs of-                                Just i -> Just (t, i) : newPArg ts pargs-                                Nothing -> Nothing : newPArg ts pargs-  newPArg [] pargs = []--  expandToArity n args-     = case lookupTy n (tt_ctxt ist) of-            [ty] -> expand 0 (normalise (tt_ctxt ist) [] ty) args-            _ -> args-     where expand i (Bind n (Pi _ _ _) sc) (x : xs) = x : expand (i + 1) sc xs-           expand i (Bind n (Pi _ _ _) sc) [] = Just (i, Same) : expand (i + 1) sc []-           expand i _ xs = xs--  mkChange n args pargs = [(n, expandToArity n (sizes args))]-    where-      sizes [] = []-      sizes (a : as) = checkSize a pargs : sizes as--      -- find which argument in pargs <a> is smaller than, if any-      checkSize a ((p, i) : ps)-          | a == p = Just (i, Same)-          | (P _ (UN as) _, [_,_,arg,_]) <- unApply a,-            as == txt "assert_smaller" && arg == p-                  = Just (i, Smaller)-          | smaller Nothing a (p, Nothing) = Just (i, Smaller)-          | otherwise = checkSize a ps-      checkSize a [] = Nothing--      -- the smaller thing we find must be defined in the same group of mutally-      -- defined types as <a>, and not be coinductive - so carry the type of-      -- the constructor we've gone under.--      smaller (Just tyn) a (t, Just tyt)-         | a == t = isInductive (fst (unApply (getRetTy tyn)))-                                (fst (unApply (getRetTy tyt)))-      smaller ty a (ap@(App _ f s), _)-          | (P (DCon _ _ _) n _, args) <- unApply ap-               = let tyn = getType n in-                     any (smaller (ty `mplus` Just tyn) a)-                         (zip args (map toJust (getArgTys tyn)))-      -- check higher order recursive arguments-      smaller ty (App _ f s) a = smaller ty f a-      smaller _ _ _ = False--      toJust (n, t) = Just t--      getType n = case lookupTyExact n (tt_ctxt ist) of-                       Just ty -> delazy (normalise (tt_ctxt ist) [] ty) -- must exist--      isInductive (P _ nty _) (P _ nty' _) =-          let (co, muts) = case lookupCtxt nty (idris_datatypes ist) of-                                [TI _ x _ _ muts] -> (x, muts)-                                _ -> (False, []) in-              (nty == nty' || any (== nty') muts) && not co-      isInductive _ _ = False--  dePat (Bind x (PVar ty) sc) = dePat (instantiate (P Bound x ty) sc)-  dePat t = t--  patvars (Bind x (PVar _) sc) = x : patvars sc-  patvars _ = []--checkSizeChange :: Name -> Idris Totality-checkSizeChange n = do-   ist <- getIState-   case lookupCtxt n (idris_callgraph ist) of-       [cg] -> do let ms = mkMultiPaths ist [] (scg cg)-                  logCoverage 5 ("Multipath for " ++ show n ++ ":\n" ++-                            "from " ++ show (scg cg) ++ "\n" ++-                            show (length ms) ++ "\n" ++-                            showSep "\n" (map show ms))-                  logCoverage 6 (show cg)-                  -- every multipath must have an infinitely descending-                  -- thread, then the function terminates-                  -- also need to checks functions called are all total-                  -- (Unchecked is okay as we'll spot problems here)-                  let tot = map (checkMP ist n (getArity ist n)) ms-                  logCoverage 4 $ "Generated " ++ show (length tot) ++ " paths"-                  logCoverage 5 $ "Paths for " ++ show n ++ " yield " ++-                       (showSep "\n" (map show (zip ms tot)))-                  return (noPartial tot)-       [] -> do logCoverage 5 $ "No paths for " ++ show n-                return Unchecked-  where getArity ist n-          = case lookupTy n (tt_ctxt ist) of-                 [ty] -> arity (normalise (tt_ctxt ist) [] ty)-                 _ -> error "Can't happen: checkSizeChange.getArity"--type MultiPath = [SCGEntry]--mkMultiPaths :: IState -> MultiPath -> [SCGEntry] -> [MultiPath]-mkMultiPaths ist path [] = [reverse path]-mkMultiPaths ist path cg = concatMap extend cg-  where extend (nextf, args)-           | (nextf, args) `inPath` path = [ reverse ((nextf, args) : path) ]-           | [Unchecked] <- lookupTotal nextf (tt_ctxt ist)-               = case lookupCtxt nextf (idris_callgraph ist) of-                    [ncg] -> mkMultiPaths ist ((nextf, args) : path) (scg ncg)-                    _ -> [ reverse ((nextf, args) : path) ]-           | otherwise = [ reverse ((nextf, args) : path) ]--        inPath :: SCGEntry -> [SCGEntry] -> Bool-        inPath f [] = False-        inPath f (g : gs) = smallerEq f g || f == g || inPath f gs--        smallerEq :: SCGEntry -> SCGEntry -> Bool-        smallerEq (f, args) (g, args')-            = f == g && not (null (filter smallers args))-                     && filter smallers args == filter smallers args'-        smallers (Just (_, Smaller)) = True-        smallers _ = False---- If any route along the multipath leads to infinite descent, we're fine.--- Try a route beginning with every argument.---   If we reach a point we've been to before, but with a smaller value,---   that means there is an infinitely descending path from that argument.--checkMP :: IState -> Name -> Int -> MultiPath -> Totality-checkMP ist topfn i mp = if i > 0-                     then let paths = (map (tryPath 0 [] mp) [0..i-1]) in---                               trace ("Paths " ++ show paths) $-                               collapse paths-                     else tryPath 0 [] mp 0-  where-    tryPath' d path mp arg-           = let res = tryPath d path mp arg in-                 trace (show mp ++ "\n" ++ show arg ++ " " ++ show res) res--    mkBig (e, d) = (e, 10000)--    tryPath :: Int -> [((SCGEntry, Int), Int)] -> MultiPath -> Int -> Totality-    tryPath desc path [] _ = Total []---     tryPath desc path ((UN "believe_me", _) : _) arg---             = Partial BelieveMe-    -- if we get to a constructor, it's fine as long as it's strictly positive-    tryPath desc path ((f, _) : es) arg-        | [TyDecl (DCon _ _ _) _] <- lookupDef f (tt_ctxt ist)-            = case lookupTotalExact f (tt_ctxt ist) of-                   Just (Total _) -> Unchecked -- okay so far-                   Just (Partial _) -> Partial (Other [f])-                   x -> Unchecked -- An error elsewhere, set as Unchecked to make-                                  -- some progress-        | [TyDecl (TCon _ _) _] <- lookupDef f (tt_ctxt ist)-            = Total []-    tryPath desc path (e@(f, args) : es) arg-        | [Total a] <- lookupTotal f (tt_ctxt ist) = Total a-        | e `elem` es && allNothing args = Partial (Mutual [f])-    tryPath desc path (e@(f, nextargs) : es) arg-        | [Total a] <- lookupTotal f (tt_ctxt ist) = Total a-        | [Partial _] <- lookupTotal f (tt_ctxt ist) = Partial (Other [f])-        | Just d <- lookup (e, arg) path-            = if desc - d > 0 -- Now lower than when we were last here-                   then -- trace ("Descent " ++ show (desc - d) ++ " "-                        --      ++ show (path, e)) $-                        Total []-                   else Partial (Mutual (map (fst . fst . fst) path ++ [f]))-        | e `elem` map (fst . fst) path-           && not (f `elem` map fst es)-              = Partial (Mutual (map (fst . fst . fst) path ++ [f]))-        | [Unchecked] <- lookupTotal f (tt_ctxt ist) =-            let argspos = zip nextargs [0..]-                pathres =-                  do (a, pos) <- argspos-                     case a of-                        Nothing -> -- gone up, but if the-                                   -- rest definitely terminates without any-                                   -- cycles (including the path so far, which-                                   -- we take as inaccessible) the path is fine-                            return $ tryPath 0 (map mkBig (((e, arg), desc) : path)) es pos-                        Just (nextarg, sc) ->-                          if nextarg == arg then-                            case sc of-                              Same -> return $ tryPath desc (((e, arg), desc) : path)-                                                       es pos-                              Smaller -> return $ tryPath (desc+1)-                                                          (((e, arg), desc) : path)-                                                          es-                                                          pos-                              _ -> trace ("Shouldn't happen " ++ show e) $-                                      return (Partial Itself)-                            else return Unchecked in---                   trace (show (desc, argspos, path, es, pathres)) $-                   collapse pathres--        | otherwise = Unchecked--allNothing :: [Maybe a] -> Bool-allNothing xs = null (collapseNothing (zip xs [0..]))--collapseNothing :: [(Maybe a, b)] -> [(Maybe a, b)]-collapseNothing ((Nothing, t) : xs)-   = (Nothing, t) : filter (\ (x, _) -> case x of-                                             Nothing -> False-                                             _ -> True) xs-collapseNothing (x : xs) = x : collapseNothing xs-collapseNothing [] = []--noPartial :: [Totality] -> Totality-noPartial (Partial p : xs) = Partial p-noPartial (_ : xs)         = noPartial xs-noPartial []               = Total []--collapse :: [Totality] -> Totality-collapse xs = collapse' Unchecked xs-collapse' def (Total r : xs)   = Total r-collapse' def (Unchecked : xs) = collapse' def xs-collapse' def (d : xs)         = collapse' d xs--- collapse' Unchecked []         = Total []-collapse' def []               = def--totalityCheckBlock :: Idris ()-totalityCheckBlock = do-         ist <- getIState-         -- Do totality checking after entire mutual block-         mapM_ (\n -> do logElab 5 $ "Simplifying " ++ show n-                         ctxt' <- do ctxt <- getContext-                                     tclift $ simplifyCasedef n (getErasureInfo ist) ctxt-                         setContext ctxt')-                 (map snd (idris_totcheck ist))-         mapM_ buildSCG (idris_totcheck ist)-         mapM_ checkDeclTotality (idris_totcheck ist)-         clear_totcheck+Description : Clause generation for coverage checking+Copyright   :+License     : BSD3+Maintainer  : The Idris Community.+-}+{-# LANGUAGE PatternGuards #-}+module Idris.Coverage(genClauses, validCoverageCase, recoverableCoverage,+                      mkPatTm) where++import Idris.AbsSyntax+import Idris.Core.CaseTree+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Delaborate+import Idris.Error+import Idris.Output (iWarn, iputStrLn)++import Control.Monad.State.Strict+import Data.Char+import Data.Either+import Data.List+import Data.Maybe+import Debug.Trace++-- | Generate a pattern from an 'impossible' LHS.+--+-- We need this to eliminate the pattern clauses which have been+-- provided explicitly from new clause generation.+mkPatTm :: PTerm -> Idris Term+mkPatTm t = do i <- getIState+               let timp = addImpl' True [] [] [] i t+               evalStateT (toTT (mapPT deNS timp)) 0+  where+    toTT (PRef _ _ n) = do i <- lift getIState+                           case lookupNameDef n (tt_ctxt i) of+                                [(n', TyDecl nt _)] -> return $ P nt n' Erased+                                _ -> return $ P Ref n Erased+    toTT (PApp _ t args) = do t' <- toTT t+                              args' <- mapM (toTT . getTm) args+                              return $ mkApp t' args'+    toTT (PDPair _ _ _ l _ r) = do l' <- toTT l+                                   r' <- toTT r+                                   return $ mkApp (P Ref sigmaCon Erased) [Erased, Erased, l', r']+    toTT (PPair _ _ _ l r) = do l' <- toTT l+                                r' <- toTT r+                                return $ mkApp (P Ref pairCon Erased) [Erased, Erased, l', r']+    -- For alternatives, pick the first and drop the namespaces. It doesn't+    -- really matter which is taken since matching will ignore the namespace.+    toTT (PAlternative _ _ (a : as)) = toTT a+    toTT _ = do v <- get+                put (v + 1)+                return (P Bound (sMN v "imp") Erased)++    deNS (PRef f hl (NS n _)) = PRef f hl n+    deNS t = t++-- | Given a list of LHSs, generate a extra clauses which cover the remaining+-- cases. The ones which haven't been provided are marked 'absurd' so+-- that the checker will make sure they can't happen.+--+-- This will only work after the given clauses have been typechecked and the+-- names are fully explicit!+genClauses :: FC -> Name -> [([Name], Term)] -> -- (Argument names, LHS) +              [PTerm] -> Idris [PTerm]+-- No clauses (only valid via elab reflection). We should probably still do+-- a check here somehow, e.g. that one of the arguments is an obviously+-- empty type. In practice, this should only really be used for Void elimination.+genClauses fc n lhs_tms [] = return [] +genClauses fc n lhs_tms given+   = do i <- getIState+      +        let lhs_given = zipWith removePlaceholders lhs_tms +                            (map (stripUnmatchable i) (map flattenArgs given))+        +        logCoverage 5 $ "Building coverage tree for:\n" ++ showSep "\n" (map show (lhs_given))+        let givenpos = mergePos (map getGivenPos given)++        (cns, ctree_in) <- +                         case simpleCase False (UnmatchedCase "Undefined") False+                              (CoverageCheck givenpos) emptyFC [] []+                              lhs_given +                              (const []) of+                           OK (CaseDef cns ctree_in _) ->+                              return (cns, ctree_in)+                           Error e -> tclift $ tfail $ At fc e+            +        let ctree = trimOverlapping (addMissingCons i ctree_in)+        let (coveredas, missingas) = mkNewClauses (tt_ctxt i) n cns ctree+        let covered = map (\t -> delab' i t True True) coveredas+        let missing = filter (\x -> x `notElem` covered) $+                          map (\t -> delab' i t True True) missingas++        logCoverage 5 $ "Coverage from case tree for " ++ show n ++ ": " ++ show ctree+        logCoverage 2 $ show (length missing) ++ " missing clauses for " ++ show n+        logCoverage 3 $ "Missing clauses:\n" ++ showSep "\n" +                              (map showTmImpls missing)+        logCoverage 10 $ "Covered clauses:\n" ++ showSep "\n" +                              (map showTmImpls covered)+        return missing+    where+        flattenArgs (PApp fc (PApp _ f as) as')+             = flattenArgs (PApp fc f (as ++ as'))+        flattenArgs t = t++getGivenPos :: PTerm -> [Int]+getGivenPos (PApp _ _ pargs) = getGiven 0 (map getTm pargs)+  where+    getGiven i (Placeholder : tms) = getGiven (i + 1) tms+    getGiven i (_ : tms) = i : getGiven (i + 1) tms+    getGiven i [] = []+getGivenPos _ = []++-- Return a list of Ints which are in every list+mergePos :: [[Int]] -> [Int]+mergePos [] = []+mergePos [x] = x+mergePos (x : xs) = intersect x (mergePos xs)++removePlaceholders :: ([Name], Term) -> PTerm -> ([Name], Term, Term)+removePlaceholders (ns, tm) ptm = (ns, rp tm ptm, Erased)+  where+    rp Erased Placeholder = Erased+    rp tm Placeholder = Inferred tm+    rp tm (PApp _ pf pargs)+       | (tf, targs) <- unApply tm+           = let tf' = rp tf pf+                 targs' = zipWith rp targs (map getTm pargs) in+                 mkApp tf' targs'+    rp tm (PPair _ _ _ pl pr)+       | (tf, [tyl, tyr, tl, tr]) <- unApply tm+           = let tl' = rp tl pl+                 tr' = rp tr pr in+                 mkApp tf [Erased, Erased, tl', tr'] +    rp tm (PDPair _ _ _ pl pt pr)+       | (tf, [tyl, tyr, tl, tr]) <- unApply tm+           = let tl' = rp tl pl+                 tr' = rp tr pr in+                 mkApp tf [Erased, Erased, tl', tr'] +    rp tm _ = tm++mkNewClauses :: Context -> Name -> [Name] -> SC -> ([Term], [Term])+mkNewClauses ctxt fn ns sc +     = (map (mkPlApp (P Ref fn Erased)) $+            mkFromSC True (map (\n -> P Ref n Erased) ns) sc,+        map (mkPlApp (P Ref fn Erased)) $+            mkFromSC False (map (\n -> P Ref n Erased) ns) sc)+  where+    mkPlApp f args = mkApp f (map erasePs args)++    erasePs ap@(App t f a) +        | (f, args) <- unApply ap = mkApp f (map erasePs args)+    erasePs (P _ n _) | not (isConName n ctxt) = Erased+    erasePs tm = tm++    mkFromSC cov args sc = evalState (mkFromSC' cov args sc) []++    mkFromSC' :: Bool -> [Term] -> SC -> State [[Term]] [[Term]]+    mkFromSC' cov args (STerm _) +        = if cov then return [args] else return [] -- leaf of provided case+    mkFromSC' cov args (UnmatchedCase _) +        = if cov then return [] else return [args] -- leaf of missing case+    mkFromSC' cov args ImpossibleCase = return []+    mkFromSC' cov args (Case _ x alts)+       = do done <- get+            if (args `elem` done)+               then return []+               else do alts' <- mapM (mkFromAlt cov args x) alts +                       put (args : done)+                       return (concat alts')+    mkFromSC' cov args _ = return [] -- Should never happen++    mkFromAlt :: Bool -> [Term] -> Name -> CaseAlt -> State [[Term]] [[Term]]+    mkFromAlt cov args x (ConCase c t conargs sc)+       = let argrep = mkApp (P (DCon t (length args) False) c Erased)+                            (map (\n -> P Ref n Erased) conargs)+             args' = map (subst x argrep) args in+             mkFromSC' cov args' sc+    mkFromAlt cov args x (ConstCase c sc)+       = let argrep = Constant c +             args' = map (subst x argrep) args in+             mkFromSC' cov args' sc+    mkFromAlt cov args x (DefaultCase sc)+       = mkFromSC' cov args sc+    mkFromAlt cov _ _ _ = return []++-- Modify the generated case tree (the case tree builder doesn't have access+-- to the context, so can't do this itself).+-- Replaces any missing cases with explicit cases for the missing constructors+addMissingCons :: IState -> SC -> SC+addMissingCons ist sc = evalState (addMissingConsSt ist sc) 0++addMissingConsSt :: IState -> SC -> State Int SC+addMissingConsSt ist (Case t n alts) = liftM (Case t n) (addMissingAlts n alts)+  where+    addMissingAlt :: CaseAlt -> State Int CaseAlt+    addMissingAlt (ConCase n i ns sc) +         = liftM (ConCase n i ns) (addMissingConsSt ist sc)+    addMissingAlt (FnCase n ns sc) +         = liftM (FnCase n ns) (addMissingConsSt ist sc)+    addMissingAlt (ConstCase c sc) +         = liftM (ConstCase c) (addMissingConsSt ist sc)+    addMissingAlt (SucCase n sc) +         = liftM (SucCase n) (addMissingConsSt ist sc)+    addMissingAlt (DefaultCase sc) +         = liftM DefaultCase (addMissingConsSt ist sc)++    addMissingAlts argn as +--          | any hasDefault as = map addMissingAlt as+         | cons@(n:_) <- mapMaybe collectCons as,+           Just tyn <- getConType n,+           Just ti <- lookupCtxtExact tyn (idris_datatypes ist)+             -- If we've fallen through on this argument earlier, then the+             -- things which were matched in other cases earlier can't be missing+             -- cases now+             = let missing = con_names ti \\ cons in+                   do as' <- addCases missing as+                      mapM addMissingAlt as'+         | consts@(n:_) <- mapMaybe collectConsts as+             = let missing = nub (map nextConst consts) \\ consts in+                   mapM addMissingAlt (addCons missing as)+    addMissingAlts n as = mapM addMissingAlt as++    addCases missing [] = return []+    addCases missing (DefaultCase rhs : rest)+       = do missing' <- mapM (genMissingAlt rhs) missing+            return (mapMaybe id missing' ++ rest)+    addCases missing (c : rest) +       = liftM (c :) $ addCases missing rest++    addCons missing [] = []+    addCons missing (DefaultCase rhs : rest)+       = map (genMissingConAlt rhs) missing ++ rest+    addCons missing (c : rest) = c : addCons missing rest++    genMissingAlt rhs n+         | Just (TyDecl (DCon tag arity _) ty) <- lookupDefExact n (tt_ctxt ist)+             = do name <- get+                  put (name + arity)+                  let args = map (name +) [0..arity-1]+                  return $ Just $ ConCase n tag (map (\i -> sMN i "m") args) rhs+         | otherwise = return Nothing++    genMissingConAlt rhs n = ConstCase n rhs++    collectCons (ConCase n i args sc) = Just n+    collectCons _ = Nothing++    collectConsts (ConstCase c sc) = Just c+    collectConsts _ = Nothing++    hasDefault (DefaultCase (UnmatchedCase _)) = False+    hasDefault (DefaultCase _) = True+    hasDefault _ = False++    getConType n = do ty <- lookupTyExact n (tt_ctxt ist)+                      case unApply (getRetTy (normalise (tt_ctxt ist) [] ty)) of+                           (P _ tyn _, _) -> Just tyn+                           _ -> Nothing+    +    -- for every constant in a term (at any level) take next one to make sure+    -- that constants which are not explicitly handled are covered+    nextConst (I c) = I (c + 1)+    nextConst (BI c) = BI (c + 1)+    nextConst (Fl c) = Fl (c + 1)+    nextConst (B8 c) = B8 (c + 1)+    nextConst (B16 c) = B16 (c + 1)+    nextConst (B32 c) = B32 (c + 1)+    nextConst (B64 c) = B64 (c + 1)+    nextConst (Ch c) = Ch (chr $ ord c + 1)+    nextConst (Str c) = Str (c ++ "'")+    nextConst o = o++addMissingConsSt ist sc = return sc++trimOverlapping :: SC -> SC+trimOverlapping sc = trim [] [] sc+  where+    trim :: [(Name, (Name, [Name]))] -> -- Variable - constructor+args already matched+            [(Name, [Name])] -> -- Variable - constructors which it can't be+            SC -> SC+    trim mustbes nots (Case t vn alts)+       | Just (c, args) <- lookup vn mustbes+            = Case t vn (trimAlts mustbes nots vn (substMatch (c, args) alts))+       | Just cantbe <- lookup vn nots+            = let alts' = filter (notConMatch cantbe) alts in+                  Case t vn (trimAlts mustbes nots vn alts')+       | otherwise = Case t vn (trimAlts mustbes nots vn alts)+    trim cs nots sc = sc++    trimAlts cs nots vn [] = []+    trimAlts cs nots vn (ConCase cn t args sc : rest)+        = ConCase cn t args (trim (addMatch vn (cn, args) cs) nots sc) :+            trimAlts cs (addCantBe vn cn nots) vn rest+    trimAlts cs nots vn (FnCase n ns sc : rest)+        = FnCase n ns (trim cs nots sc) : trimAlts cs nots vn rest+    trimAlts cs nots vn (ConstCase c sc : rest)+        = ConstCase c (trim cs nots sc) : trimAlts cs nots vn rest+    trimAlts cs nots vn (SucCase n sc : rest)+        = SucCase n (trim cs nots sc) : trimAlts cs nots vn rest+    trimAlts cs nots vn (DefaultCase sc : rest)+        = DefaultCase (trim cs nots sc) : trimAlts cs nots vn rest++    isConMatch c (ConCase cn t args sc) = c == cn+    isConMatch _ _ = False++    substMatch :: (Name, [Name]) -> [CaseAlt] -> [CaseAlt]+    substMatch ca [] = []+    substMatch (c,args) (ConCase cn t args' sc : _)+        | c == cn = [ConCase c t args (substNames (zip args' args) sc)]+    substMatch ca (_:cs) = substMatch ca cs++    substNames [] sc = sc+    substNames ((n, n') : ns) sc +       = substNames ns (substSC n n' sc)++    notConMatch cs (ConCase cn t args sc) = cn `notElem` cs+    notConMatch cs _ = True++    addMatch vn cn cs = (vn, cn) : cs++    addCantBe :: Name -> Name -> [(Name, [Name])] -> [(Name, [Name])]+    addCantBe vn cn [] = [(vn, [cn])]+    addCantBe vn cn ((n, cbs) : nots)+          | vn == n = ((n, nub (cn : cbs)) : nots)+          | otherwise = ((n, cbs) : addCantBe vn cn nots)++-- | Does this error result rule out a case as valid when coverage checking?+validCoverageCase :: Context -> Err -> Bool+validCoverageCase ctxt (CantUnify _ (topx, _) (topy, _) e _ _)+    = let topx' = normalise ctxt [] topx+          topy' = normalise ctxt [] topy in+          not (sameFam topx' topy' || not (validCoverageCase ctxt e))+  where sameFam topx topy+            = case (unApply topx, unApply topy) of+                   ((P _ x _, _), (P _ y _, _)) -> x == y+                   _ -> False+validCoverageCase ctxt (InfiniteUnify _ _ _) = False+validCoverageCase ctxt (CantConvert _ _ _) = False+validCoverageCase ctxt (At _ e) = validCoverageCase ctxt e+validCoverageCase ctxt (Elaborating _ _ _ e) = validCoverageCase ctxt e+validCoverageCase ctxt (ElaboratingArg _ _ _ e) = validCoverageCase ctxt e+validCoverageCase ctxt _ = True++-- | Check whether an error is recoverable in the sense needed for+-- coverage checking.+recoverableCoverage :: Context -> Err -> Bool+recoverableCoverage ctxt (CantUnify r (topx, _) (topy, _) e _ _)+    = let topx' = normalise ctxt [] topx+          topy' = normalise ctxt [] topy in+          checkRec topx' topy'+  where -- different notion of recoverable than in unification, since we+        -- have no metavars -- just looking to see if a constructor is failing+        -- to unify with a function that may be reduced later+        checkRec (App _ f a) p@(P _ _ _) = checkRec f p+        checkRec p@(P _ _ _) (App _ f a) = checkRec p f+        checkRec fa@(App _ _ _) fa'@(App _ _ _)+            | (f, as) <- unApply fa,+              (f', as') <- unApply fa'+                 = if (length as /= length as')+                      then checkRec f f'+                      else checkRec f f' && and (zipWith checkRec as as')+        checkRec (P xt x _) (P yt y _) = x == y || ntRec xt yt+        checkRec _ _ = False++        ntRec x y | Ref <- x = True+                  | Ref <- y = True+                  | (Bound, Bound) <- (x, y) = True+                  | otherwise = False -- name is different, unrecoverable+recoverableCoverage ctxt (At _ e) = recoverableCoverage ctxt e+recoverableCoverage ctxt (Elaborating _ _ _ e) = recoverableCoverage ctxt e+recoverableCoverage ctxt (ElaboratingArg _ _ _ e) = recoverableCoverage ctxt e+recoverableCoverage _ _ = False+
src/Idris/DSL.hs view
@@ -10,14 +10,12 @@  module Idris.DSL where -import Data.Generics.Uniplate.Data (transform)- import Idris.AbsSyntax--import Idris.Core.TT import Idris.Core.Evaluate+import Idris.Core.TT  import Control.Monad.State.Strict+import Data.Generics.Uniplate.Data (transform) import Debug.Trace  debindApp :: SyntaxInfo -> PTerm -> PTerm
src/Idris/DeepSeq.hs view
@@ -12,20 +12,20 @@   , module Idris.Core.DeepSeq   ) where -import Idris.Core.DeepSeq-import Idris.Docstrings-import Idris.Core.TT import Idris.AbsSyntaxTree import Idris.Colours+import Idris.Core.DeepSeq+import Idris.Core.TT+import Idris.Docstrings+import qualified Idris.Docstrings as D+import IRTS.CodegenCommon (OutputType(..)) import IRTS.Lang (PrimFn(..))-import IRTS.CodegenCommon (OutputType (..))-import Util.DynamicLinker -import Control.DeepSeq-import Network.Socket(PortNumber)+import Util.DynamicLinker  import qualified Cheapskate.Types as CT-import qualified Idris.Docstrings as D+import Control.DeepSeq+import Network.Socket (PortNumber)  -- These types don't have Generic instances instance NFData CT.Options where
src/Idris/Delaborate.hs view
@@ -13,23 +13,22 @@   , pprintDelabTy, pprintErr, resugar   ) where -import Util.Pretty- import Idris.AbsSyntax-import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Docstrings (overview, renderDocstring, renderDocTerm)+import Idris.Core.TT+import Idris.Docstrings (overview, renderDocTerm, renderDocstring) import Idris.ErrReverse +import Util.Pretty+ import Prelude hiding ((<$>)) +import Control.Applicative (Alternative((<|>)))+import Control.Monad.State import Data.Generics.Uniplate.Data (transform)-import Data.Maybe (mapMaybe) import Data.List (intersperse, nub)+import Data.Maybe (mapMaybe) import qualified Data.Text as T-import Control.Applicative (Alternative((<|>)))-import Control.Monad.State- import Debug.Trace  bugaddr = "https://github.com/idris-lang/Idris-dev/issues"@@ -81,10 +80,10 @@  -- | Delaborate a term without resugaring delab :: IState -> Term -> PTerm-delab i tm = delab' i tm False False +delab i tm = delab' i tm False False  delabMV :: IState -> Term -> PTerm-delabMV i tm = delab' i tm False True +delabMV i tm = delab' i tm False True  -- | Delaborate a term directly, leaving case applications as they are. -- We need this for interactive case splitting, where we need access to the@@ -112,7 +111,7 @@ delabTy' ist imps tm fullname mvs docases = de [] imps tm   where     un = fileFC "(val)"-    +     -- Special case for spotting applications of case functions     -- (Normally the scrutinee is let-bound, but hole types get normalised,     -- so they could appear in this form. The scrutinee is always added as@@ -123,7 +122,7 @@           | docases           , isCaseApp sc           , (P _ cOp _, args@(_:_)) <- unApply sc-          , Just caseblock <- delabCase env imps (last args) cOp args +          , Just caseblock <- delabCase env imps (last args) cOp args                  = caseblock      de env _ (App _ f a) = deFn env f [a]@@ -174,6 +173,7 @@     de env _ (Proj _ _) = error "Delaboration got run-time-only Proj!"     de env _ Erased = Placeholder     de env _ Impossible = Placeholder+    de env _ (Inferred t) = Placeholder     de env _ (TType i) = PType un     de env _ (UType u) = PUniverse un u 
src/Idris/Directives.hs view
@@ -9,11 +9,10 @@  import Idris.AbsSyntax import Idris.ASTUtils-import Idris.Imports-import Idris.Output (sendHighlighting)- import Idris.Core.Evaluate import Idris.Core.TT+import Idris.Imports+import Idris.Output (sendHighlighting)  import Util.DynamicLinker 
src/Idris/Docs.hs view
@@ -5,7 +5,7 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE DeriveFunctor, PatternGuards, MultiWayIf #-}+{-# LANGUAGE DeriveFunctor, MultiWayIf, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Docs (     pprintDocs@@ -15,19 +15,20 @@  import Idris.AbsSyntax import Idris.AbsSyntaxTree-import Idris.Delaborate-import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Docstrings (Docstring, emptyDocstring, noDocs, nullDocstring, renderDocstring, DocTerm, renderDocTerm, overview)+import Idris.Core.TT+import Idris.Delaborate+import Idris.Docstrings (DocTerm, Docstring, emptyDocstring, noDocs,+                         nullDocstring, overview, renderDocTerm,+                         renderDocstring)  import Util.Pretty  import Prelude hiding ((<$>))  import Control.Arrow (first)--import Data.Maybe import Data.List+import Data.Maybe import qualified Data.Text as T  -- TODO: Only include names with public/export accessibility@@ -48,6 +49,7 @@              | InterfaceDoc Name d  -- interface docs                             [FunDoc' d] -- method docs                             [(Name, Maybe d)] -- parameters and their docstrings+                            [PTerm] -- parameter constraints                             [(Maybe Name, PTerm, (d, [(Name, d)]))] -- implementations: name for named implementations, the constraint term, the docs                             [PTerm] -- sub interfaces                             [PTerm] -- super interfaces@@ -139,13 +141,18 @@              if null args then text "No constructors."              else nest 4 (text "Constructors:" <> line <>                           vsep (map (pprintFDWithoutTotality ist False) args))-pprintDocs ist (InterfaceDoc n doc meths params implementations sub_interfaces super_interfaces ctor)+pprintDocs ist (InterfaceDoc n doc meths params constraints implementations sub_interfaces super_interfaces ctor)            = nest 4 (text "Interface" <+> prettyName True (ppopt_impl ppo) [] n <>                      if nullDocstring doc                        then empty                        else line <> renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc)              <> line <$>              nest 4 (text "Parameters:" <$> prettyParameters)++             <> (if null constraints+                 then empty+                 else line <$> nest 4 (text "Constraints:" <$> prettyConstraints))+              <> line <$>              nest 4 (text "Methods:" <$>                       vsep (map (pprintFDWithTotality ist False) meths))@@ -232,6 +239,9 @@     isSubInterface (PPi _   _            _ _ pt)                                           = isSubInterface pt     isSubInterface _                                                                       = False +    prettyConstraints =+      cat (punctuate (comma <> space) (map (pprintPTerm ppo params' [] infixes) constraints))+     prettyParameters =       if any (isJust . snd) params          then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params)@@ -335,7 +345,7 @@                      SN _ -> return Nothing                      _    -> fmap Just $ docFun ctorN        return $ InterfaceDoc-                  n docstr mdocs params+                  n docstr mdocs params (interface_constraints ci)                   implementations' (map (\(_,tm,_) -> tm) sub_interfaces) super_interfaces                   ctorDocs   where
src/Idris/Docstrings.hs view
@@ -14,24 +14,21 @@   , renderHtml, annotCode, DocTerm(..), renderDocTerm, checkDocstring   ) where -import qualified Cheapskate as C-import qualified Cheapskate.Types as CT-import Cheapskate.Html (renderDoc)+import Idris.Core.TT (Err, Name, OutputAnnotation(..), Term, TextFormatting(..))  import Util.Pretty -import Idris.Core.TT (OutputAnnotation(..), TextFormatting(..), Name, Term, Err)- import Prelude hiding ((<$>)) -import qualified Data.Text as T-import qualified Data.Foldable as F+import qualified Cheapskate as C+import Cheapskate.Html (renderDoc)+import qualified Cheapskate.Types as CT import Data.Foldable (Foldable)-import Data.Traversable (Traversable)+import qualified Data.Foldable as F import qualified Data.Sequence as S-+import qualified Data.Text as T+import Data.Traversable (Traversable) import GHC.Generics (Generic)- import Text.Blaze.Html (Html)  -- | The various kinds of code samples that can be embedded in docs
src/Idris/Elab/AsPat.hs view
@@ -7,12 +7,11 @@ -} module Idris.Elab.AsPat(desugarAs) where -import Idris.Core.TT import Idris.AbsSyntax+import Idris.Core.TT  import Control.Applicative import Control.Monad.State.Strict- import Data.Generics.Uniplate.Data (transformM)  -- | Desugar by changing x@y on lhs to let x = y in ... or rhs
src/Idris/Elab/Clause.hs view
@@ -10,58 +10,54 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings hiding (Unchecked) import Idris.DSL+import Idris.Elab.AsPat+import Idris.Elab.Term+import Idris.Elab.Transform+import Idris.Elab.Type+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Elab.Term-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iRenderResult, iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval+import Idris.Primitives+import Idris.Providers+import Idris.Termination import Idris.Transforms-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, iRenderResult, sendHighlighting) import IRTS.Lang -import Idris.Elab.AsPat-import Idris.Elab.Type-import Idris.Elab.Transform-import Idris.Elab.Utils--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings hiding (Unchecked) import Util.Pretty hiding ((<$>))+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad-import Control.Monad.State.Strict as State import qualified Control.Monad.State.Lazy as LState+import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Data.Word--import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)+import Data.Word+import Debug.Trace import Numeric  -- | Elaborate a collection of left-hand and right-hand pairs - that is, a@@ -91,11 +87,16 @@            cs_elab <- mapM (elabClause info opts)                            (zip [0..] cs)            ctxt <- getContext-           -- pats_raw is the version we'll work with at compile time:-           -- no simplification or PE+           -- pats_raw is the basic type checked version, no PE or forcing+           let optinfo = idris_optimisation ist            let (pats_in, cs_full) = unzip cs_elab            let pats_raw = map (simple_lhs ctxt) pats_in+           -- We'll apply forcing to the left hand side here, so that we don't+           -- do any unnecessary case splits+           let pats_forced = map (force_lhs optinfo) pats_raw+            logElab 3 $ "Elaborated patterns:\n" ++ show pats_raw+           logElab 5 $ "Forced patterns:\n" ++ show pats_forced             solveDeferred fc n @@ -114,9 +115,10 @@            -- If the definition is specialisable, this reduces the            -- RHS            pe_tm <- doPartialEval ist tpats+            let pats_pe = if petrans-                            then map (simple_lhs ctxt) pe_tm-                            else pats_raw+                            then map (force_lhs optinfo . simple_lhs ctxt) pe_tm+                            else pats_forced             let tcase = opt_typecase (idris_options ist) @@ -143,11 +145,19 @@             -- addCaseDef builds case trees from <pdef> and <pdef'> -           -- pdef is the compile-time pattern definition.-           -- This will get further inlined to help with totality checking.-           let pdef = map (\(ns, lhs, rhs) -> (map fst ns, lhs, rhs)) $ map debind pats_raw+           -- pdef is the compile-time pattern definition, after forcing+           -- optimisation applied to LHS+           let pdef = map (\(ns, lhs, rhs) -> (map fst ns, lhs, rhs)) $ +                          map debind pats_forced+           -- pdef_cov is the pattern definition without forcing, which+           -- we feed to the coverage checker (we need to know what the+           -- programmer wrote before forcing erasure)+           let pdef_cov+                    = map (\(ns, lhs, rhs) -> (map fst ns, lhs, rhs)) $ +                          map debind pats_raw            -- pdef_pe is the one which will get further optimised-           -- for run-time, and, partially evaluated+           -- for run-time, with no forcing optimisation of the LHS because+           -- the affects erasure. Also, it's partially evaluated            let pdef_pe = map debind pats_transformed             logElab 5 $ "Initial typechecked patterns:\n" ++ show pats_raw@@ -176,13 +186,15 @@            pmissing <-                    if cov && not (hasDefault pats_raw)                       then do -- Generate clauses from the given possible cases-                              missing <- genClauses fc n (map getLHS pdef) cs_full+                              missing <- genClauses fc n +                                                 (map (\ (ns,tm,_) -> (ns, tm)) pdef)+                                                 cs_full                               -- missing <- genMissing n scargs sc-                              missing' <- filterM (checkPossible info fc True n) missing+                              missing' <- checkPossibles info fc True n missing                               -- Filter out the ones which match one of the                               -- given cases (including impossible ones)                               let clhs = map getLHS pdef-                              logElab 2 $ "Must be unreachable:\n" +++                              logElab 2 $ "Must be unreachable (" ++ show (length missing') ++ "):\n" ++                                           showSep "\n" (map showTmImpls missing') ++                                          "\nAgainst: " ++                                           showSep "\n" (map (\t -> showTmImpls (delab ist t)) (map getLHS pdef))@@ -191,7 +203,7 @@                               -- unification may force a variable to take a                               -- particular form, rather than force a case                               -- to be impossible.-                              return (filter (noMatch ist clhs) missing')+                              return missing' -- (filter (noMatch ist clhs) missing')                       else return []            let pcover = null pmissing @@ -233,6 +245,7 @@            putIState (ist { idris_patdefs = addDef n (force pdef_pe, force pmissing)                                                 (idris_patdefs ist) })            let caseInfo = CaseInfo (inlinable opts) (inlinable opts) (dictionary opts)+            case lookupTyExact n ctxt of                Just ty ->                    do ctxt' <- do ctxt <- getContext@@ -243,10 +256,8 @@                                                    (AssertTotal `elem` opts)                                                    atys                                                    inacc-                                                   pats_pe+                                                   pats_forced                                                    pdef-                                                   pdef -- compile time-                                                   pdef_inl -- inlined                                                    pdef' ty                                                    ctxt                       setContext ctxt'@@ -282,6 +293,19 @@            -- all called functions, and fail if any of them are also            -- 'Partial NotCovering'            when (CoveringFn `elem` opts) $ checkAllCovering fc [] n n+           -- Add the 'AllGuarded' flag if it's guaranteed that every+           -- 'Inf' argument will be guarded by constructors in the result+           -- (allows productivity check to go under this function)+           checkIfGuarded n+           -- If this has %static arguments, cache the names of functions+           -- it calls for partial evaluation later+           ist <- getIState+           let statics = case lookupCtxtExact n (idris_statics ist) of+                              Just ns -> ns+                              Nothing -> []+           when (or statics) $ do getAllNames n+                                  return ()+   where     noMatch i cs tm = all (\x -> case trim_matchClause i (delab' i x True True) tm of                                       Right _ -> False@@ -323,9 +347,13 @@      -- Simplify the left hand side of a definition, to remove any lets     -- that may have arisen during elaboration-    simple_lhs ctxt (Right (x, y)) = Right (Idris.Core.Evaluate.simplify ctxt [] x, y)+    simple_lhs ctxt (Right (x, y)) +        = Right (Idris.Core.Evaluate.simplify ctxt [] x, y)     simple_lhs ctxt t = t +    force_lhs opts (Right (x, y)) = Right (forceWith opts x, y)+    force_lhs opts t = t+     simple_rt ctxt (p, x, y) = (p, x, force (uniqueBinders p                                                 (rt_simplify ctxt [] y))) @@ -348,6 +376,28 @@                                 Just t -> return t                                 Nothing -> ierror (At fc (Msg "No specialisation achieved")) +forceWith :: Ctxt OptInfo -> Term -> Term+forceWith opts lhs = -- trace (show lhs ++ "\n==>\n" ++ show (force lhs) ++ "\n----") $+                      force lhs+  where+    -- If there's forced arguments, erase them+    force ap@(App _ _ _)+       | (fn@(P _ c _), args) <- unApply ap,+         Just copt <- lookupCtxtExact c opts+            = let args' = eraseArg 0 (forceable copt) args in+                  mkApp fn (map force args')+    force (App t f a)+       = App t (force f) (force a)+    -- We might have pat bindings, so go under them+    force (Bind n b sc) = Bind n b (force sc)+    -- Everything else, leave it alone+    force t = t++    eraseArg i fs (n : ns) | i `elem` fs = Erased : eraseArg (i + 1) fs ns+                           | otherwise = n : eraseArg (i + 1) fs ns+    eraseArg i _ [] = []++ -- | Find 'static' applications in a term and partially evaluate them. -- Return any new transformation rules elabPE :: ElabInfo -> FC -> Name -> Term -> Idris [(Term, Term)]@@ -376,8 +426,8 @@     mkSpecialised specapp_in = do         ist <- getIState         ctxt <- getContext-        let (specTy, specapp) = getSpecTy ist specapp_in-        let (n, newnm, specdecl) = getSpecClause ist specapp+        (specTy, specapp) <- getSpecTy ist specapp_in+        let (n, newnm, specdecl) = getSpecClause ist specapp specTy         let lhs = pe_app specdecl         let rhs = pe_def specdecl         let undef = case lookupDefExact newnm ctxt of@@ -404,21 +454,22 @@                 let opts = [Specialise ((if pe_simple specdecl                                             then map (\x -> (x, Nothing)) cgns'                                             else []) ++-                                         (n, Just maxred) : specnames ++ +                                         (n, Just maxred) : specnames ++                                              concat descs)]                 logElab 3 $ "Specialising application: " ++ show specapp-                              ++ " in " ++ show caller ++-                              " with " ++ show opts+                              ++ "\n in \n" ++ show caller +++                              "\n with \n" ++ show opts+                              ++ "\nCalling: " ++ show cgns                 logElab 3 $ "New name: " ++ show newnm                 logElab 3 $ "PE definition type : " ++ (show specTy)                             ++ "\n" ++ show opts-                logElab 5 $ "PE definition " ++ show newnm ++ ":\n" +++                logElab 2 $ "PE definition " ++ show newnm ++ ":\n" ++                              showSep "\n"                                 (map (\ (lhs, rhs) ->                                   (showTmImpls lhs ++ " = " ++                                    showTmImpls rhs)) (pe_clauses specdecl)) -                logElab 2 $ show n ++ " transformation rule: " +++                logElab 5 $ show n ++ " transformation rule: " ++                            showTmImpls rhs ++ " ==> " ++ showTmImpls lhs                  elabType info defaultSyntax emptyDocstring [] fc opts newnm NoFC specTy@@ -434,16 +485,18 @@           -- if it doesn't work, just don't specialise. Could happen for lots           -- of valid reasons (e.g. local variables in scope which can't be           -- lifted out).-          (\e -> do logElab 3 $ "Couldn't specialise: " ++ (pshow ist e)+          (\e -> do logElab 5 $ "Couldn't specialise: " ++ (pshow ist e)                     return [])      hiddenToPH (PHidden _) = Placeholder     hiddenToPH x = x -    specName simpl (ImplicitS, tm)+    specName simpl (ImplicitS _, tm)         | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0))     specName simpl (ExplicitS, tm)         | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0))+    specName simpl (ConstraintS, tm) +        | (P Ref n _, _) <- unApply tm = Just (n, Just (if simpl then 1 else 0))     specName simpl _ = Nothing      -- get the descendants of the name 'n' which are marked %static@@ -454,7 +507,7 @@                           i <- getIState                           let statics = filter (staticFn i) ns                           return (map (\n -> (n, Nothing)) statics)-        +     staticFn :: IState -> Name -> Bool     staticFn i n =  case lookupCtxt n (idris_flags i) of                             [opts] -> elem StaticFn opts@@ -464,7 +517,7 @@                            Just s -> not (or s)                            _ -> True -    concreteArg ist (ImplicitS, tm) = concreteTm ist tm+    concreteArg ist (ImplicitS _, tm) = concreteTm ist tm     concreteArg ist (ExplicitS, tm) = concreteTm ist tm     concreteArg ist _ = True @@ -484,18 +537,18 @@               [ty] -> let (specty_in, args') = specType args (explicitNames ty)                           specty = normalise (tt_ctxt ist) [] (finalise specty_in)                           t = mkPE_TyDecl ist args' (explicitNames specty) in-                          (t, (n, args'))+                          return (t, (n, args')) --                             (normalise (tt_ctxt ist) [] (specType args ty))-              _ -> error "Can't happen (getSpecTy)"+              _ -> ifail $ "Ambiguous name " ++ show n ++ " (getSpecTy)"      -- get the clause of a specialised application-    getSpecClause ist (n, args)+    getSpecClause ist (n, args) specTy        = let newnm = sUN ("PE_" ++ show (nsroot n) ++ "_" ++                                qhash 5381 (showSep "_" (map showArg args))) in                                -- UN (show n ++ show (map snd args)) in-             (n, newnm, mkPE_TermDecl ist newnm n args)+             (n, newnm, mkPE_TermDecl ist newnm n specTy args)       where showArg (ExplicitS, n) = qshow n-            showArg (ImplicitS, n) = qshow n+            showArg (ImplicitS _, n) = qshow n             showArg _ = ""              qshow (Bind _ _ _) = "fn"@@ -511,14 +564,18 @@             qhash hash (x:xs) = qhash (hash * 33 + fromIntegral(fromEnum x)) xs  -- | Checks if the clause is a possible left hand side.-checkPossible :: ElabInfo -> FC -> Bool -> Name -> PTerm -> Idris Bool+-- NOTE: A lot of this is repeated for reflected definitions in Idris.Elab.Term+-- One day, these should be merged, but until then remember that if you edit+-- this you might need to edit the other version...+checkPossible :: ElabInfo -> FC -> Bool -> Name -> PTerm -> Idris (Maybe PTerm) checkPossible info fc tcgen fname lhs_in    = do ctxt <- getContext         i <- getIState         let lhs = addImplPat i lhs_in+        logElab 10 $ "Trying missing case: " ++ showTmImpls lhs         -- if the LHS type checks, it is possible         case elaborate (constraintNS info) ctxt (idris_datatypes i) (idris_name i) (sMN 0 "patLHS") infP initEState-                            (erun fc (buildTC i info ELHS [] fname+                            (erun fc (buildTC i info EImpossible [] fname                                                 (allNamesIn lhs_in)                                                 (infTerm lhs))) of             OK (ElabResult lhs' _ _ ctxt' newDecls highlights newGName, _) ->@@ -526,15 +583,63 @@                   processTacticDecls info newDecls                   sendHighlighting highlights                   updateIState $ \i -> i { idris_name = newGName }-                  let lhs_tm = orderPats (getInferTerm lhs')-                  case recheck (constraintNS info) ctxt' [] (forget lhs_tm) lhs_tm of-                       OK _ -> return True-                       err -> return False+                  let lhs_tm = normalise ctxt [] (orderPats (getInferTerm lhs'))+                  let emptyPat = hasEmptyPat ctxt (idris_datatypes i) lhs_tm+                  if emptyPat then +                     do logElab 10 $ "Empty type in pattern "+                        return Nothing+                    else+                      case recheck (constraintNS info) ctxt' [] (forget lhs_tm) lhs_tm of+                           OK (tm, _, _) -> +                                    do logElab 10 $ "Valid " ++ show tm ++ "\n"+                                                 ++ " from " ++ show lhs+                                       return (Just (delab' i tm True True))+                           err -> do logElab 10 $ "Conversion failure"+                                     return Nothing             -- if it's a recoverable error, the case may become possible-            Error err -> if tcgen then return (recoverableCoverage ctxt err)-                                  else return (validCoverageCase ctxt err ||+            Error err -> do logLvl 10 $ "Impossible case " ++ (pshow i err)+                            -- tcgen means that it was generated by genClauses,+                            -- so only looking for an error. Otherwise, it+                            -- needs to be the right kind of error (a type mismatch+                            -- in the same family).+                            if tcgen then returnTm i err (recoverableCoverage ctxt err)+                                  else returnTm i err (validCoverageCase ctxt err ||                                                  recoverableCoverage ctxt err)+  where returnTm i err True = do logLvl 10 $ "Possibly resolvable error on " ++ +                                    pshow i (fmap (normalise (tt_ctxt i) []) err)+                                              ++ " on " ++ showTmImpls lhs_in+                                 return $ Just lhs_in+        returnTm i err False = return $ Nothing +-- Filter out the terms which are not well type left hand sides. Whenever we+-- eliminate one, also eliminate later ones which match it without checking,+-- because they're obviously going to have the same result+checkPossibles :: ElabInfo -> FC -> Bool -> Name -> [PTerm] -> Idris [PTerm]+checkPossibles info fc tcgen fname (lhs : rest)+   = do ok <- checkPossible info fc tcgen fname lhs+        i <- getIState+        -- Hypothesis: any we can remove will be within the next few, because+        -- leftmost patterns tend to change less+        -- Since the match could take a while if there's a lot of cases to+        -- check, just remove from the next batch+        let rest' = filter (\x -> not (qmatch x lhs)) (take 200 rest) ++ drop 200 rest+        restpos <- checkPossibles info fc tcgen fname rest'+        case ok of +             Nothing -> return restpos +             Just lhstm -> return (lhstm : restpos)+  where+    qmatch _ Placeholder = True+    qmatch (PApp _ f args) (PApp _ f' args')+       | length args == length args'+            = qmatch f f' && and (zipWith qmatch (map getTm args)+                                                 (map getTm args'))+    qmatch (PRef _ _ n) (PRef _ _ n') = n == n'+    qmatch (PPair _ _ _ l r) (PPair _ _ _ l' r') = qmatch l l' && qmatch r r' +    qmatch (PDPair _ _ _ l t r) (PDPair _ _ _ l' t' r') +          = qmatch l l' && qmatch t t' && qmatch r r' +    qmatch x y = x == y+checkPossibles _ _ _ _ [] = return []+ findUnique :: Context -> Env -> Term -> [Name] findUnique ctxt env (Bind n b sc)    = let rawTy = forgetEnv (map fst env) (binderTy b)@@ -547,6 +652,34 @@                  else findUnique ctxt ((n, b) : env) sc findUnique _ _ _ = [] +getUnfolds (UnfoldIface n ns : _) = Just (n, ns)+getUnfolds (_ : xs) = getUnfolds xs+getUnfolds [] = Nothing++-- Unfold the given name, interface methdods, and any function which uses it as+-- an argument directly. This is specifically for finding applications of+-- interface dictionaries and inlining them both for totality checking and for+-- a small performance gain.+getNamesToUnfold :: Name -> [Name] -> Term -> [Name]+getNamesToUnfold iname ms tm = nub $ iname : getNames Nothing tm ++ ms+  where+    getNames under fn@(App _ _ _)+        | (f, args) <- unApply fn+             = let under' = case f of+                                 P _ fn _ -> Just fn+                                 _ -> Nothing +                              in+                   getNames under f ++ concatMap (getNames under') args+    getNames (Just under) (P _ ref _)+        = if ref == iname then [under] else []+    getNames under (Bind n (Let t v) sc) +        = getNames Nothing t +++          getNames Nothing v +++          getNames Nothing sc+    getNames under (Bind n b sc) = getNames Nothing (binderTy b) +++                                   getNames Nothing sc+    getNames _ _ = []+ -- | Return the elaborated LHS/RHS, and the original LHS with implicits added elabClause :: ElabInfo -> FnOpts -> (Int, PClause) ->               Idris (Either Term (Term, Term), PTerm)@@ -556,12 +689,12 @@         let lhs = addImpl [] i lhs_in         b <- checkPossible info fc tcgen fname lhs_in         case b of-            True -> tclift $ tfail (At fc-                                (Msg $ show lhs_in ++ " is a valid case"))-            False -> do ptm <- mkPatTm lhs_in-                        logElab 5 $ "Elaborated impossible case " ++ showTmImpls lhs ++-                                    "\n" ++ show ptm-                        return (Left ptm, lhs)+            Just _ -> tclift $ tfail (At fc+                                 (Msg $ show lhs_in ++ " is a valid case"))+            Nothing -> do ptm <- mkPatTm lhs_in+                          logElab 5 $ "Elaborated impossible case " ++ showTmImpls lhs +++                                      "\n" ++ show ptm+                          return (Left ptm, lhs) elabClause info opts (cnum, PClause fc fname lhs_in_as withs rhs_in_as whereblock)    = do let tcgen = Dictionary `elem` opts         push_estack fname False@@ -630,7 +763,7 @@                                then recheckC_borrowing False (PEGenerated `notElem` opts)                                                        [] (constraintNS info) fc id [] lhs_tm                                else return (lhs_tm, lhs_ty)-        let clhs = Idris.Core.Evaluate.simplify ctxt [] clhs_c+        let clhs = normalise ctxt [] clhs_c         let borrowed = borrowedNames [] clhs          -- These are the names we're not allowed to use on the RHS, because@@ -685,7 +818,7 @@         logElab 2 $ "RHS: " ++ show (map fst newargs_all) ++ " " ++ showTmImpls rhs         ctxt <- getContext -- new context with where block added         logElab 5 "STARTING CHECK"-        ((rhs', defer, holes, is, probs, ctxt', newDecls, highlights, newGName), _) <-+        ((rhsElab, defer, holes, is, probs, ctxt', newDecls, highlights, newGName), _) <-            tclift $ elaborate (constraintNS info) ctxt (idris_datatypes i) (idris_name i) (sMN 0 "patRHS") clhsty initEState                     (do pbinds ist lhs_tm                         -- proof search can use explicitly written names@@ -714,7 +847,19 @@         when inf $ addTyInfConstraints fc (map (\(x,y,_,_,_,_,_) -> (x,y)) probs)          logElab 5 "DONE CHECK"-        logElab 4 $ "---> " ++ show rhs'+        logElab 3 $ "---> " ++ show rhsElab+        ctxt <- getContext+        +        let rhs' = case getUnfolds opts of+                        Just (n, ms) -> +                           let ns = getNamesToUnfold n ms rhsElab in+                               unfold ctxt [] (map (\n -> (n, 1)) ns) rhsElab+                        _ -> rhsElab+        +        logElab 5 $ "----- " ++ show (getUnfolds opts) +++                    "\nUnfolded " ++ show rhsElab ++ "\n" +++                    "to " ++ show rhs'+         when (not (null defer)) $ logElab 1 $ "DEFERRED " ++                     show (map (\ (n, (_,_,t,_)) -> (n, t)) defer) @@ -767,14 +912,17 @@             Error e -> ierror (At fc (CantUnify False (clhsty, Nothing) (crhsty, Nothing) e [] 0))         i <- getIState         checkInferred fc (delab' i crhs True True) rhs-        -- if the function is declared '%error_reverse', or its type,+        -- if the function is declared '%error_reverse',         -- then we'll try running it in reverse to improve error messages+        -- Also if the type is '%error_reverse' and the LHS is smaller than+        -- the RHS         let (ret_fam, _) = unApply (getRetTy crhsty)         rev <- case ret_fam of                     P _ rfamn _ ->                         case lookupCtxt rfamn (idris_datatypes i) of                              [TI _ _ dopts _ _] ->-                                 return (DataErrRev `elem` dopts)+                                 return (DataErrRev `elem` dopts &&+                                         size clhs <= size crhs)                              _ -> return False                     _ -> return False @@ -872,13 +1020,15 @@         let ret_ty = getRetTy (explicitNames (normalise ctxt [] lhs_ty))         let static_names = getStaticNames i lhs_tm         logElab 5 (show lhs_tm ++ "\n" ++ show static_names)-        (clhs, clhsty) <- recheckC (constraintNS info) fc id [] lhs_tm+        (clhs_c, clhsty) <- recheckC (constraintNS info) fc id [] lhs_tm+        let clhs = normalise ctxt [] clhs_c+         logElab 5 ("Checked " ++ show clhs)         let bargs = getPBtys (explicitNames (normalise ctxt [] lhs_tm))         let wval = rhs_trans info $ addImplBound i (map fst bargs) wval_in         logElab 5 ("Checking " ++ showTmImpls wval)         -- Elaborate wval in this context-        ((wval', defer, is, ctxt', newDecls, highlights, newGName), _) <-+        ((wvalElab, defer, is, ctxt', newDecls, highlights, newGName), _) <-             tclift $ elaborate (constraintNS info) ctxt (idris_datatypes i) (idris_name i) (sMN 0 "withRHS")                         (bindTyArgs PVTy bargs infP) initEState                         (do pbinds i lhs_tm@@ -900,8 +1050,19 @@         let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, True))) def'         addDeferred def''         mapM_ (elabCaseBlock info opts) is++        let wval' = case getUnfolds opts of+                        Just (n, ms) -> +                           let ns = getNamesToUnfold n ms wvalElab in+                             unfold ctxt [] (map (\n -> (n, 1)) ns) wvalElab+                        _ -> wvalElab+                 logElab 5 ("Checked wval " ++ show wval')+        logElab 5 $ "----- " ++ show (getUnfolds opts) +++                    "\nUnfolded wval " ++ show wvalElab ++ "\n" +++                    "to " ++ show wval' +         ctxt <- getContext         (cwval, cwvalty) <- recheckC (constraintNS info) fc id [] (getInferTerm wval')         let cwvaltyN = explicitNames (normalise ctxt [] cwvalty)@@ -971,9 +1132,13 @@         wb <- mapM (mkAuxC mpn wname lhs (map fst bargs_pre) (map fst bargs_post))                        withblock         logElab 3 ("with block " ++ show wb)-        -- propagate totality assertion to the new definitions-        setFlags wname [Inlinable]-        when (AssertTotal `elem` opts) $ setFlags wname [Inlinable, AssertTotal]+        -- propagate totality assertion and unfold flags to the new definitions+        let uflags = case getUnfolds opts of+                          Just (n, ns) -> [UnfoldIface n ns]+                          _ -> []+        setFlags wname ([Inlinable] ++ uflags)+        when (AssertTotal `elem` opts) $ +           setFlags wname ([Inlinable, AssertTotal] ++ uflags)         i <- getIState         let rhstrans' = updateWithTerm i mpn wname lhs (map fst bargs_pre) (map fst (bargs_post))                              . rhs_trans info@@ -993,7 +1158,7 @@         logElab 5 ("New RHS " ++ showTmImpls rhs)         ctxt <- getContext -- New context with block added         i <- getIState-        ((rhs', defer, is, ctxt', newDecls, highlights, newGName), _) <-+        ((rhsElab, defer, is, ctxt', newDecls, highlights, newGName), _) <-            tclift $ elaborate (constraintNS info) ctxt (idris_datatypes i) (idris_name i) (sMN 0 "wpatRHS") clhsty initEState                     (do pbinds i lhs_tm                         setNextName@@ -1003,9 +1168,22 @@                         tt <- get_term                         return (tt, d, is, ctxt', newDecls, highlights, newGName))         setContext ctxt'+                 processTacticDecls info newDecls         sendHighlighting highlights         updateIState $ \i -> i { idris_name = newGName }+        +        ctxt <- getContext+        let rhs' = case getUnfolds opts of+                        Just (n, ms) -> +                           let ns = getNamesToUnfold n ms rhsElab in+                             unfold ctxt [] (map (\n -> (n, 1)) ns) rhsElab+                        _ -> rhsElab+        +        logElab 5 $ "----- " ++ show (getUnfolds opts) +++                    "\nUnfolded with RHS " ++ show rhsElab ++ "\n" +++                    "to " ++ show rhs'+          def' <- checkDef info fc iderr True defer         let def'' = map (\(n, (i, top, t, ns)) -> (n, (i, top, t, ns, False, True))) def'
src/Idris/Elab/Data.hs view
@@ -10,53 +10,49 @@  import Idris.AbsSyntax import Idris.ASTUtils-import Idris.DSL-import Idris.Error-import Idris.Delaborate-import Idris.Imports-import Idris.Elab.Term+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck import Idris.Coverage import Idris.DataOpts-import Idris.Providers-import Idris.Primitives-import Idris.Inliner-import Idris.PartialEval import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)-import IRTS.Lang-+import Idris.Delaborate+import Idris.Docstrings+import Idris.DSL+import Idris.Elab.Rewrite+import Idris.Elab.Term import Idris.Elab.Type import Idris.Elab.Utils-import Idris.Elab.Rewrite import Idris.Elab.Value--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree+import Idris.Error+import Idris.Imports+import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting)+import Idris.PartialEval+import Idris.Primitives+import Idris.Providers+import IRTS.Lang -import Idris.Docstrings+import Util.Pretty  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty+import Debug.Trace  warnLC :: FC -> Name -> Idris () warnLC fc n@@ -193,9 +189,13 @@           -- Check that the constructor type is, in fact, a part of the family being defined          tyIs n cty'+         let force = if tn == sUN "Delayed" +                        then [] -- TMP HACK! Totality checker needs this info+                        else forceArgs ctxt cty'           logElab 5 $ show fc ++ ":Constructor " ++ show n ++ " elaborated : " ++ show t          logElab 5 $ "Inaccessible args: " ++ show inacc+         logElab 5 $ "Forceable args: " ++ show force          logElab 2 $ "---> " ++ show n ++ " : " ++ show cty           -- Add to the context (this is temporary, so that later constructors@@ -210,6 +210,7 @@          addDocStr n doc' argDocs'          addIBC (IBCDoc n)          fputState (opt_inaccessible . ist_optimisation n) inacc+         fputState (opt_forceable . ist_optimisation n) force          addIBC (IBCOpt n)          return (n, cty)   where@@ -259,6 +260,47 @@         = tclift $ tfail (At fc (UniqueKindError AllTypes n))     checkUniqueKind _ _ = return () +forceArgs :: Context -> Type -> [Int]+forceArgs ctxt ty = forceFrom 0 ty+  where+    -- for each argument, substitute in MN pos "FF"+    -- then when we look at the return type, if we see MN pos name+    -- constructor guarded, then 'pos' is a forceable position+    forceFrom :: Int -> Type -> [Int]+    forceFrom i (Bind n (Pi _ _ _) sc)+       = forceFrom (i + 1) (substV (P Ref (sMN i "FF") Erased) sc)+    forceFrom i sc +        -- Go under the top level type application+        -- We risk affecting erasure of more complex indices, so we'll only+        -- mark something forced if *everything* which appears in an index+        -- is forceable+        -- (FIXME: Actually the real risk is if we erase something a programmer+        -- definitely wants, which is particularly the case with 'views'.+        -- So perhaps we need a way of marking that in the source?)+        | (P _ ty _, args) <- unApply sc+             = if null (concatMap (findNonForcePos True) args)+                  then nub (concatMap findForcePos args)+                  else []+    forceFrom i sc = []++    findForcePos (P _ (MN i ff) _)+        | ff == txt "FF" = [i]+    -- Only look under constructors in applications+    findForcePos ap@(App _ f a)+        | (P _ con _, args) <- unApply ap,+          isDConName con ctxt +            = nub $ concatMap findForcePos args+    findForcePos _ = []++    findNonForcePos fok (P _ (MN i ff) _)+        | ff == txt "FF" = if fok then [] else [i]+    -- Look under non-constructors in applications for things which can't+    -- be forced +    findNonForcePos fok ap@(App _ f a)+        | (P _ con _, args) <- unApply ap+            = nub $ concatMap (findNonForcePos (fok && isConName con ctxt)) args+    findNonForcePos _ _ = []+ addParamConstraints :: FC -> [Int] -> Type -> [(Name, Type)] -> Idris () addParamConstraints fc ps cty cons    = case getRetTy cty of@@ -289,7 +331,7 @@                                                     then ULE avar cvar                                                     else ULT avar cvar                                        addConstraints fc (tv, [con])-                                       addIBC (IBCConstraint fc con) +                                       addIBC (IBCConstraint fc con)                   _ -> return ()         constraintTy t = return () 
src/Idris/Elab/Implementation.hs view
@@ -10,52 +10,49 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings import Idris.DSL+import Idris.Elab.Data+import Idris.Elab.Term+import Idris.Elab.Type+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Type-import Idris.Elab.Data-import Idris.Elab.Utils-import Idris.Elab.Term--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)+import Debug.Trace -import Util.Pretty(pretty, text)  elabImplementation :: ElabInfo                    -> SyntaxInfo@@ -96,10 +93,12 @@          -- if the implementation type matches any of the implementations we have already,          -- and it's not a named implementation, then it's overlapping, so report an error          case expn of-            Nothing -> do mapM_ (maybe (return ()) overlapping . findOverlapping ist (interface_determiners ci) (delab ist nty))+            Nothing +               | OverlappingDictionary `notElem` opts ->+                       do mapM_ (maybe (return ()) overlapping . findOverlapping ist (interface_determiners ci) (delab ist nty))                                 (map fst $ interface_implementations ci)                           addImplementation intImpl True n iname-            Just _ -> addImplementation intImpl False n iname+            _ -> addImplementation intImpl False n iname     when (what /= ETypes && (not (null ds && not emptyinterface))) $ do          -- Add the parent implementation names to the privileged set          oldOpen <- addOpenImpl parents@@ -130,11 +129,17 @@                 = case lookupTyExact iname (tt_ctxt ist) of                               Just ty -> (map (\n -> (n, getTypeIn ist n ty)) headVars, ty)                               _ -> (zip headVars (repeat Placeholder), Erased)-         logElab 3 $ "Head var types " ++ show headVarTypes ++ " from " ++ show ty +         let impps = getImpParams ist (interface_impparams ci) +                          (snd (unApply (substRetTy ty)))+         let iimpps = zip (interface_impparams ci) impps++         logElab 5 $ "ImpPS: " ++ show impps ++ " --- " ++ show iimpps+         logElab 5 $ "Head var types " ++ show headVarTypes ++ " from " ++ show ty+          let all_meths = map (nsroot . fst) (interface_methods ci)          let mtys = map (\ (n, (inj, op, t)) ->-                   let t_in = substMatchesShadow ips pnames t+                   let t_in = substMatchesShadow (iimpps ++ ips) pnames t                        mnamemap =                           map (\n -> (n, PApp fc (PRef fc [] (decorate ns iname n))                                               (map (toImp fc) headVars)))@@ -143,11 +148,14 @@                        (decorate ns iname n,                            op, coninsert cs pextra t', t'))               (interface_methods ci)-         logElab 3 (show (mtys, ips))++         logElab 5 (show (mtys, (iimpps ++ ips)))          logElab 5 ("Before defaults: " ++ show ds ++ "\n" ++ show (map fst (interface_methods ci)))          let ds_defs = insertDefaults ist iname (interface_defaults ci) ns ds          logElab 3 ("After defaults: " ++ show ds_defs ++ "\n")-         let ds' = reorderDefs (map fst (interface_methods ci)) ds_defs++         let ds' = map (addUnfold iname (map fst (interface_methods ci))) $+                    reorderDefs (map fst (interface_methods ci)) ds_defs          logElab 1 ("Reordered: " ++ show ds' ++ "\n")           mapM_ (warnMissing ds' ns iname) (map fst (interface_methods ci))@@ -195,6 +203,7 @@           let wbVals' = map (addParams prop_params) wbVals +         logElab 5 ("Elaborating method bodies: " ++ show wbVals')          mapM_ (rec_elabDecl info EAll info) wbVals'           mapM_ (checkInjectiveDef fc (interface_methods ci)) (zip ds' wbVals')@@ -208,10 +217,18 @@          addIBC (IBCImplementation intImpl (isNothing expn) n iname)    where+    getImpParams ist = zipWith (\n tm -> delab ist tm)+     intImpl = case ps of                 [PConstant NoFC (AType (ATInt ITNative))] -> True                 _ -> False +    addUnfold iname ms (PTy doc docs syn fc opts n fc' tm)+       = PTy doc docs syn fc (UnfoldIface iname ms : opts) n fc' tm+    addUnfold iname ms (PClauses fc opts n cs)+       = PClauses fc (UnfoldIface iname ms : opts) n cs+    addUnfold iname ms dec = dec+     mkiname n' ns ps' expn' =         case expn' of           Nothing -> case ns of@@ -257,6 +274,8 @@      findOverlapping i dets t n      | SN (ParentN _ _) <- n = Nothing+     | Just opts <- lookupCtxtExact n (idris_flags i),+       OverlappingDictionary `elem` opts = Nothing      | otherwise         = case lookupTy n (tt_ctxt i) of             [t'] -> let tret = getRetType t@@ -475,7 +494,7 @@     clookup n [] = Nothing     clookup n ((n', d) : ds) | nsroot n == nsroot n' = Just d                              | otherwise = Nothing-checkInjectiveDef fc ns _ = return()+checkInjectiveDef fc ns _ = return ()  checkInjectiveArgs :: FC -> Name -> [Int] -> Maybe Type -> Idris () checkInjectiveArgs fc n ds Nothing = return ()
src/Idris/Elab/Interface.hs view
@@ -11,53 +11,50 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings import Idris.DSL+import Idris.Elab.Data+import Idris.Elab.Term+import Idris.Elab.Type+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Elab.Term-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Type-import Idris.Elab.Data-import Idris.Elab.Utils--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower)+import Data.Generics.Uniplate.Data (transform) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)-import Data.Generics.Uniplate.Data (transform)+import Debug.Trace -import Util.Pretty(pretty, text)  data MArgTy = IA Name | EA Name | CA deriving Show @@ -65,10 +62,10 @@               -> SyntaxInfo               -> Docstring (Either Err PTerm)               -> FC-              -> [(Name, PTerm)]+              -> [(Name, PTerm)] -- ^ Superclass constraints               -> Name               -> FC-              -> [(Name, FC, PTerm)]+              -> [(Name, FC, PTerm)] -- ^ Parameters               -> [(Name, Docstring (Either Err PTerm))]               -> [(Name, FC)]                 -- ^ determining params               -> [PDecl]                      -- ^ interface body@@ -77,7 +74,6 @@               -> Idris () elabInterface info syn_in doc fc constraints tn tnfc ps pDocs fds ds mcn cd     = do let cn = fromMaybe (SN (ImplementationCtorN tn)) (fst <$> mcn)-         let tty = pibind (map (\(n, _, ty) -> (n, ty)) ps) (PType fc)          let constraint = PApp fc (PRef fc [] tn)                                   (map (pexp . PRef fc []) (map (\(n, _, _) -> n) ps)) @@ -85,7 +81,21 @@               syn_in { using = addToUsing (using syn_in)                                  [(pn, pt) | (pn, _, pt) <- ps]                      }+         +         -- Calculate implicit parameters+         ist <- getIState+         let impps_ns = nub $ map (\n -> (n, emptyFC, Placeholder)) $+                            concatMap (implicitNamesIn [] ist) +                                      (map (\ (_,_,x) -> x) ps)+         let impps = filter (\ (n, _, _) -> +                               n `notElem` (map (\ (n, _, _) -> n) ps)) impps_ns +         let tty = impbind (map (\(n, _, ty) -> (n, ty)) impps) $ +                     pibind (map (\(n, _, ty) -> (n, ty)) ps) (PType fc)++         logElab 5 $ "Implicit parameters are " ++ show impps+         logElab 5 $ "Interface type is " ++ showTmImpls tty+          -- build data declaration          let mdecls = filter tydecl ds -- method declarations          let idecls = filter impldecl ds -- default super interface implementation declarations@@ -98,7 +108,7 @@          mapM_ (checkConstraintName (map (\(x, _, _) -> x) ps)) constraintNames           logElab 2 $ "Building methods " ++ show mnames-         ims <- mapM (tdecl mnames) mdecls+         ims <- mapM (tdecl impps mnames) mdecls          defs <- mapM (defdecl (map (\ (x,y,z) -> z) ims) constraint)                       (filter clause ds)          let (methods, imethods)@@ -106,20 +116,24 @@          let defaults = map (\ (x, (y, z)) -> (x,y)) defs           -- build implementation constructor type-         let cty = impbind [(pn, pt) | (pn, _, pt) <- ps] $ conbind constraints+         let cty = impbind [(pn, pt) | (pn, _, pt) <- impps ++ ps] $ conbind constraints                       $ pibind (map (\ (n, ty) -> (nsroot n, ty)) methods)                                constraint           let cons = [(cd, pDocs ++ mapMaybe memberDocs ds, cn, NoFC, cty, fc, [])]          let ddecl = PDatadecl tn NoFC tty cons -         logElab 5 $ "Interface data " ++ show (showDImp verbosePPOption ddecl)+         logElab 5 $ "Interface " ++ show (showDImp verbosePPOption ddecl)           -- Elaborate the data declaration          elabData info (syn { no_imp = no_imp syn ++ mnames,                               imp_methods = mnames }) doc pDocs fc [] ddecl          dets <- findDets cn (map fst fds)-         addInterface tn (CI cn (map nodoc imethods) defaults idecls (map (\(n, _, _) -> n) ps) [] dets)+         addInterface tn (CI cn (map nodoc imethods) defaults idecls +                              (map (\(n, _, _) -> n) impps)+                              (map (\(n, _, _) -> n) ps) +                              (map snd constraints)+                              [] dets)           -- for each constraint, build a top level function to chase it          cfns <- mapM (cfun cn constraint syn (map fst imethods)) constraints@@ -191,14 +205,14 @@     getMName (PTy _ _ _ _ _ n nfc _) = nsroot n     getMName (PData _ _ _ _ _ (PLaterdecl n nfc _)) = nsroot n -    tdecl allmeths (PTy doc _ syn _ o n nfc t)-           = do t' <- implicit' info syn (map (\(n, _, _) -> n) ps ++ allmeths) n t+    tdecl impps allmeths (PTy doc _ syn _ o n nfc t)+           = do t' <- implicit' info syn (map (\(n, _, _) -> n) (impps ++ ps) ++ allmeths) n t                 logElab 2 $ "Method " ++ show n ++ " : " ++ showTmImpls t'                 return ( (n, (toExp (map (\(pn, _, _) -> pn) ps) Exp t')),                          (n, (False, nfc, doc, o, (toExp (map (\(pn, _, _) -> pn) ps)                                               (\ l s p -> Imp l s p Nothing True) t'))),                          (n, (nfc, syn, o, t) ) )-    tdecl allmeths (PData doc _ syn _ _ (PLaterdecl n nfc t))+    tdecl impps allmeths (PData doc _ syn _ _ (PLaterdecl n nfc t))            = do let o = []                 t' <- implicit' info syn (map (\(n, _, _) -> n) ps ++ allmeths) n t                 logElab 2 $ "Data method " ++ show n ++ " : " ++ showTmImpls t'@@ -206,9 +220,9 @@                          (n, (True, nfc, doc, o, (toExp (map (\(pn, _, _) -> pn) ps)                                               (\ l s p -> Imp l s p Nothing True) t'))),                          (n, (nfc, syn, o, t) ) )-    tdecl allmeths (PData doc _ syn _ _ _)+    tdecl impps allmeths (PData doc _ syn _ _ _)          = ierror $ At fc (Msg "Data definitions not allowed in an interface declaration")-    tdecl _ _ = ierror $ At fc (Msg "Not allowed in an interface declaration")+    tdecl _ _ _ = ierror $ At fc (Msg "Not allowed in an interface declaration")      -- Create default definitions     defdecl mtys c d@(PClauses fc opts n cs) =
src/Idris/Elab/Provider.hs view
@@ -10,53 +10,49 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings import Idris.DSL+import Idris.Elab.Clause+import Idris.Elab.Term+import Idris.Elab.Type+import Idris.Elab.Utils+import Idris.Elab.Value import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Type-import Idris.Elab.Clause-import Idris.Elab.Value-import Idris.Elab.Utils-import Idris.Elab.Term--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)+import Debug.Trace  -- | Elaborate a type provider elabProvider :: Docstring (Either Err PTerm) -> ElabInfo -> SyntaxInfo -> FC -> FC -> ProvideWhat -> Name -> Idris ()
src/Idris/Elab/Quasiquote.hs view
@@ -7,9 +7,9 @@ -} module Idris.Elab.Quasiquote (extractUnquotes) where +import Idris.AbsSyntax import Idris.Core.Elaborate hiding (Tactic(..)) import Idris.Core.TT-import Idris.AbsSyntax   extract1 :: Int -> (PTerm -> a) -> PTerm -> Elab' aux (a, [(Name, PTerm)])
src/Idris/Elab/Record.hs view
@@ -5,39 +5,35 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, ViewPatterns #-}+{-# LANGUAGE PatternGuards #-} module Idris.Elab.Record(elabRecord) where  import Idris.AbsSyntax+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate import Idris.Docstrings+import Idris.Elab.Data+import Idris.Elab.Data+import Idris.Elab.Term+import Idris.Elab.Type+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Elab.Term-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting)+import Idris.Parser.Expr (tryFullExpr) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Parser.Expr (tryFullExpr)--import Idris.Elab.Type-import Idris.Elab.Data-import Idris.Elab.Utils--import Idris.Core.TT-import Idris.Core.Evaluate--import Idris.Elab.Data--import Data.Maybe-import Data.List import Control.Monad+import Data.List+import Data.Maybe  -- | Elaborate a record declaration elabRecord :: ElabInfo@@ -271,7 +267,7 @@      -- | Elaborate the projection functions.     elabProj :: Name -> [Name] -> [(Name, Name, Plicity, PTerm, Docstring (Either Err PTerm), Int)] -> Idris ()-    elabProj cn paramnames fs +    elabProj cn paramnames fs                    = let phArgs = map (uncurry placeholderArg) [(p, n) | (n, _, p, _, _, _) <- fs]                          elab = \(n, n', p, t, doc, i) ->                               -- Use projections in types@@ -283,7 +279,7 @@      -- | Elaborate the update functions.     elabUp :: Name -> [Name] -> [(Name, Name, Plicity, PTerm, Docstring (Either Err PTerm), Int)] -> Idris ()-    elabUp cn paramnames fs +    elabUp cn paramnames fs                  = let args = map (uncurry asPRefArg) [(p, n) | (n, _, p, _, _, _) <- fs]                        elab = \(n, n', p, t, doc, i) -> elabUpdate info n paramnames n' p t doc rsyn fc target cn args fieldNames i (optionalSetter n)                    in mapM_ elab fs
src/Idris/Elab/Rewrite.hs view
@@ -5,23 +5,22 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, ViewPatterns #-}+{-# LANGUAGE PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.Elab.Rewrite(elabRewrite, elabRewriteLemma) where  import Idris.AbsSyntax import Idris.AbsSyntaxTree-import Idris.Delaborate-import Idris.Error-import Idris.Core.TT import Idris.Core.Elaborate import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Delaborate import Idris.Docstrings+import Idris.Error  import Control.Monad import Control.Monad.State.Strict import Data.List- import Debug.Trace  elabRewrite :: (PTerm -> ElabD ()) -> IState ->
src/Idris/Elab/RunElab.hs view
@@ -7,19 +7,16 @@ -} module Idris.Elab.RunElab (elabRunElab) where -import Idris.Elab.Term-import Idris.Elab.Value (elabVal)- import Idris.AbsSyntax-import Idris.Error--import Idris.Core.Elaborate hiding (Tactic (..))+import Idris.Core.Elaborate hiding (Tactic(..)) import Idris.Core.Evaluate import Idris.Core.Execute import Idris.Core.TT import Idris.Core.Typecheck--import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Elab.Term+import Idris.Elab.Value (elabVal)+import Idris.Error+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting)  elabScriptTy :: Type elabScriptTy = App Complete (P Ref (sNS (sUN "Elab") ["Elab", "Reflection", "Language"]) Erased)
src/Idris/Elab/Term.hs view
@@ -11,26 +11,27 @@  import Idris.AbsSyntax import Idris.AbsSyntaxTree-import Idris.DSL-import Idris.Delaborate-import Idris.Error-import Idris.ProofSearch-import Idris.Output (pshow)- import Idris.Core.CaseTree (SC, SC'(STerm), findCalls, findUsedArgs) import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Core.Unify import Idris.Core.ProofTerm (getProofTerm)-import Idris.Core.Typecheck (check, recheck, converts, isType)-import Idris.Core.WHNF (whnf)-import Idris.Coverage (buildSCG, checkDeclTotality, checkPositive, genClauses, recoverableCoverage, validCoverageCase)-import Idris.ErrReverse (errReverse)+import Idris.Core.TT+import Idris.Core.Typecheck (check, converts, isType, recheck)+import Idris.Core.Unify+import Idris.Core.WHNF (whnf,whnfArgs)+import Idris.Coverage (genClauses, recoverableCoverage, validCoverageCase)+import Idris.Delaborate+import Idris.DSL import Idris.Elab.Quasiquote (extractUnquotes)-import Idris.Elab.Utils import Idris.Elab.Rewrite+import Idris.Elab.Utils+import Idris.Error+import Idris.ErrReverse (errReverse)+import Idris.Output (pshow)+import Idris.ProofSearch import Idris.Reflection+import Idris.Termination(buildSCG, checkDeclTotality, checkPositive)+ import qualified Util.Pretty as U  import Control.Applicative ((<$>))@@ -39,13 +40,12 @@ import Data.Foldable (for_) import Data.List import qualified Data.Map as M-import Data.Maybe (mapMaybe, fromMaybe, catMaybes, maybeToList)+import Data.Maybe (catMaybes, fromMaybe, mapMaybe, maybeToList) import qualified Data.Set as S import qualified Data.Text as T- import Debug.Trace -data ElabMode = ETyDecl | ETransLHS | ELHS | ERHS+data ElabMode = ETyDecl | ETransLHS | ELHS | EImpossible | ERHS   deriving Eq  @@ -143,7 +143,7 @@          if log /= ""             then trace log $ return (ElabResult tm ds (map snd is) ctxt impls highlights g_nextname)             else return (ElabResult tm ds (map snd is) ctxt impls highlights g_nextname)-  where pattern = emode == ELHS+  where pattern = emode == ELHS || emode == EImpossible         tydecl = emode == ETyDecl          mkPat = do hs <- get_holes@@ -189,7 +189,7 @@          if (log /= "")             then trace log $ return (ElabResult tm ds (map snd is) ctxt impls highlights g_nextname)             else return (ElabResult tm ds (map snd is) ctxt impls highlights g_nextname)-  where pattern = emode == ELHS+  where pattern = emode == ELHS || emode == EImpossible  -- | return whether arguments of the given constructor name can be -- matched on. If they're polymorphic, no, unless the type has beed@@ -245,7 +245,7 @@ elab ist info emode opts fn tm     = do let loglvl = opt_logLevel (idris_options ist)          when (loglvl > 5) $ unifyLog True-         compute -- expand type synonyms, etc+         whnf_compute_args -- expand type synonyms, etc          let fc = maybe "(unknown)"          elabE initElabCtxt (elabFC info) tm -- (in argument, guarded, in type, in qquote)          est <- getAux@@ -259,9 +259,11 @@                   mkPat                   update_term liftPats)   where-    pattern = emode == ELHS+    pattern = emode == ELHS || emode == EImpossible+    eimpossible = emode == EImpossible     intransform = emode == ETransLHS     bindfree = emode == ETyDecl || emode == ELHS || emode == ETransLHS+               || emode == EImpossible     autoimpls = opt_autoimpls (idris_options ist)      get_delayed_elab est =@@ -332,13 +334,13 @@                               pexp ct]))      forceErr orig env (CantUnify _ (t,_) (t',_) _ _ _)-       | (P _ (UN ht) _, _) <- unApply (normalise (tt_ctxt ist) env t),+       | (P _ (UN ht) _, _) <- unApply (whnf (tt_ctxt ist) env t),             ht == txt "Delayed" = notDelay orig     forceErr orig env (CantUnify _ (t,_) (t',_) _ _ _)-       | (P _ (UN ht) _, _) <- unApply (normalise (tt_ctxt ist) env t'),+       | (P _ (UN ht) _, _) <- unApply (whnf (tt_ctxt ist) env t'),             ht == txt "Delayed" = notDelay orig     forceErr orig env (InfiniteUnify _ t _)-       | (P _ (UN ht) _, _) <- unApply (normalise (tt_ctxt ist) env t),+       | (P _ (UN ht) _, _) <- unApply (whnf (tt_ctxt ist) env t),             ht == txt "Delayed" = notDelay orig     forceErr orig env (Elaborating _ _ _ t) = forceErr orig env t     forceErr orig env (ElaboratingArg _ _ _ t) = forceErr orig env t@@ -387,7 +389,7 @@                           highlightSource fc' (AnnConst c)     elab' ina fc (PQuote r)     = do fill r; solve     elab' ina _ (PTrue fc _)   =-       do hnf_compute+       do whnf_compute           g <- goal           case g of             TType _ -> elab' ina (Just fc) (PRef fc [] unitTy)@@ -421,7 +423,7 @@                     pexp l, pexp r]))      elab' ina _ (PPair fc hls _ l r)-        = do hnf_compute+        = do whnf_compute              g <- goal              let (tc, _) = unApply g              case g of@@ -444,7 +446,7 @@                 IsType -> asType                 IsTerm -> asValue                 TypeOrTerm ->-                   do hnf_compute+                   do whnf_compute                       g <- goal                       case g of                          TType _ -> asType@@ -498,11 +500,13 @@               showHd x = getNameFrom (sMN 0 "_") -- We probably should do something better than this here                doPrune as =-                  do compute+                  do compute -- to get 'Delayed' if it's there                      ty <- goal-                     let (tc, _) = unApply (unDelay ty)+                     ctxt <- get_context                      env <- get_env-                     return $ pruneByType env tc (unDelay ty) ist as+                     let ty' = unDelay ty+                     let (tc, _) = unApply ty'+                     return $ pruneByType eimpossible env tc ty' ist as                unDelay t | (P _ (UN l) _, [_, arg]) <- unApply t,                           l == txt "Delayed" = unDelay arg@@ -532,7 +536,7 @@                          (trySeq' deferr xs) True     elab' ina fc (PAlternative ms TryImplicit (orig : alts)) = do         env <- get_env-        compute+        whnf_compute         ty <- goal         let doelab = elab' ina fc orig         tryCatch doelab@@ -564,7 +568,7 @@         recoverableErr _ = True          pruneAlts (CantUnify _ (inc, _) (outc, _) _ _ _) alts env-            = case unApply (normalise (tt_ctxt ist) env inc) of+            = case unApply (whnf (tt_ctxt ist) env inc) of                    (P (TCon _ _) n _, _) -> filter (hasArg n env) alts                    (Constant _, _) -> alts                    _ -> filter isLend alts -- special case hack for 'Borrowed'@@ -656,7 +660,7 @@                do fty <- get_type (Var n) -- check for implicits                   ctxt <- get_context                   env <- get_env-                  let a' = insertScopedImps fc (normalise ctxt env fty) []+                  let a' = insertScopedImps fc (whnfArgs ctxt env fty) []                   if null a'                      then erun fc $                             do apply (Var n) []@@ -840,7 +844,7 @@             let dataCon = isDConName f ctxt             annot <- findHighlight f             mapM_ checkKnownImplicit args_in-            let args = insertScopedImps fc (normalise ctxt env fty) args_in+            let args = insertScopedImps fc (whnfArgs ctxt env fty) args_in             let unmatchableArgs = if pattern                                      then getUnmatchable (tt_ctxt ist) f                                      else []@@ -878,7 +882,7 @@                     ns <- apply (Var f) (map isph args) --                    trace ("ns is " ++ show ns) $ return ()                     -- mark any interface arguments as injective---                     when (not pattern) $ +--                     when (not pattern) $                     mapM_ checkIfInjective (map snd ns)                     unifyProblems -- try again with the new information,                                   -- to help with disambiguation@@ -902,7 +906,7 @@                                          return []                                       Just rguess -> do                                          gty <- get_type rguess-                                         let ty_n = normalise ctxt env gty+                                         let ty_n = whnf ctxt env gty                                          return $ getReqImps ty_n                               else return []                     -- Now we find out how many implicits we needed at the@@ -916,7 +920,7 @@                                  ivs' <- get_implementations                                  -- Attempt to resolve any interfaces which have 'complete' types,                                  -- i.e. no holes in them-                                 when (not pattern || (e_inarg ina && not tcgen)) $ +                                 when (not pattern || (e_inarg ina && not tcgen)) $                                     mapM_ (\n -> do focus n                                                     g <- goal                                                     env <- get_env@@ -959,7 +963,7 @@                 case lookup n env of                      Nothing -> return ()                      Just b ->-                       case unApply (normalise (tt_ctxt ist) env (binderTy b)) of+                       case unApply (whnf (tt_ctxt ist) env (binderTy b)) of                             (P _ c _, args) ->                                 case lookupCtxtExact c (idris_interfaces ist) of                                    Nothing -> return ()@@ -969,7 +973,7 @@                                            ulog <- getUnifyLog                                            probs <- get_probs                                            inj <- get_inj-                                           traceWhen ulog ("Injective now " ++ show args ++ "\nAll: " ++ show inj +                                           traceWhen ulog ("Injective now " ++ show args ++ "\nAll: " ++ show inj                                                             ++ "\nProblems: " ++ qshow probs) $                                              unifyProblems                                            probs <- get_probs@@ -1421,7 +1425,7 @@     insertLazy ina t@(PApp _ (PRef _ _ (UN l)) _) | l == txt "Delay" = return t     insertLazy ina t@(PApp _ (PRef _ _ (UN l)) _) | l == txt "Force" = return t     insertLazy ina (PCoerced t) = return t-    -- Don't add a delay to top level pattern variables, since they +    -- Don't add a delay to top level pattern variables, since they     -- can be forced on the rhs if needed     insertLazy ina t@(PPatvar _ _) | pattern && not (e_guarded ina) = return t     insertLazy ina t =@@ -1625,11 +1629,11 @@  -- Rule out alternatives that don't return the same type as the head of the goal -- (If there are none left as a result, do nothing)-pruneByType :: Env -> Term -> -- head of the goal+pruneByType :: Bool -> Env -> Term -> -- head of the goal                Type -> -- goal                IState -> [PTerm] -> [PTerm] -- if an alternative has a locally bound name at the head, take it-pruneByType env t goalty c as+pruneByType imp env t goalty c as    | Just a <- locallyBound as = [a]   where     locallyBound [] = Nothing@@ -1645,7 +1649,7 @@     getName _ = Nothing  -- 'n' is the name at the head of the goal type-pruneByType env (P _ n _) goalty ist as+pruneByType imp env (P _ n _) goalty ist as -- if the goal type is polymorphic, keep everything    | Nothing <- lookupTyExact n ctxt = as -- if the goal type is a ?metavariable, keep everything@@ -1677,12 +1681,13 @@                Just ty -> case unApply (getRetTy ty) of                             (P _ ctyn _, _) | isTConName ctyn ctxt && not (ctyn == f)                                      -> False-                            _ -> let ty' = normalise ctxt [] ty in---                                    trace ("Trying " ++ show (getRetTy ty') ++ " for " ++ show goalty) $+                            _ -> let ty' = whnf ctxt [] ty in+--                                    trace ("Trying " ++ show f' ++ " : " ++ show (getRetTy ty') ++ " for " ++ show goalty+--                                       ++ "\nMATCH: " ++ show (pat, matching (getRetTy ty') goalty)) $                                      case unApply (getRetTy ty') of                                           (V _, _) ->                                               isPlausible ist var env n ty-                                          _ -> matching (getRetTy ty') goalty+                                          _ -> matchingTypes imp (getRetTy ty') goalty                                                  || isCoercion (getRetTy ty') goalty -- May be useful to keep for debugging purposes for a bit: --                                                let res = matching (getRetTy ty') goalty in@@ -1690,9 +1695,12 @@ --                                                     ("Rejecting " ++ show (getRetTy ty', goalty)) res                _ -> False +    matchingTypes True = matchingHead+    matchingTypes False = matching+     -- If the goal is a constructor, it must match the suggested function type     matching (P _ ctyn _) (P _ n' _)-         | isTConName n' ctxt = ctyn == n'+         | isTConName n' ctxt && isTConName ctyn ctxt = ctyn == n'          | otherwise = True     -- Variables match anything     matching (V _) _ = True@@ -1703,14 +1711,28 @@     matching (Bind n _ sc) _ = True     matching _ (Bind n _ sc) = True     -- If we hit a function name, it's a plausible match-    matching (App _ (P _ f _) _) _ | not (isConName f ctxt) = True-    matching _ (App _ (P _ f _) _) | not (isConName f ctxt) = True-    -- Otherwise, match the rest of the structure-    matching (App _ f a) (App _ f' a') = matching f f' && matching a a'+    matching apl@(App _ _ _) apr@(App _ _ _)+         | (P _ fl _, argsl) <- unApply apl,+           (P _ fr _, argsr) <- unApply apr+       = fl == fr && and (zipWith matching argsl argsr)+           || (not (isConName fl ctxt && isConName fr ctxt))+    -- If the application structures aren't easily comparable, it's a+    -- plausible match+    matching (App _ f a) (App _ f' a') = True     matching (TType _) (TType _) = True     matching (UType _) (UType _) = True     matching l r = l == r +    -- In impossible-case mode, only look at the heads (this is to account for+    -- the non type-directed case with 'impossible' - we'd be ruling out+    -- too much and wouldn't find the mismatch we're looking for)+    matchingHead apl@(App _ _ _) apr@(App _ _ _)+         | (P _ fl _, argsl) <- unApply apl,+           (P _ fr _, argsr) <- unApply apr,+           isConName fl ctxt && isConName fr ctxt+       = fl == fr +    matchingHead _ _ = True+     -- Return whether there is a possible coercion between the return type     -- of an alternative and the goal type     isCoercion rty gty | (P _ r _, _) <- unApply rty@@ -1735,7 +1757,7 @@                        _ -> False  -pruneByType _ t _ _ as = as+pruneByType _ _ t _ _ as = as  -- Could the name feasibly be the return type? -- If there is an interface constraint on the return type, and no implementation@@ -1941,8 +1963,6 @@                              clauses'                              clauses'''                              clauses'''-                             clauses'''-                             clauses'''                              ty                              ctxt          set_context ctxt'@@ -2254,7 +2274,7 @@       = do ~[tm] <- tacTmArgs 1 tac args            tm' <- reifyTT tm            ctxt <- get_context-           fmap fst . checkClosed . reflect $ whnf ctxt tm'+           fmap fst . checkClosed . reflect $ whnf ctxt [] tm'       | n == tacN "Prim__Converts"       = do ~[env, tm1, tm2] <- tacTmArgs 3 tac args            env' <- reifyEnv env@@ -2634,7 +2654,7 @@                           (value, _) <- get_type_val (Var letn)                           ctxt <- get_context                           env <- get_env-                          let value' = hnf ctxt env value+                          let value' = normalise ctxt env value                           runTac autoSolve ist perhapsFC fn (Exact $ PQuote (reflect value'))     runT (Fill v) = do attack -- let x = fill x in ...                        tyn <- getNameFrom (sMN 0 "letty")@@ -2828,15 +2848,16 @@     RClausesInstrs n cs ->       do logElab 3 $ "Pattern-matching definition from tactics: " ++ show n          solveDeferred emptyFC n-         let lhss = map (\(_, lhs, _) -> lhs) cs+         let lhss = map (\(ns, lhs, _) -> (map fst ns, lhs)) cs          let fc = fileFC "elab_reflected"          pmissing <-            do ist <- getIState               possible <- genClauses fc n lhss-                                     (map (\lhs ->+                                     (map (\ (ns, lhs) ->                                         delab' ist lhs True True) lhss)               missing <- filterM (checkPossible n) possible-              return (filter (noMatch ist lhss) missing)+              let undef = filter (noMatch ist (map snd lhss)) missing+              return undef          let tot = if null pmissing                       then Unchecked -- still need to check recursive calls                       else Partial NotCovering -- missing cases implies not total@@ -2873,16 +2894,16 @@   where     -- TODO: see if the code duplication with Idris.Elab.Clause can be     -- reduced or eliminated.+    -- These are always cases generated by genClauses     checkPossible :: Name -> PTerm -> Idris Bool     checkPossible fname lhs_in =        do ctxt <- getContext           ist <- getIState           let lhs = addImplPat ist lhs_in           let fc = fileFC "elab_reflected_totality"-          let tcgen = False -- TODO: later we may support dictionary generation           case elaborate (constraintNS info) ctxt (idris_datatypes ist) (idris_name ist) (sMN 0 "refPatLHS") infP initEState-                (erun fc (buildTC ist info ELHS [] fname (allNamesIn lhs_in)-                                                         (infTerm lhs))) of+                (erun fc (buildTC ist info EImpossible [] fname (allNamesIn lhs_in)+                                                                (infTerm lhs))) of             OK (ElabResult lhs' _ _ _ _ _ name', _) ->               do -- not recursively calling here, because we don't                  -- want to run infinitely many times@@ -2892,9 +2913,7 @@                       OK _ -> return True                       err -> return False             -- if it's a recoverable error, the case may become possible-            Error err -> if tcgen then return (recoverableCoverage ctxt err)-                                  else return (validCoverageCase ctxt err ||-                                                 recoverableCoverage ctxt err)+            Error err -> return (recoverableCoverage ctxt err)       -- TODO: Attempt to reduce/eliminate code duplication with Idris.Elab.Clause
src/Idris/Elab/Transform.hs view
@@ -10,50 +10,46 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings import Idris.DSL+import Idris.Elab.Term+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Utils-import Idris.Elab.Term--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)+import Debug.Trace  elabTransform :: ElabInfo -> FC -> Bool -> PTerm -> PTerm -> Idris (Term, Term) elabTransform info fc safe lhs_in@(PApp _ (PRef _ _ tf) _) rhs_in
src/Idris/Elab/Type.hs view
@@ -13,53 +13,48 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings (Docstring) import Idris.DSL+import Idris.Elab.Term+import Idris.Elab.Utils+import Idris.Elab.Value import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Elab.Term-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Utils-import Idris.Elab.Value--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings (Docstring)+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace--import qualified Data.Traversable as Traversable-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)+import qualified Data.Traversable as Traversable+import Debug.Trace  buildType :: ElabInfo           -> SyntaxInfo@@ -215,7 +210,7 @@                                          return (n, d')) argDocs          addDocStr n doc' argDocs'          addIBC (IBCDoc n)-         addIBC (IBCFlags n opts')+         addIBC (IBCFlags n)          fputState (opt_inaccessible . ist_optimisation n) inacc          addIBC (IBCOpt n)          when (Implicit `elem` opts') $ do addCoercion n
src/Idris/Elab/Utils.hs view
@@ -9,35 +9,32 @@ module Idris.Elab.Utils where  import Idris.AbsSyntax-import Idris.Error+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Core.Typecheck import Idris.DeepSeq import Idris.Delaborate import Idris.Docstrings+import Idris.Error import Idris.Output -import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Typecheck- import Util.Pretty  import Control.Applicative hiding (Const)-import Control.Monad.State import Control.Monad+import Control.Monad.State import Data.List+import qualified Data.Map as Map import Data.Maybe import qualified Data.Traversable as Traversable- import Debug.Trace -import qualified Data.Map as Map- recheckC = recheckC_borrowing False True []  recheckC_borrowing uniq_check addConstrs bs tcns fc mkerr env t     = do -- t' <- applyOpts (forget t) (doesn't work, or speed things up...)-         +          ctxt <- getContext          t' <- case safeForget t of                     Just ft -> return ft@@ -47,7 +44,7 @@                                    OK x -> return x          logElab 6 $ "CONSTRAINTS ADDED: " ++ show (tm, ty, cs)          tit <- typeInType-         when (not tit && addConstrs) $ +         when (not tit && addConstrs) $                            do addConstraints fc cs                               mapM_ (\c -> addIBC (IBCConstraint fc c)) (snd cs)          mapM_ (checkDeprecated fc) (allTTNames tm)@@ -441,7 +438,7 @@     let opt = idris_optimisation ist     case lookupCtxt n opt of         [oi] -> putIState ist { idris_optimisation = addDef n oi { detaggable = True } opt }-        _    -> putIState ist { idris_optimisation = addDef n (Optimise [] True) opt }+        _    -> putIState ist { idris_optimisation = addDef n (Optimise [] True []) opt }  displayWarnings :: EState -> Idris () displayWarnings est@@ -545,4 +542,32 @@                              return (App s f' a')     getPats t = return t +isEmpty :: Context -> Ctxt TypeInfo -> Type -> Bool+isEmpty ctxt tyctxt ty+    | (P _ tyname _, args) <- unApply (getRetTy ty),+      Just tyinfo <- lookupCtxtExact tyname tyctxt+      -- Compare all the constructor types against the type we need+      -- If they *all* have an argument position where some constructor+      -- clases with the needed type, then the type we're looking for must+      -- be empty+         = let neededty = getRetTy ty+               contys = mapMaybe getConType (con_names tyinfo) in+                 all (findClash neededty) contys+  where+    getConType n = do t <- lookupTyExact n ctxt+                      return (getRetTy (normalise ctxt [] t)) +    findClash l r+       | (P _ n _, _) <- unApply l,+         (P _ n' _, _) <- unApply r,+         isConName n ctxt && isConName n' ctxt, n /= n' +           = True+    findClash (App _ f a) (App _ f' a') = findClash f f' || findClash a a'+    findClash l r = False++isEmpty ctxt tyinfo ty = False++hasEmptyPat :: Context -> Ctxt TypeInfo -> Term -> Bool+hasEmptyPat ctxt tyctxt (Bind n (PVar ty) sc)+    = isEmpty ctxt tyctxt ty || hasEmptyPat ctxt tyctxt sc+hasEmptyPat ctxt tyctxt _ = False
src/Idris/Elab/Value.hs view
@@ -14,51 +14,47 @@  import Idris.AbsSyntax import Idris.ASTUtils+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate hiding (Unchecked)+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck+import Idris.Coverage+import Idris.DataOpts+import Idris.DeepSeq+import Idris.Delaborate+import Idris.Docstrings import Idris.DSL+import Idris.Elab.Term+import Idris.Elab.Utils import Idris.Error-import Idris.Delaborate import Idris.Imports-import Idris.Coverage-import Idris.DataOpts-import Idris.Providers-import Idris.Primitives import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting) import Idris.PartialEval-import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)+import Idris.Primitives+import Idris.Providers import IRTS.Lang -import Idris.Elab.Utils-import Idris.Elab.Term--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate hiding (Unchecked)-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree--import Idris.Docstrings+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import qualified Data.Traversable as Traversable-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)+import qualified Data.Traversable as Traversable+import Debug.Trace  -- | Elaborate a value, returning any new bindings created (this will only -- happen if elaborating as a pattern clause)
src/Idris/ElabDecls.hs view
@@ -6,69 +6,65 @@ Maintainer  : The Idris Community. -} -{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,+{-# LANGUAGE DeriveFunctor, FlexibleInstances, MultiParamTypeClasses,              PatternGuards #-}  module Idris.ElabDecls where  import Idris.AbsSyntax import Idris.ASTUtils-import Idris.DSL-import Idris.Error-import Idris.Delaborate-import Idris.Directives-import Idris.Imports-import Idris.Elab.Term+import Idris.Core.CaseTree+import Idris.Core.Elaborate hiding (Tactic(..))+import Idris.Core.Evaluate+import Idris.Core.Execute+import Idris.Core.TT+import Idris.Core.Typecheck import Idris.Coverage import Idris.DataOpts-import Idris.Providers-import Idris.Primitives-import Idris.Inliner-import Idris.PartialEval import Idris.DeepSeq-import Idris.Output (iputStrLn, pshow, iWarn, sendHighlighting)-import IRTS.Lang--import Idris.Elab.Utils-import Idris.Elab.Type+import Idris.Delaborate+import Idris.Directives+import Idris.Docstrings hiding (Unchecked)+import Idris.DSL import Idris.Elab.Clause import Idris.Elab.Data-import Idris.Elab.Record-import Idris.Elab.Interface import Idris.Elab.Implementation+import Idris.Elab.Interface import Idris.Elab.Provider+import Idris.Elab.Record import Idris.Elab.RunElab+import Idris.Elab.Term import Idris.Elab.Transform+import Idris.Elab.Type+import Idris.Elab.Utils import Idris.Elab.Value--import Idris.Core.TT-import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.Evaluate-import Idris.Core.Execute-import Idris.Core.Typecheck-import Idris.Core.CaseTree+import Idris.Error+import Idris.Imports+import Idris.Inliner+import Idris.Output (iWarn, iputStrLn, pshow, sendHighlighting)+import Idris.PartialEval+import Idris.Primitives+import Idris.Providers+import Idris.Termination+import IRTS.Lang -import Idris.Docstrings hiding (Unchecked)+import Util.Pretty (pretty, text)  import Prelude hiding (id, (.))-import Control.Category  import Control.Applicative hiding (Const)+import Control.Category import Control.DeepSeq import Control.Monad import Control.Monad.State.Strict as State+import Data.Char (isLetter, toLower) import Data.List-import Data.Maybe-import Debug.Trace-+import Data.List.Split (splitOn) import qualified Data.Map as Map+import Data.Maybe import qualified Data.Set as S import qualified Data.Text as T-import Data.Char(isLetter, toLower)-import Data.List.Split (splitOn)--import Util.Pretty(pretty, text)-+import Debug.Trace  -- | Top level elaborator info, supporting recursive elaboration recinfo :: FC -> ElabInfo@@ -87,7 +83,7 @@ elabPrims = do i <- getIState                let cs_in = idris_constraints i                let mkdec opt decl docs argdocs =-                       PData docs argdocs defaultSyntax (fileFC "builtin") +                       PData docs argdocs defaultSyntax (fileFC "builtin")                              opt decl                elabDecl' EAll (recinfo primfc) (mkdec inferOpts inferDecl emptyDocstring [])                -- We don't want the constraints generated by 'Infer' since
src/Idris/Erasure.hs view
@@ -12,32 +12,31 @@ import Idris.AbsSyntax import Idris.ASTUtils import Idris.Core.CaseTree-import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Primitives+import Idris.Core.TT import Idris.Error--import Debug.Trace-import System.IO.Unsafe+import Idris.Primitives -import Control.Category import Prelude hiding (id, (.)) -import Control.Arrow import Control.Applicative+import Control.Arrow+import Control.Category import Control.Monad.State-import Data.Maybe-import Data.List-import qualified Data.Set as S-import qualified Data.IntSet as IS-import qualified Data.Map as M+import Data.IntMap (IntMap) import qualified Data.IntMap as IM-import Data.Set (Set) import Data.IntSet (IntSet)+import qualified Data.IntSet as IS+import Data.List import Data.Map (Map)-import Data.IntMap (IntMap)+import qualified Data.Map as M+import Data.Maybe+import Data.Set (Set)+import qualified Data.Set as S import Data.Text (pack) import qualified Data.Text as T+import Debug.Trace+import System.IO.Unsafe  -- | UseMap maps names to the set of used (reachable) argument -- positions.@@ -135,7 +134,7 @@      checkAccessibility :: Ctxt OptInfo -> (Name, IntMap (Set Reason)) -> Idris ()     checkAccessibility opt (n, reachable)-        | Just (Optimise inaccessible dt) <- lookupCtxtExact n opt+        | Just (Optimise inaccessible dt force) <- lookupCtxtExact n opt         , eargs@(_:_) <- [fmt n (S.toList rs) | (i,n) <- inaccessible, rs <- maybeToList $ IM.lookup i reachable]         = warn $ show n ++ ": inaccessible arguments reachable:\n  " ++ intercalate "\n  " eargs @@ -498,9 +497,18 @@         Nothing -> error $ "Erasure/getArity: definition not found for " ++ show n      -- convert applications of lambdas to lets-    -- Note that this transformation preserves de bruijn numbering+    -- note that this transformation preserves de bruijn numbering     lamToLet :: Term -> Term-    lamToLet (App _ (Bind n (Lam ty) tm) val) = Bind n (Let ty val) tm+    lamToLet tm = lamToLet' args f+      where+        (f, args) = unApply tm++    lamToLet' :: [Term] -> Term -> Term+    lamToLet' (v:vs) (Bind n (Lam ty) tm) = Bind n (Let ty v) $ lamToLet' vs tm+    lamToLet'    []  tm = tm+    lamToLet'    vs  tm = error $+        "Erasure.hs:lamToLet': unexpected input: "+            ++ "vs = " ++ show vs ++ ", tm = " ++ show tm      -- split "\x_i -> T(x_i)" into [x_i] and T     unfoldLams :: Term -> ([Name], Term)
src/Idris/Error.hs view
@@ -10,28 +10,28 @@  module Idris.Error where -import Prelude hiding (catch) import Idris.AbsSyntax-import Idris.Delaborate-+import Idris.Core.Constraints import Idris.Core.Evaluate (ctxtAlist) import Idris.Core.TT import Idris.Core.Typecheck-import Idris.Core.Constraints+import Idris.Delaborate import Idris.Output -import System.Console.Haskeline-import System.Console.Haskeline.MonadException+import Prelude hiding (catch)+ import Control.Monad (when) import Control.Monad.State.Strict-import System.IO.Error(isUserError, ioeGetErrorString) import Data.Char+import qualified Data.Foldable as Foldable import Data.List (intercalate, isPrefixOf)-import qualified Data.Text as T import qualified Data.Set as S-import Data.Typeable+import qualified Data.Text as T import qualified Data.Traversable as Traversable-import qualified Data.Foldable as Foldable+import Data.Typeable+import System.Console.Haskeline+import System.Console.Haskeline.MonadException+import System.IO.Error (ioeGetErrorString, isUserError)  iucheck :: Idris () iucheck = do tit <- typeInType
src/Idris/IBC.hs view
@@ -12,44 +12,42 @@                   writeIBC, writePkgIndex,                   hasValidIBCVersion, IBCPhase(..)) where -import Idris.Core.Evaluate-import Idris.Core.TT+import Idris.AbsSyntax import Idris.Core.Binary import Idris.Core.CaseTree-import Idris.AbsSyntax-import Idris.Imports-import Idris.Error+import Idris.Core.Evaluate+import Idris.Core.TT import Idris.DeepSeq import Idris.Delaborate-import qualified Idris.Docstrings as D import Idris.Docstrings (Docstring)+import qualified Idris.Docstrings as D+import Idris.Error+import Idris.Imports import Idris.Output import IRTS.System (getIdrisLibDir)+ import Paths_idris  import qualified Cheapskate.Types as CT-+import Codec.Archive.Zip+import Control.DeepSeq+import Control.Monad+import Control.Monad.State.Strict hiding (get, put)+import qualified Control.Monad.State.Strict as ST import Data.Binary+import Data.ByteString.Lazy as B hiding (elem, length, map) import Data.Functor-import Data.Vector.Binary import Data.List as L import Data.Maybe (catMaybes)-import Data.ByteString.Lazy as B hiding (length, elem, map)-import qualified Data.Text as T import qualified Data.Set as S--import Control.Monad-import Control.DeepSeq-import Control.Monad.State.Strict hiding (get, put)-import qualified Control.Monad.State.Strict as ST-import System.FilePath-import System.Directory-import Codec.Archive.Zip-+import qualified Data.Text as T+import Data.Vector.Binary import Debug.Trace+import System.Directory+import System.FilePath  ibcVersion :: Word16-ibcVersion = 149+ibcVersion = 155  -- | When IBC is being loaded - we'll load different things (and omit -- different structures/definitions) depending on which phase we're in.@@ -315,7 +313,10 @@                         _ -> ifail "IBC write failed" ibc i (IBCCoercion n) f = return f { ibc_coercions = n : ibc_coercions f } ibc i (IBCAccess n a) f = return f { ibc_access = (n,a) : ibc_access f }-ibc i (IBCFlags n a) f = return f { ibc_flags = (n,a) : ibc_flags f }+ibc i (IBCFlags n) f +    = case lookupCtxtExact n (idris_flags i) of+           Just a -> return f { ibc_flags = (n,a): ibc_flags f }+           _ -> ifail "IBC write failed" ibc i (IBCFnInfo n a) f = return f { ibc_fninfo = (n,a) : ibc_fninfo f } ibc i (IBCTotal n a) f = return f { ibc_total = (n,a) : ibc_total f } ibc i (IBCInjective n a) f = return f { ibc_injective = (n,a) : ibc_injective f }@@ -553,7 +554,7 @@         -- Don't lose implementations from previous IBCs, which         -- could have loaded in any order         let is = case lookupCtxtExact n (idris_interfaces i) of-                    Just (CI _ _ _ _ _ ins _) -> ins+                    Just ci -> interface_implementations ci                     _ -> []         let c' = c { interface_implementations = interface_implementations c ++ is }         putIState (i { idris_interfaces = addDef n c' (idris_interfaces i) })) cs@@ -659,10 +660,10 @@             r' <- update r             return $ Right (l', r') -        updateCD (CaseDefs (ts, t) (cs, c) (is, i) (rs, r)) = do+        updateCD (CaseDefs (cs, c) (rs, r)) = do             c' <- updateSC c             r' <- updateSC r-            return $ CaseDefs (cs, c') (cs, c') (cs, c') (rs, r')+            return $ CaseDefs (cs, c') (rs, r')          updateSC (Case t n alts) = do             alts' <- mapM updateAlt alts@@ -942,14 +943,16 @@                    _ -> error "Corrupted binary data for SizeChange"  instance Binary CGInfo where-        put (CGInfo x1 x2 x3)+        put (CGInfo x1 x2 x3 x4)           = do put x1 --                put x3 -- Already used SCG info for totality check-               put x3+               put x2+               put x4         get           = do x1 <- get+               x2 <- get                x3 <- get-               return (CGInfo x1 [] x3)+               return (CGInfo x1 x2 [] x3)  instance Binary CaseType where         put x = case x of@@ -1038,14 +1041,13 @@                    _ -> error "Corrupted binary data for CaseAlt"  instance Binary CaseDefs where-        put (CaseDefs x1 x2 x3 x4)-          = do -- don't need totality checked or inlined versions+        put (CaseDefs x1 x2)+          = do put x1                put x2-               put x4         get-          = do x2 <- get-               x4 <- get-               return (CaseDefs x2 x2 x2 x4)+          = do x1 <- get+               x2 <- get+               return (CaseDefs x1 x2)  instance Binary CaseInfo where         put x@(CaseInfo x1 x2 x3) = do put x1@@ -1210,7 +1212,7 @@                 AssertTotal -> putWord8 3                 Specialise x -> do putWord8 4                                    put x-                Coinductive -> putWord8 5+                AllGuarded -> putWord8 5                 PartialFn -> putWord8 6                 Implicit -> putWord8 7                 Reflection -> putWord8 8@@ -1224,6 +1226,10 @@                 AutoHint -> putWord8 15                 PEGenerated -> putWord8 16                 StaticFn -> putWord8 17+                OverlappingDictionary -> putWord8 18+                UnfoldIface x ns -> do putWord8 19+                                       put x+                                       put ns         get           = do i <- getWord8                case i of@@ -1233,7 +1239,7 @@                    3 -> return AssertTotal                    4 -> do x <- get                            return (Specialise x)-                   5 -> return Coinductive+                   5 -> return AllGuarded                    6 -> return PartialFn                    7 -> return Implicit                    8 -> return Reflection@@ -1247,6 +1253,10 @@                    15 -> return AutoHint                    16 -> return PEGenerated                    17 -> return StaticFn+                   18 -> return OverlappingDictionary+                   19 -> do x <- get+                            ns <- get+                            return (UnfoldIface x ns)                    _ -> error "Corrupted binary data for FnOpt"  instance Binary Fixity where@@ -2354,13 +2364,15 @@   instance Binary InterfaceInfo where-        put (CI x1 x2 x3 x4 x5 _ x6)+        put (CI x1 x2 x3 x4 x5 x6 x7 _ x8)           = do put x1                put x2                put x3                put x4                put x5                put x6+               put x7+               put x8         get           = do x1 <- get                x2 <- get@@ -2368,7 +2380,9 @@                x4 <- get                x5 <- get                x6 <- get-               return (CI x1 x2 x3 x4 x5 [] x6)+               x7 <- get+               x8 <- get+               return (CI x1 x2 x3 x4 x5 x6 x7 [] x8)  instance Binary RecordInfo where         put (RI x1 x2 x3)@@ -2382,13 +2396,15 @@                return (RI x1 x2 x3)  instance Binary OptInfo where-        put (Optimise x1 x2)+        put (Optimise x1 x2 x3)           = do put x1                put x2+               put x3         get           = do x1 <- get                x2 <- get-               return (Optimise x1 x2)+               x3 <- get+               return (Optimise x1 x2 x3)  instance Binary FnInfo where         put (FnInfo x1)
src/Idris/IdeMode.hs view
@@ -11,23 +11,22 @@  module Idris.IdeMode(parseMessage, convSExp, WhatDocs(..), IdeModeCommand(..), sexpToCommand, toSExp, SExp(..), SExpable, Opt(..), ideModeEpoch, getLen, getNChar, sExpToString) where -import Text.Printf-import Numeric-import Data.List-import Data.Maybe (isJust)+import Idris.Core.Binary+import Idris.Core.TT++import Control.Applicative hiding (Const) import qualified Data.Binary as Binary import qualified Data.ByteString.Base64 as Base64 import qualified Data.ByteString.Lazy as Lazy import qualified Data.ByteString.UTF8 as UTF8+import Data.List+import Data.Maybe (isJust) import qualified Data.Text as T+import Numeric+import System.IO+import Text.Printf import Text.Trifecta hiding (Err) import Text.Trifecta.Delta-import System.IO--import Idris.Core.TT-import Idris.Core.Binary--import Control.Applicative hiding (Const)  getNChar :: Handle -> Int -> String -> IO (String) getNChar _ 0 s = return (reverse s)
src/Idris/IdrisDoc.hs view
@@ -5,57 +5,50 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards #-}-{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE OverloadedStrings, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} module Idris.IdrisDoc (generateDocs) where -import Idris.Core.TT (Name (..), sUN, SpecialName (..), OutputAnnotation (..),-                      TextFormatting (..), txt, str, nsroot, constIsType, toAlist)-import Idris.Core.Evaluate (ctxtAlist, Def (..), lookupDefAcc,-                            Accessibility (..), isDConName, isFnName,-                            isTConName)-import Idris.Parser.Helpers (opChars) import Idris.AbsSyntax+import Idris.Core.Evaluate (Accessibility(..), Def(..), ctxtAlist, isDConName,+                            isFnName, isTConName, lookupDefAcc)+import Idris.Core.TT (Name(..), OutputAnnotation(..), SpecialName(..),+                      TextFormatting(..), constIsType, nsroot, sUN, str,+                      toAlist, txt) import Idris.Docs import Idris.Docstrings (nullDocstring) import qualified Idris.Docstrings as Docstrings-+import Idris.Parser.Helpers (opChars) import IRTS.System (getDataFileName)  import Control.Applicative ((<|>)) import Control.Monad (forM_) import Control.Monad.Trans.Except import Control.Monad.Trans.State.Strict--import Data.Maybe- import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BS2-import qualified Data.Text.Encoding as E import qualified Data.List as L import qualified Data.List.Split as LS import qualified Data.Map as M hiding ((!))+import Data.Maybe import Data.Monoid (mempty) import qualified Data.Ord (compare) import qualified Data.Set as S import qualified Data.Text as T-+import qualified Data.Text.Encoding as E+import System.Directory+import System.FilePath import System.IO import System.IO.Error-import System.FilePath-import System.Directory--import Text.PrettyPrint.Annotated.Leijen (displayDecorated, renderCompact)--import Text.Blaze (toValue, contents)-import Text.Blaze.Internal (MarkupM (Empty))-import Text.Blaze.Html5 ((!), toHtml, preEscapedToHtml)+import Text.Blaze (contents, toValue)+import qualified Text.Blaze.Html.Renderer.String as R+import Text.Blaze.Html.Renderer.Utf8 (renderHtml)+import Text.Blaze.Html5 (preEscapedToHtml, toHtml, (!)) import qualified Text.Blaze.Html5 as H import Text.Blaze.Html5.Attributes as A-import Text.Blaze.Html.Renderer.Utf8 (renderHtml)-import qualified Text.Blaze.Html.Renderer.String as R+import Text.Blaze.Internal (MarkupM(Empty)) import Text.Blaze.Renderer.String (renderMarkup)+import Text.PrettyPrint.Annotated.Leijen (displayDecorated, renderCompact)  -- ---------------------------------------------------------------- [ Public ] @@ -174,7 +167,7 @@   in  filter ((flip S.notMember children) . (\(n, _, _) -> n)) list    where names (Just (DataDoc _ fds))                  = map (\(FD n _ _ _ _) -> n) fds-        names (Just (InterfaceDoc _ _ fds _ _ _ _ c)) = map (\(FD n _ _ _ _) -> n) fds ++ map (\(FD n _ _ _ _) -> n) (maybeToList c)+        names (Just (InterfaceDoc _ _ fds _ _ _ _ _ c)) = map (\(FD n _ _ _ _) -> n) fds ++ map (\(FD n _ _ _ _) -> n) (maybeToList c)         names _                                       = []  -- | Whether a Name names something which should be documented@@ -222,14 +215,14 @@       names  = concatMap (extractPTermNames) ts   in  S.map getNs $ S.fromList names -  where getFunDocs (FunDoc f)                      = [f]-        getFunDocs (DataDoc f fs)                  = f:fs-        getFunDocs (InterfaceDoc _ _ fs _ _ _ _ _) = fs-        getFunDocs (RecordDoc _ _ f fs _)          = f:fs-        getFunDocs (NamedImplementationDoc _ fd)         = [fd]-        getFunDocs (ModDoc _ _)                    = []-        types (FD _ _ args t _)                    = t:(map second args)-        second (_, x, _, _)                        = x+  where getFunDocs (FunDoc f)                        = [f]+        getFunDocs (DataDoc f fs)                    = f:fs+        getFunDocs (InterfaceDoc _ _ fs _ _ _ _ _ _) = fs+        getFunDocs (RecordDoc _ _ f fs _)            = f:fs+        getFunDocs (NamedImplementationDoc _ fd)     = [fd]+        getFunDocs (ModDoc _ _)                      = []+        types (FD _ _ args t _)                      = t:(map second args)+        second (_, x, _, _)                          = x   -- | Returns an NsDict of containing all known namespaces and their contents@@ -583,7 +576,7 @@                -> H.Html -- ^ Resulting HTML createOtherDoc ist (FunDoc fd)                = createFunDoc ist fd -createOtherDoc ist (InterfaceDoc n docstring fds _ _ _ _ c) = do+createOtherDoc ist (InterfaceDoc n docstring fds _ _ _ _ _ c) = do   H.dt ! (A.id $ toValue $ show n) $ do     H.span ! class_ "word" $ do "interface"; nbsp     H.span ! class_ "name type"
src/Idris/Imports.hs view
@@ -10,19 +10,16 @@   , ibcPathNoFallback, installedPackages, pkgIndex   ) where -import Control.Applicative ((<$>))-import Data.List (isSuffixOf)- import Idris.AbsSyntax-import Idris.Error- import Idris.Core.TT-+import Idris.Error import IRTS.System (getIdrisLibDir) -import System.FilePath-import System.Directory+import Control.Applicative ((<$>)) import Control.Monad.State.Strict+import Data.List (isSuffixOf)+import System.Directory+import System.FilePath  data IFileType = IDR FilePath | LIDR FilePath | IBC FilePath IFileType     deriving (Show, Eq)
src/Idris/Info.hs view
@@ -6,7 +6,11 @@ Maintainer  : The Idris Community. -} module Idris.Info-  ( getIdrisLibDir+  ( getIdrisDataDir+  , getIdrisCRTSDir+  , getIdrisJSRTSDir+  , getIdrisLibDir+  , getIdrisDocDir   , getIdrisFlagsLib   , getIdrisFlagsInc   , getIdrisFlagsEnv@@ -20,18 +24,27 @@   , getIdrisLoggingCategories   ) where -import System.FilePath-import System.Directory-import Data.Version--import Idris.Imports (installedPackages) import Idris.AbsSyntax (loggingCatsStr)-+import Idris.Imports (installedPackages) import qualified IRTS.System as S +import Paths_idris import Version_idris (gitHash) -import Paths_idris+import Data.Version+import System.Directory+import System.FilePath+getIdrisDataDir :: IO String+getIdrisDataDir = S.getIdrisDataDir++getIdrisCRTSDir :: IO String+getIdrisCRTSDir = S.getIdrisCRTSDir++getIdrisJSRTSDir :: IO String+getIdrisJSRTSDir = S.getIdrisJSRTSDir++getIdrisDocDir :: IO String+getIdrisDocDir = S.getIdrisDocDir  getIdrisLibDir :: IO String getIdrisLibDir = S.getIdrisLibDir
src/Idris/Info/Show.hs view
@@ -1,9 +1,29 @@ module Idris.Info.Show where +import Idris.Info+ import System.Exit -import Idris.Info+showIdrisCRTSDir :: IO ()+showIdrisCRTSDir = do+  ldir <- getIdrisCRTSDir+  putStrLn ldir +showExitIdrisCRTSDir :: IO ()+showExitIdrisCRTSDir = do+  showIdrisCRTSDir+  exitSuccess++showIdrisJSRTSDir :: IO ()+showIdrisJSRTSDir = do+  ldir <- getIdrisJSRTSDir+  putStrLn ldir++showExitIdrisJSRTSDir :: IO ()+showExitIdrisJSRTSDir = do+  showIdrisJSRTSDir+  exitSuccess+ showIdrisFlagsLibs :: IO () showIdrisFlagsLibs = do   libFlags <- getIdrisFlagsLib@@ -14,6 +34,16 @@   showIdrisFlagsLibs   exitSuccess +showIdrisDataDir :: IO ()+showIdrisDataDir = do+  ldir <- getIdrisDataDir+  putStrLn ldir++showExitIdrisDataDir :: IO ()+showExitIdrisDataDir = do+  showIdrisDataDir+  exitSuccess+ showIdrisLibDir :: IO () showIdrisLibDir = do   ldir <- getIdrisLibDir@@ -24,6 +54,16 @@   showIdrisLibDir   exitSuccess +showIdrisDocDir :: IO ()+showIdrisDocDir = do+  ldir <- getIdrisDocDir+  putStrLn ldir++showExitIdrisDocDir :: IO ()+showExitIdrisDocDir = do+  showIdrisDocDir+  exitSuccess+ showIdrisFlagsInc :: IO () showIdrisFlagsInc = do   incFlags <- getIdrisFlagsInc@@ -68,8 +108,16 @@   putStrLn "Paths:"   ldir <- getIdrisLibDir   udir <- getIdrisUserDataDir+  ddir <- getIdrisDocDir+  idir <- getIdrisDataDir+  crdir <- getIdrisCRTSDir+  jrdir <- getIdrisJSRTSDir+  putStrLn $ unwords ["-", "Data Dir:", idir]   putStrLn $ unwords ["-", "Library Dir:", ldir]+  putStrLn $ unwords ["-", "C RTS Dir:", crdir]+  putStrLn $ unwords ["-", "JS RTS Dir:", jrdir]   putStrLn $ unwords ["-", "User Dir:",    udir]+  putStrLn $ unwords ["-", "Documentation Dir:", ddir]    putStrLn "Flags:"   lflag <- getIdrisFlagsLib
src/Idris/Inliner.hs view
@@ -9,8 +9,8 @@  module Idris.Inliner(inlineDef, inlineTerm) where -import Idris.Core.TT import Idris.AbsSyntax+import Idris.Core.TT  inlineDef :: IState -> [([Name], Term, Term)] -> [([Name], Term, Term)] inlineDef ist ds = map (\ (ns, lhs, rhs) -> (ns, lhs, inlineTerm ist rhs)) ds
src/Idris/Interactive.hs view
@@ -14,30 +14,29 @@   , makeLemma   ) where -import Idris.Core.TT-import Idris.Core.Evaluate-import Idris.CaseSplit import Idris.AbsSyntax+import Idris.CaseSplit+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Delaborate+import Idris.Elab.Term+import Idris.Elab.Value import Idris.ElabDecls import Idris.Error import Idris.ErrReverse-import Idris.Delaborate-import Idris.Output import Idris.IdeMode hiding (IdeModeCommand(..))-import Idris.Elab.Value-import Idris.Elab.Term+import Idris.Output  import Util.Pretty import Util.System -import System.FilePath-import System.Directory-import System.IO import Data.Char-import Data.Maybe (fromMaybe) import Data.List (isSuffixOf)-+import Data.Maybe (fromMaybe) import Debug.Trace+import System.Directory+import System.FilePath+import System.IO  caseSplitAt :: FilePath -> Bool -> Int -> Name -> Idris () caseSplitAt fn updatefile l n
src/Idris/Main.hs view
@@ -13,52 +13,47 @@   ) where  import Idris.AbsSyntax-import Idris.ModeCommon-import Idris.REPL.Parser+import Idris.Core.Execute (execute)+import Idris.Core.TT+import Idris.Elab.Term+import Idris.Elab.Value+import Idris.ElabDecls import Idris.Error import Idris.IBC-import Idris.Parser hiding (indent)+import Idris.Info+import Idris.ModeCommon import Idris.Output--import Idris.REPL.Commands+import Idris.Parser hiding (indent) import Idris.REPL--import Idris.ElabDecls-import Idris.Elab.Value-import Idris.Elab.Term-import Idris.Info+import Idris.REPL.Commands+import Idris.REPL.Parser+import IRTS.CodegenCommon  import Util.System -import Idris.Core.Execute (execute)-import Idris.Core.TT--import IRTS.CodegenCommon+import Prelude hiding (id, (.), (<$>))  import Control.Category-import Prelude hiding ((<$>), (.), id)--import Text.Trifecta.Result(Result(..), ErrInfo(..))--import System.Console.Haskeline as H-import System.FilePath-import System.Exit-import System.Directory-import System.IO+import Control.DeepSeq import Control.Monad+import Control.Monad.Trans (lift) import Control.Monad.Trans.Except (runExceptT) import Control.Monad.Trans.State.Strict (execStateT)-import Control.Monad.Trans ( lift ) import Data.Maybe-import Control.DeepSeq--+import System.Console.Haskeline as H+import System.Directory+import System.Exit+import System.FilePath+import System.IO+import Text.Trifecta.Result (ErrInfo(..), Result(..))  -- | How to run Idris programs. runMain :: Idris () -> IO () runMain prog = do res <- runExceptT $ execStateT prog idrisInit                   case res of-                       Left err -> putStrLn $ "Uncaught error: " ++ show err+                       Left err -> do+                         putStrLn $ "Uncaught error: " ++ show err+                         exitFailure                        Right _ -> return ()  
src/Idris/ModeCommon.hs view
@@ -6,32 +6,29 @@ -} module Idris.ModeCommon where - import Idris.AbsSyntax+import Idris.Chaser+import Idris.Core.TT+import Idris.Delaborate import Idris.Erasure import Idris.Error import Idris.IBC-import Idris.Delaborate-import Idris.Parser hiding (indent)-import Idris.Chaser import Idris.Imports-import Idris.Output import Idris.Info-import Idris.Core.TT-+import Idris.Output+import Idris.Parser hiding (indent) import IRTS.Exports -import Control.Category-import Prelude hiding ((<$>), (.), id)+import Prelude hiding (id, (.), (<$>)) -import System.Directory+import Control.Category+import Control.DeepSeq import Control.Monad import Control.Monad.Trans.State.Strict (get)-import Network.Socket (PortNumber)-import Data.Maybe import Data.List hiding (group)-import Control.DeepSeq-+import Data.Maybe+import Network.Socket (PortNumber)+import System.Directory  defaultPort :: PortNumber defaultPort = fromIntegral 4294
src/Idris/Output.hs view
@@ -10,11 +10,10 @@  module Idris.Output where -import Idris.Core.TT-import Idris.Core.Evaluate (isDConName, isTConName, isFnName, normaliseAll)- import Idris.AbsSyntax-import Idris.Colours (hStartColourise, hEndColourise)+import Idris.Colours (hEndColourise, hStartColourise)+import Idris.Core.Evaluate (isDConName, isFnName, isTConName, normaliseAll)+import Idris.Core.TT import Idris.Delaborate import Idris.Docstrings import Idris.IdeMode@@ -23,18 +22,16 @@ import Util.ScreenSize (getScreenWidth) import Util.System (isATTY) -import Control.Monad.Trans.Except (ExceptT (ExceptT), runExceptT)--import System.Console.Haskeline.MonadException-  (MonadException (controlIO), RunIO (RunIO))-import System.IO (stdout, Handle, hPutStrLn, hPutStr)-import System.FilePath (replaceExtension)- import Prelude hiding ((<$>)) +import Control.Monad.Trans.Except (ExceptT(ExceptT), runExceptT) import Data.Char (isAlpha)-import Data.List (nub, intersperse)+import Data.List (intersperse, nub) import Data.Maybe (fromMaybe)+import System.Console.Haskeline.MonadException (MonadException(controlIO),+                                                RunIO(RunIO))+import System.FilePath (replaceExtension)+import System.IO (Handle, hPutStr, hPutStrLn, stdout)  instance MonadException m => MonadException (ExceptT Err m) where     controlIO f = ExceptT $ controlIO $ \(RunIO run) -> let
src/Idris/Package.hs view
@@ -8,42 +8,38 @@ {-# LANGUAGE CPP #-} module Idris.Package where -import System.Process-import System.Directory-import System.Exit-import System.IO-import System.FilePath ((</>), addTrailingPathSeparator, takeFileName,-                        takeDirectory, normalise, addExtension, hasExtension)-import System.Directory (createDirectoryIfMissing, copyFile)--import Util.System--import Control.Monad-import Control.Monad.Trans.State.Strict (execStateT)-import Control.Monad.Trans.Except (runExceptT)--import Data.List-import Data.List.Split(splitOn)-import Data.Maybe(fromMaybe)-import Data.Either(partitionEithers)--import Idris.Core.TT-import Idris.REPL-import Idris.Parser (loadModule)-import Idris.Output (pshow) import Idris.AbsSyntax-import Idris.IdrisDoc+import Idris.Core.TT+import Idris.Error (ifail) import Idris.IBC-import Idris.Output+import Idris.IdrisDoc import Idris.Imports-import Idris.Error (ifail)-import Idris.Main (idrisMain, idris)-+import Idris.Main (idris, idrisMain)+import Idris.Output (pshow)+import Idris.Output import Idris.Package.Common import Idris.Package.Parser-+import Idris.Parser (loadModule)+import Idris.REPL import IRTS.System +import Util.System++import Control.Monad+import Control.Monad.Trans.Except (runExceptT)+import Control.Monad.Trans.State.Strict (execStateT)+import Data.Either (partitionEithers)+import Data.List+import Data.List.Split (splitOn)+import Data.Maybe (fromMaybe)+import System.Directory+import System.Directory (copyFile, createDirectoryIfMissing)+import System.Exit+import System.FilePath (addExtension, addTrailingPathSeparator, hasExtension,+                        normalise, takeDirectory, takeFileName, (</>))+import System.IO+import System.Process+ -- To build a package: -- * read the package description -- * check all the library dependencies exist@@ -149,6 +145,7 @@     case mergeOptions copts (idris_opts pkgdesc) of       Left emsg  -> ifail emsg       Right opts -> do+           putIState orig         dir <- runIO getCurrentDirectory         runIO $ setCurrentDirectory $ dir </> sourcedir pkgdesc@@ -190,10 +187,10 @@ -- -- Issue number #1572 on the issue tracker --       https://github.com/idris-lang/Idris-dev/issues/1572-documentPkg :: [Opt]    -- ^ Command line options.-            -> FilePath -- ^ Path to ipkg file.+documentPkg :: [Opt]           -- ^ Command line options.+            -> (Bool,FilePath) -- ^ (Should we install?, Path to ipkg file).             -> IO ()-documentPkg copts fp = do+documentPkg copts (install,fp) = do   pkgdesc        <- parseDesc fp   cd             <- getCurrentDirectory   let pkgDir      = cd </> takeDirectory fp@@ -223,7 +220,13 @@           putStrLn $ pshow idrisInit err           exitWith (ExitFailure 1)         Right ist -> do-          docRes <- generateDocs ist mods outputDir+          iDocDir   <- getIdrisDocDir+          pkgDocDir <- makeAbsolute (iDocDir </> pkgname pkgdesc)+          let out_dir = if install then pkgDocDir else outputDir+          when install $ do+              putStrLn $ unwords ["Attempting to install IdrisDocs for", pkgname pkgdesc, "in:", out_dir]++          docRes <- generateDocs ist mods out_dir           case docRes of             Right _  -> return ()             Left msg -> do@@ -235,42 +238,44 @@ -- | Build a package with a sythesized main function that runs the tests testPkg :: [Opt]     -- ^ Command line options.         -> FilePath  -- ^ Path to ipkg file.-        -> IO ()+        -> IO ExitCode testPkg copts fp = do   pkgdesc <- parseDesc fp   ok <- mapM (testLib True (pkgname pkgdesc)) (libdeps pkgdesc)-  when (and ok) $ do-    m_ist <- inPkgDir pkgdesc $ do-      make (makefile pkgdesc)-      -- Get a temporary file to save the tests' source in-      (tmpn, tmph) <- tempfile ".idr"-      hPutStrLn tmph $-          "module Test_______\n" ++-          concat ["import " ++ show m ++ "\n" | m <- modules pkgdesc]-              ++ "namespace Main\n"-              ++ "  main : IO ()\n"-              ++ "  main = do "-              ++ concat [ show t ++ "\n            "-                        | t <- idris_tests pkgdesc]-      hClose tmph-      (tmpn', tmph') <- tempfile ""-      hClose tmph'-      let popts = (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)-      case mergeOptions copts popts of-        Left emsg -> do-          putStrLn emsg-          exitWith (ExitFailure 1)-        Right opts -> do-          m_ist <- idris opts-          rawSystem tmpn' []-          return m_ist-    case m_ist of-      Nothing  -> exitWith (ExitFailure 1)-      Just ist -> do-        -- Quit with error code if problem building-        case errSpan ist of-          Just _ -> exitWith (ExitFailure 1)-          _      -> return ()+  if and ok+    then do+      (m_ist, exitCode) <- inPkgDir pkgdesc $ do+        make (makefile pkgdesc)+        -- Get a temporary file to save the tests' source in+        (tmpn, tmph) <- tempfile ".idr"+        hPutStrLn tmph $+            "module Test_______\n" +++            concat ["import " ++ show m ++ "\n" | m <- modules pkgdesc]+                ++ "namespace Main\n"+                ++ "  main : IO ()\n"+                ++ "  main = do "+                ++ concat [ show t ++ "\n            "+                          | t <- idris_tests pkgdesc]+        hClose tmph+        (tmpn', tmph') <- tempfile ""+        hClose tmph'+        let popts = (Filename tmpn : NoREPL : Verbose : Output tmpn' : idris_opts pkgdesc)+        case mergeOptions copts popts of+          Left emsg -> do+            putStrLn emsg+            exitWith (ExitFailure 1)+          Right opts -> do+            m_ist    <- idris opts+            exitCode <- rawSystem tmpn' []+            return (m_ist, exitCode)+      case m_ist of+        Nothing  -> exitWith (ExitFailure 1)+        Just ist -> do+          -- Quit with error code if problem building+          case errSpan ist of+            Just _ -> exitWith (ExitFailure 1)+            _      -> return exitCode+    else return (ExitFailure 1)  --  ----------------------------------------------------------- [ Installation ] @@ -279,7 +284,7 @@            -> PkgDesc   -- ^ iPKG file.            -> IO () installPkg altdests pkgdesc = inPkgDir pkgdesc $ do-  d <- getTargetDir+  d <- getIdrisLibDir   let destdir = case altdests of                   []     -> d                   (d':_) -> d'@@ -302,11 +307,11 @@  testLib :: Bool -> String -> String -> IO Bool testLib warn p f-    = do d <- getDataDir+    = do d <- getIdrisCRTSDir          gcc <- getCC          (tmpf, tmph) <- tempfile ""          hClose tmph-         let libtest = d </> "rts" </> "libtest.c"+         let libtest = d </> "libtest.c"          e <- rawSystem gcc [libtest, "-l" ++ f, "-o", tmpf]          case e of             ExitSuccess -> return True@@ -416,14 +421,15 @@     normaliseOpts = filter filtOpt      filtOpt :: Opt -> Bool-    filtOpt (PkgBuild   _) = False-    filtOpt (PkgInstall _) = False-    filtOpt (PkgClean   _) = False-    filtOpt (PkgCheck   _) = False-    filtOpt (PkgREPL    _) = False-    filtOpt (PkgMkDoc   _) = False-    filtOpt (PkgTest    _) = False-    filtOpt _              = True+    filtOpt (PkgBuild        _) = False+    filtOpt (PkgInstall      _) = False+    filtOpt (PkgClean        _) = False+    filtOpt (PkgCheck        _) = False+    filtOpt (PkgREPL         _) = False+    filtOpt (PkgDocBuild     _) = False+    filtOpt (PkgDocInstall   _) = False+    filtOpt (PkgTest         _) = False+    filtOpt _                   = True      chkOpt :: Opt -> Either String Opt     chkOpt o@(OLogging _)     = Right o
src/Idris/Package/Common.hs view
@@ -6,9 +6,8 @@ -} module Idris.Package.Common where -import Idris.Core.TT (Name)- import Idris.AbsSyntaxTree (Opt(..))+import Idris.Core.TT (Name)  -- | Description of an Idris package. data PkgDesc = PkgDesc {
src/Idris/Package/Parser.hs view
@@ -11,23 +11,23 @@ #endif module Idris.Package.Parser where -import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)-import qualified Text.PrettyPrint.ANSI.Leijen as PP-import Idris.Core.TT-import Idris.REPL import Idris.AbsSyntaxTree-import Idris.Parser.Helpers hiding (stringLiteral) import Idris.CmdOptions-+import Idris.Core.TT import Idris.Package.Common+import Idris.Parser.Helpers hiding (stringLiteral)+import Idris.REPL -import Control.Monad.State.Strict+import Util.System+ import Control.Applicative-import System.FilePath (takeFileName, isValid)-import Data.Maybe (isNothing, fromJust)+import Control.Monad.State.Strict import Data.List (union)--import Util.System+import Data.Maybe (fromJust, isNothing)+import System.FilePath (isValid, takeFileName)+import qualified Text.PrettyPrint.ANSI.Leijen as PP+import Text.Trifecta hiding (char, charLiteral, natural, span, string, symbol,+                      whiteSpace)  type PParser = StateT PkgDesc IdrisInnerParser 
src/Idris/Parser.hs view
@@ -5,7 +5,7 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, PatternGuards #-} {-# OPTIONS_GHC -O0 #-} module Idris.Parser(module Idris.Parser,                     module Idris.Parser.Expr,@@ -13,74 +13,67 @@                     module Idris.Parser.Helpers,                     module Idris.Parser.Ops) where -import Prelude hiding (pi)--import qualified System.Directory as Dir (makeAbsolute)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi--import Text.PrettyPrint.ANSI.Leijen (Doc, plain)-import qualified Text.PrettyPrint.ANSI.Leijen as ANSI- import Idris.AbsSyntax hiding (namespace, params)-import Idris.DSL-import Idris.Imports+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Coverage import Idris.Delaborate-import Idris.Error-import Idris.Elab.Value+import Idris.Docstrings hiding (Unchecked)+import Idris.DSL import Idris.Elab.Term+import Idris.Elab.Value import Idris.ElabDecls-import Idris.Coverage+import Idris.Error import Idris.IBC-import Idris.Unlit-import Idris.Providers+import Idris.Imports import Idris.Output-+import Idris.Parser.Data+import Idris.Parser.Expr import Idris.Parser.Helpers import Idris.Parser.Ops-import Idris.Parser.Expr-import Idris.Parser.Data--import Idris.Docstrings hiding (Unchecked)--import Paths_idris+import Idris.Providers+import Idris.Termination+import Idris.Unlit  import Util.DynamicLinker-import Util.System (readSource, writeSource) import qualified Util.Pretty as P+import Util.System (readSource, writeSource) -import Idris.Core.TT-import Idris.Core.Evaluate+import Paths_idris +import Prelude hiding (pi)+ import Control.Applicative hiding (Const) import Control.Monad import Control.Monad.State.Strict--import Data.Function-import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid+import qualified Data.ByteString.UTF8 as UTF8 import Data.Char-import Data.Ord import Data.Foldable (asum)+import Data.Function import Data.Generics.Uniplate.Data (descendM)-import qualified Data.Map as M import qualified Data.HashSet as HS-import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8+import Data.List+import qualified Data.List.Split as Spl+import qualified Data.Map as M+import Data.Maybe+import Data.Monoid+import Data.Ord import qualified Data.Set as S-+import qualified Data.Text as T import Debug.Trace-+import qualified System.Directory as Dir (makeAbsolute) import System.FilePath import System.IO+import qualified Text.Parser.Char as Chr+import Text.Parser.Expression+import Text.Parser.LookAhead+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Token.Highlight as Hi+import Text.PrettyPrint.ANSI.Leijen (Doc, plain)+import qualified Text.PrettyPrint.ANSI.Leijen as ANSI+import Text.Trifecta hiding (Err, char, charLiteral, natural, span, string,+                      stringLiteral, symbol, whiteSpace)+import Text.Trifecta.Delta  {- @@@ -699,6 +692,8 @@                     return Reflection         <|> do try (lchar '%' *> reserved "hint");                     return AutoHint+        <|> do try (lchar '%' *> reserved "overlapping");+                    return OverlappingDictionary         <|> do lchar '%'; reserved "specialise";                lchar '['; ns <- sepBy nameTimes (lchar ','); lchar ']';                return $ Specialise ns
src/Idris/Parser/Data.hs view
@@ -5,46 +5,40 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, PatternGuards #-} module Idris.Parser.Data where -import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding ( span, stringLiteral, charLiteral, natural-                            , symbol, char, string, whiteSpace, Err)--import           Text.Parser.LookAhead-import           Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi- import Idris.AbsSyntax+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Docstrings+import Idris.DSL+import Idris.Parser.Expr import Idris.Parser.Helpers import Idris.Parser.Ops-import Idris.Parser.Expr-import Idris.DSL -import Idris.Core.TT-import Idris.Core.Evaluate--import Idris.Docstrings+import Prelude hiding (pi)  import Control.Applicative import Control.Monad import Control.Monad.State.Strict--import           Data.Maybe-import qualified Data.List.Split as Spl-import           Data.List-import           Data.Monoid-import           Data.Char+import qualified Data.ByteString.UTF8 as UTF8+import Data.Char import qualified Data.HashSet as HS+import Data.List+import qualified Data.List.Split as Spl+import Data.Maybe+import Data.Monoid import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8- import Debug.Trace+import qualified Text.Parser.Char as Chr+import Text.Parser.Expression+import Text.Parser.LookAhead+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Token.Highlight as Hi+import Text.Trifecta hiding (Err, char, charLiteral, natural, span, string,+                      stringLiteral, symbol, whiteSpace)+import Text.Trifecta.Delta  {- | Parses a record type declaration Record ::=
src/Idris/Parser/Expr.hs view
@@ -9,6 +9,12 @@ {-# LANGUAGE PatternGuards, TupleSections                #-} module Idris.Parser.Expr where +import Idris.AbsSyntax+import Idris.Parser.Helpers+import Idris.Parser.Ops+import Idris.DSL+import Idris.Core.TT+ import Prelude hiding (pi)  import Text.Trifecta.Delta@@ -18,18 +24,9 @@ import qualified Text.Parser.Token as Tok import qualified Text.Parser.Char as Chr import qualified Text.Parser.Token.Highlight as Hi--import Idris.AbsSyntax-import Idris.Parser.Helpers-import Idris.Parser.Ops-import Idris.DSL--import Idris.Core.TT- import Control.Applicative import Control.Monad import Control.Monad.State.Strict- import Data.Function (on) import Data.Maybe import qualified Data.List.Split as Spl@@ -39,7 +36,6 @@ import qualified Data.HashSet as HS import qualified Data.Text as T import qualified Data.ByteString.UTF8 as UTF8- import Debug.Trace  -- | Allow implicit type declarations
src/Idris/Parser/Helpers.hs view
@@ -5,50 +5,46 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, ConstraintKinds #-}-{-# LANGUAGE PatternGuards, StandaloneDeriving                 #-}+{-# LANGUAGE CPP, ConstraintKinds, GeneralizedNewtypeDeriving, PatternGuards,+             StandaloneDeriving #-} #if !(MIN_VERSION_base(4,8,0)) {-# LANGUAGE OverlappingInstances #-} #endif module Idris.Parser.Helpers where -import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace, Err)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi- import Idris.AbsSyntax--import Idris.Core.TT import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Delaborate (pprintErr) import Idris.Docstrings import Idris.Output (iWarn)  import qualified Util.Pretty as Pretty (text) +import Prelude hiding (pi)+ import Control.Applicative import Control.Monad import Control.Monad.State.Strict--import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid+import qualified Data.ByteString.UTF8 as UTF8 import Data.Char-import qualified Data.Map as M import qualified Data.HashSet as HS+import Data.List+import qualified Data.List.Split as Spl+import qualified Data.Map as M+import Data.Maybe+import Data.Monoid import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8--import System.FilePath- import Debug.Trace+import System.FilePath+import qualified Text.Parser.Char as Chr+import Text.Parser.Expression+import Text.Parser.LookAhead+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Token.Highlight as Hi+import Text.Trifecta hiding (Err, char, charLiteral, natural, span, string,+                      stringLiteral, symbol, whiteSpace)+import Text.Trifecta.Delta  -- | Idris parser with state used during parsing type IdrisParser = StateT IState IdrisInnerParser
src/Idris/Parser/Ops.hs view
@@ -5,38 +5,35 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, PatternGuards #-}+{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, PatternGuards #-} module Idris.Parser.Ops where -import Prelude hiding (pi)--import Text.Trifecta.Delta-import Text.Trifecta hiding (span, stringLiteral, charLiteral, natural, symbol, char, string, whiteSpace)-import Text.Parser.LookAhead-import Text.Parser.Expression-import qualified Text.Parser.Token as Tok-import qualified Text.Parser.Char as Chr-import qualified Text.Parser.Token.Highlight as Hi- import Idris.AbsSyntax+import Idris.Core.TT import Idris.Parser.Helpers -import Idris.Core.TT+import Prelude hiding (pi)  import Control.Applicative import Control.Monad import Control.Monad.State.Strict--import Data.Maybe-import qualified Data.List.Split as Spl-import Data.List-import Data.Monoid+import qualified Data.ByteString.UTF8 as UTF8 import Data.Char import qualified Data.HashSet as HS+import Data.List+import qualified Data.List.Split as Spl+import Data.Maybe+import Data.Monoid import qualified Data.Text as T-import qualified Data.ByteString.UTF8 as UTF8- import Debug.Trace+import qualified Text.Parser.Char as Chr+import Text.Parser.Expression+import Text.Parser.LookAhead+import qualified Text.Parser.Token as Tok+import qualified Text.Parser.Token.Highlight as Hi+import Text.Trifecta hiding (char, charLiteral, natural, span, string,+                      stringLiteral, symbol, whiteSpace)+import Text.Trifecta.Delta  -- | Creates table for fixity declarations to build expression parser -- using pre-build and user-defined operator/fixity declarations
src/Idris/PartialEval.hs view
@@ -14,23 +14,24 @@   ) where  import Idris.AbsSyntax-import Idris.Delaborate--import Idris.Core.TT import Idris.Core.CaseTree import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Delaborate -import Control.Monad.State import Control.Applicative+import Control.Monad.State import Data.Maybe import Debug.Trace  -- | Data type representing binding-time annotations for partial evaluation of arguments-data PEArgType = ImplicitS -- ^ Implicit static argument-               | ImplicitD -- ^ Implicit dynamic argument-               | ExplicitS -- ^ Explicit static argument-               | ExplicitD -- ^ Explicit dynamic argument-               | UnifiedD  -- ^ Erasable dynamic argument (found under unification)+data PEArgType = ImplicitS Name -- ^ Implicit static argument+               | ImplicitD Name -- ^ Implicit dynamic argument+               | ConstraintS    -- ^ Implementation constraint+               | ConstraintD    -- ^ Implementation constraint+               | ExplicitS      -- ^ Explicit static argument+               | ExplicitD      -- ^ Explicit dynamic argument+               | UnifiedD       -- ^ Erasable dynamic argument (found under unification)   deriving (Eq, Show)  -- | A partially evaluated function. pe_app captures the lhs of the@@ -98,8 +99,10 @@     -- of expecting it as a function argument     st ((ExplicitS, v) : xs) (Bind n (Pi _ t _) sc)          = Bind n (Let t v) (st xs sc)-    st ((ImplicitS, v) : xs) (Bind n (Pi _ t _) sc)+    st ((ImplicitS _, v) : xs) (Bind n (Pi _ t _) sc)          = Bind n (Let t v) (st xs sc)+    st ((ConstraintS, v) : xs) (Bind n (Pi _ t _) sc)+         = Bind n (Let t v) (st xs sc)     -- Erase argument from function type     st ((UnifiedD, _) : xs) (Bind n (Pi _ t _) sc)          = st xs sc@@ -110,7 +113,7 @@      -- Erase implicit dynamic argument if existing argument shares it value,     -- by substituting the value of previous argument-    unifyEq (imp@(ImplicitD, v) : xs) (Bind n (Pi i t k) sc)+    unifyEq (imp@(ImplicitD _, v) : xs) (Bind n (Pi i t k) sc)          = do amap <- get               case lookup imp amap of                    Just n' ->@@ -140,11 +143,12 @@   where     mkty ((ExplicitD, v) : xs) (Bind n (Pi _ t k) sc)        = PPi expl n NoFC (delab ist (generaliseIn t)) (mkty xs sc)-    mkty ((ImplicitD, v) : xs) (Bind n (Pi _ t k) sc)+    mkty ((ConstraintD, v) : xs) (Bind n (Pi _ t k) sc)          | concreteInterface ist t = mkty xs sc          | interfaceConstraint ist t              = PPi constraint n NoFC (delab ist (generaliseIn t)) (mkty xs sc)-         | otherwise = PPi impl n NoFC (delab ist (generaliseIn t)) (mkty xs sc)+    mkty ((ImplicitD _, v) : xs) (Bind n (Pi _ t k) sc)+         = PPi impl n NoFC (delab ist (generaliseIn t)) (mkty xs sc)      mkty (_ : xs) t        = mkty xs t@@ -201,7 +205,8 @@                          (_, args) -> dynArgs ns args         dynArgs _ [] = True -- can definitely reduce from here         -- if Static, doesn't matter what the argument is-        dynArgs ((ImplicitS, _) : ns) (a : as) = dynArgs ns as+        dynArgs ((ImplicitS _, _) : ns) (a : as) = dynArgs ns as+        dynArgs ((ConstraintS, _) : ns) (a : as) = dynArgs ns as         dynArgs ((ExplicitS, _) : ns) (a : as) = dynArgs ns as         -- if Dynamic, it had better be a variable or we'll need to         -- do some more work@@ -210,7 +215,7 @@         dynArgs _ _ = False -- and now we'll get stuck  mkNewPats ist d ns newname sname lhs rhs =-    PEDecl lhs rhs (map mkClause d) False+           PEDecl lhs rhs (map mkClause d) False   where     mkClause :: (Term, Term) -> (PTerm, PTerm)     mkClause (oldlhs, oldrhs)@@ -222,25 +227,37 @@                      (lhs, rhs)      mkLHSargs _ [] _ = []-    -- dynamics don't appear if they're implicit+    -- dynamics don't appear on the LHS if they're implicit     mkLHSargs sub ((ExplicitD, t) : ns) (a : as)          = pexp (delab ist (substNames sub a)) : mkLHSargs sub ns as-    mkLHSargs sub ((ImplicitD, _) : ns) (a : as)-         = mkLHSargs sub ns as+    mkLHSargs sub ((ImplicitD n, t) : ns) (a : as)+         = pimp n (delab ist (substNames sub a)) True : mkLHSargs sub ns as+    mkLHSargs sub ((ConstraintD, t) : ns) (a : as)+         = pconst (delab ist (substNames sub a)) : mkLHSargs sub ns as     mkLHSargs sub ((UnifiedD, _) : ns) (a : as)          = mkLHSargs sub ns as     -- statics get dropped in any case-    mkLHSargs sub ((ImplicitS, t) : ns) (a : as)+    mkLHSargs sub ((ImplicitS _, t) : ns) (a : as)          = mkLHSargs (extend a t sub) ns as     mkLHSargs sub ((ExplicitS, t) : ns) (a : as)          = mkLHSargs (extend a t sub) ns as+    mkLHSargs sub ((ConstraintS, t) : ns) (a : as)+         = mkLHSargs (extend a t sub) ns as     mkLHSargs sub _ [] = [] -- no more LHS      extend (P _ n _) t sub = (n, t) : sub     extend _ _ sub = sub +    --- 'as' are the LHS arguments     mkRHSargs ((ExplicitS, t) : ns) as = pexp (delab ist t) : mkRHSargs ns as     mkRHSargs ((ExplicitD, t) : ns) (a : as) = a : mkRHSargs ns as+    -- Keep the implicits on the RHS, in case they got matched on+    mkRHSargs ((ImplicitD n, t) : ns) (a : as) = a : mkRHSargs ns as+    mkRHSargs ((ImplicitS n, t) : ns) as -- Dropped from LHS+          = pimp n (delab ist t) True : mkRHSargs ns as+    mkRHSargs ((ConstraintD, t) : ns) (a : as) = a : mkRHSargs ns as+    mkRHSargs ((ConstraintS, t) : ns) as -- Dropped from LHS+          = pconst (delab ist t) : mkRHSargs ns as     mkRHSargs (_ : ns) as = mkRHSargs ns as     mkRHSargs _ _ = [] @@ -255,12 +272,26 @@ mkPE_TermDecl :: IState               -> Name               -> Name+              -> PTerm -- ^ Type of specialised function               -> [(PEArgType, Term)]               -> PEDecl-mkPE_TermDecl ist newname sname ns-    = let lhs = PApp emptyFC (PRef emptyFC [] newname) (map pexp (mkp ns))-          rhs = eraseImps $ delab ist (mkApp (P Ref sname Erased) (map snd ns))-          patdef = lookupCtxtExact sname (idris_patdefs ist)+mkPE_TermDecl ist newname sname specty ns+      {- We need to erase the *dynamic* arguments +         where their *name* appears in the *type* of a later argument+         in specty.+         i.e. if a later dynamic argument depends on an earlier dynamic+         argument, we should infer the earlier one.+         Then we need to erase names from the LHS which no longer appear+         on the RHS.+         -}+    = let deps = getDepNames (eraseRet specty)+          lhs = eraseDeps deps $ +                  PApp emptyFC (PRef emptyFC [] newname) (mkp ns)+          rhs = eraseDeps deps $+                  delab ist (mkApp (P Ref sname Erased) (map snd ns))+          patdef = -- trace (showTmImpls specty ++ "\n" ++ showTmImpls lhs ++ "\n"+                   --      ++ showTmImpls rhs) $ +                   lookupCtxtExact sname (idris_patdefs ist)           newpats = case patdef of                          Nothing -> PEDecl lhs rhs [(lhs, rhs)] True                          Just d -> mkNewPats ist (getPats d) ns@@ -269,17 +300,28 @@    getPats (ps, _) = map (\(_, lhs, rhs) -> (lhs, rhs)) ps +  eraseRet (PPi p n fc ty sc) = PPi p n fc ty (eraseRet sc)+  eraseRet _ = Placeholder++  -- Get names used in later arguments; assume we've called eraseRet so there's+  -- no names going to appear in return type+  getDepNames (PPi _ n _ _ sc) +        | n `elem` allNamesIn sc = n : getDepNames sc+        | otherwise = getDepNames sc+  getDepNames tm = []+   mkp [] = []-  mkp ((ExplicitD, tm) : tms) = delab ist tm : mkp tms+  mkp ((ExplicitD, tm) : tms) = pexp (delab ist tm) : mkp tms+  mkp ((ImplicitD n, tm) : tms) = pimp n (delab ist tm) True : mkp tms   mkp (_ : tms) = mkp tms -  eraseImps tm = mapPT deImp tm+  eraseDeps ns tm = mapPT (deImp ns) tm -  deImp (PApp fc t as) = PApp fc t (map deImpArg as)-  deImp t = t+  deImp ns (PApp fc t as) = PApp fc t (map (deImpArg ns) as)+  deImp ns t = t -  deImpArg a@(PImp _ _ _ _ _) = a { getTm = Placeholder }-  deImpArg a = a+  deImpArg ns a | pname a `elem` ns = a { getTm = Placeholder }+                | otherwise = a  -- | Get specialised applications for a given function getSpecApps :: IState@@ -291,14 +333,22 @@ --     staticArg env True _ tm@(P _ n _) _ | n `elem` env = Just (True, tm) --     staticArg env True _ tm@(App f a) _ | (P _ n _, args) <- unApply tm, --                                            n `elem` env = Just (True, tm)-    staticArg env x imp tm n-         | x && imparg imp = (ImplicitS, tm)-         | x = (ExplicitS, tm)-         | imparg imp = (ImplicitD, tm)+    staticArg env True imp tm n+         | Just n <- imparg imp = (ImplicitS n, tm)+         | constrarg imp = (ConstraintS, tm)+         | otherwise = (ExplicitS, tm)+    +    staticArg env False imp tm n+         | Just nm <- imparg imp = (ImplicitD nm, (P Ref (sUN (show n ++ "arg")) Erased))+         | constrarg imp = (ConstraintD, tm)          | otherwise = (ExplicitD, (P Ref (sUN (show n ++ "arg")) Erased)) -    imparg (PExp _ _ _ _) = False-    imparg _ = True+    imparg (PExp _ _ _ _) = Nothing+    imparg (PConstraint _ _ _ _) = Nothing+    imparg arg = Just (pname arg)++    constrarg (PConstraint _ _ _ _) = True+    constrarg arg = False      buildApp env [] [] _ _ = []     buildApp env (s:ss) (i:is) (a:as) (n:ns)
src/Idris/Primitives.hs view
@@ -5,23 +5,21 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE RankNTypes, ScopedTypeVariables, PatternGuards #-}+{-# LANGUAGE PatternGuards, RankNTypes, ScopedTypeVariables #-}  module Idris.Primitives(primitives, Prim(..)) where  import Idris.AbsSyntax-+import Idris.Core.Evaluate+import Idris.Core.TT import IRTS.Lang -import Idris.Core.TT-import Idris.Core.Evaluate import Data.Bits-import Data.Word-import Data.Int import Data.Char import Data.Function (on)+import Data.Int import qualified Data.Vector.Unboxed as V-+import Data.Word import Debug.Trace  data Prim = Prim { p_name  :: Name,
src/Idris/ProofSearch.hs view
@@ -15,22 +15,21 @@   , resolveTC   ) where +import Idris.AbsSyntax+import Idris.Core.CaseTree import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.TT-import Idris.Core.Unify import Idris.Core.Evaluate-import Idris.Core.CaseTree+import Idris.Core.TT import Idris.Core.Typecheck--import Idris.AbsSyntax+import Idris.Core.Unify import Idris.Delaborate import Idris.Error  import Control.Applicative ((<$>)) import Control.Monad import Control.Monad.State.Strict-import qualified Data.Set as S import Data.List+import qualified Data.Set as S import Debug.Trace  -- Pass in a term elaborator to avoid a cyclic dependency with ElabTerm@@ -526,8 +525,8 @@ findImplementations ist t     | (P _ n _, _) <- unApply (getRetTy t)         = case lookupCtxt n (idris_interfaces ist) of-            [CI _ _ _ _ _ ins _] ->-              [n | (n, True) <- ins, accessible n]+            [ci] -> let ins = interface_implementations ci in+                        [n | (n, True) <- ins, accessible n]             _ -> []     | otherwise = []   where accessible n = case lookupDefAccExact n False (tt_ctxt ist) of
src/Idris/Prover.hs view
@@ -10,45 +10,41 @@  -- Hack for GHC 7.10 and earlier compat without CPP or warnings -- This exludes (<$>) as fmap, because wl-pprint uses it for newline-import Prelude (Eq(..), Show(..),-                Bool(..), Either(..), Maybe(..), String,-                (.), ($), (++), (||), (&&),-                concatMap, id, elem, error, fst, flip, foldl, foldr, init,-                length, lines, map, not, null, repeat, reverse, tail, zip)+import Prelude (Bool(..), Either(..), Eq(..), Maybe(..), Show(..), String,+                concatMap, elem, error, flip, foldl, foldr, fst, id, init,+                length, lines, map, not, null, repeat, reverse, tail, zip, ($),+                (&&), (++), (.), (||)) +import Idris.AbsSyntax+import Idris.AbsSyntaxTree+import Idris.Completion+import Idris.Core.CaseTree import Idris.Core.Elaborate hiding (Tactic(..))-import Idris.Core.TT import Idris.Core.Evaluate-import Idris.Core.CaseTree+import Idris.Core.TT import Idris.Core.Typecheck-+import Idris.DataOpts+import Idris.Delaborate+import Idris.Docs (getDocs, pprintConstDocs, pprintDocs)+import Idris.Elab.Term import Idris.Elab.Utils import Idris.Elab.Value-import Idris.Elab.Term--import Idris.AbsSyntax-import Idris.AbsSyntaxTree-import Idris.Delaborate-import Idris.Docs (getDocs, pprintDocs, pprintConstDocs) import Idris.ElabDecls-import Idris.Parser hiding (params) import Idris.Error-import Idris.DataOpts-import Idris.Completion import qualified Idris.IdeMode as IdeMode import Idris.Output+import Idris.Parser hiding (params) import Idris.TypeSearch (searchByType) -import Text.Trifecta.Result(Result(..), ErrInfo(..))+import Util.Pretty -import System.IO (Handle, stdin, stdout, hPutStrLn)-import System.Console.Haskeline-import System.Console.Haskeline.History-import Control.Monad.State.Strict import Control.DeepSeq--import Util.Pretty+import Control.Monad.State.Strict import Debug.Trace+import System.Console.Haskeline+import System.Console.Haskeline.History+import System.IO (Handle, hPutStrLn, stdin, stdout)+import Text.Trifecta.Result (ErrInfo(..), Result(..))  -- | Launch the proof shell prover :: ElabInfo -> Bool -> Bool -> Name -> Idris ()@@ -124,8 +120,6 @@                      tclift $ addCasedef n ei (CaseInfo True True False) False (STerm Erased) True False                                 [] []  -- argtys, inaccArgs                                 [Right (P Ref n ty, ptm)]-                                [([], P Ref n ty, ptm)]-                                [([], P Ref n ty, ptm)]                                 [([], P Ref n ty, ptm)]                                 [([], P Ref n ty, ptm')] ty                                 ctxt
src/Idris/Providers.hs view
@@ -5,17 +5,17 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE PatternGuards, DeriveFunctor #-}+{-# LANGUAGE DeriveFunctor, PatternGuards #-} module Idris.Providers (     providerTy   , getProvided   , Provided(..)   ) where -import Idris.Core.TT-import Idris.Core.Evaluate import Idris.AbsSyntax import Idris.AbsSyntaxTree+import Idris.Core.Evaluate+import Idris.Core.TT import Idris.Error  -- | Wrap a type provider in the type of type providers
src/Idris/REPL.hs view
@@ -4,8 +4,8 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,-             PatternGuards, CPP #-}+{-# LANGUAGE CPP, DeriveFunctor, FlexibleInstances, MultiParamTypeClasses,+             PatternGuards #-} module Idris.REPL   ( idemodeStart   , startServer@@ -17,97 +17,85 @@   ) where  import Idris.AbsSyntax-import Idris.ASTUtils import Idris.Apropos (apropos, aproposModules)-import Idris.REPL.Parser+import Idris.ASTUtils+import Idris.Colours hiding (colourise)+import Idris.Completion+import Idris.Core.Constraints+import Idris.Core.Evaluate+import Idris.Core.Execute (execute)+import Idris.Core.TT+import Idris.Core.Unify+import Idris.Core.WHNF+import Idris.Coverage+import Idris.Delaborate+import Idris.Docs hiding (Doc)+import Idris.Docstrings (overview, renderDocTerm, renderDocstring)+import Idris.Elab.Clause+import Idris.Elab.Term+import Idris.Elab.Value+import Idris.ElabDecls import Idris.Error-import Idris.IBC import Idris.ErrReverse-import Idris.Delaborate-import Idris.Docstrings (overview, renderDocstring, renderDocTerm) import Idris.Help-import Idris.IdrisDoc-import Idris.Prover-import Idris.Parser hiding (indent)-import Idris.Coverage-import Idris.Docs hiding (Doc)-import Idris.Completion+import Idris.IBC import qualified Idris.IdeMode as IdeMode-import Idris.Colours hiding (colourise)+import Idris.IdrisDoc+import Idris.Info import Idris.Inliner-import Idris.Output import Idris.Interactive-import Idris.WhoCalls-import Idris.TypeSearch (searchByType)-+import Idris.ModeCommon+import Idris.Output+import Idris.Parser hiding (indent)+import Idris.Prover import Idris.REPL.Browse (namesInNS, namespacesInNS) import Idris.REPL.Commands--import Idris.ElabDecls-import Idris.Elab.Clause-import Idris.Elab.Value-import Idris.Elab.Term-import Idris.ModeCommon-import Idris.Info+import Idris.REPL.Parser+import Idris.Termination+import Idris.TypeSearch (searchByType)+import Idris.WhoCalls+import IRTS.Compiler -import Version_idris (gitHash)-import Util.System import Util.DynamicLinker import Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) import Util.Pretty hiding ((</>))+import Util.System -import Idris.Core.Evaluate-import Idris.Core.Execute (execute)-import Idris.Core.TT-import Idris.Core.Unify-import Idris.Core.WHNF-import Idris.Core.Constraints+import Version_idris (gitHash) -import IRTS.Compiler+import Prelude hiding (id, (.), (<$>))  import Control.Category+import Control.Concurrent+import Control.Concurrent.Async (race)+import Control.Concurrent.MVar+import Control.DeepSeq import qualified Control.Exception as X-import Prelude hiding ((<$>), (.), id)-import Data.List.Split (splitOn)-import qualified Data.Text as T--import Text.Trifecta.Result(Result(..), ErrInfo(..))--import System.Console.Haskeline as H-import System.FilePath-  ( (</>)-  , (<.>)-  , splitExtension-  , addExtension-  , dropExtension-  , takeExtension-  , takeDirectory-  )-import System.Exit-import System.Environment-import System.Process-import System.Directory-import System.IO import Control.Monad+import Control.Monad.Trans (lift) import Control.Monad.Trans.Except (ExceptT, runExceptT)-import Control.Monad.Trans.State.Strict ( StateT, execStateT, evalStateT, get, put )-import Control.Monad.Trans ( lift )-import Control.Concurrent.MVar-import Network-import Control.Concurrent-import Data.Maybe-import Data.List hiding (group)+import Control.Monad.Trans.State.Strict (StateT, evalStateT, execStateT, get,+                                         put) import Data.Char+import Data.Either (partitionEithers)+import Data.List hiding (group)+import Data.List.Split (splitOn)+import Data.Maybe import qualified Data.Set as S+import qualified Data.Text as T import Data.Version-import Data.Either (partitionEithers)-import Control.DeepSeq--import Control.Concurrent.Async (race)-import System.FSNotify (withManager, watchDir)+import Network+import System.Console.Haskeline as H+import System.Directory+import System.Environment+import System.Exit+import System.FilePath (addExtension, dropExtension, splitExtension,+                        takeDirectory, takeExtension, (<.>), (</>))+import System.FSNotify (watchDir, withManager) import System.FSNotify.Devel (allEvents, doAllEvents)--+import System.IO+import System.Process+import Text.Trifecta.Result (ErrInfo(..), Result(..))  -- | Run the REPL repl :: IState -- ^ The initial state@@ -1227,8 +1215,10 @@                     = do (tm, ty) <- elabVal (recinfo (fileFC "toplevel")) ERHS t                          ctxt <- getContext                          ist <- getIState-                         let tm' = whnf ctxt tm-                         iPrintResult (show (delab ist tm'))+                         let tm' = whnf ctxt [] tm+                         let tmArgs' = whnfArgs ctxt [] tm+                         iPrintResult $ "WHNF: " ++ (show (delab ist tm'))+                         iPrintResult $ "WHNF args: " ++ (show (delab ist tmArgs')) process fn (TestInline t)                            = do (tm, ty) <- elabVal (recinfo (fileFC "toplevel")) ERHS t                                 ctxt <- getContext@@ -1283,7 +1273,7 @@          case lookupCtxt n (idris_patdefs i) of            [] -> iPrintError $ "Unknown name " ++ show n            [(_, tms)] ->-             iRenderResult (vsep (map (pprintPTerm ppOpts {ppopt_impl = True}+             iRenderResult (vsep (map (pprintPTerm ppOpts                                                     []                                                    []                                                    (idris_infixes i))
src/Idris/REPL/Browse.hs view
@@ -10,17 +10,16 @@  module Idris.REPL.Browse (namespacesInNS, namesInNS) where -import Control.Monad (filterM)+import Idris.AbsSyntax (getContext)+import Idris.AbsSyntaxTree (Idris)+import Idris.Core.Evaluate (Accessibility(Hidden, Private), ctxtAlist,+                            lookupDefAccExact)+import Idris.Core.TT (Name(..)) +import Control.Monad (filterM) import Data.List (isSuffixOf, nub) import Data.Maybe (mapMaybe) import qualified Data.Text as T (unpack)--import Idris.Core.Evaluate (ctxtAlist, Accessibility(Private, Hidden), lookupDefAccExact)-import Idris.Core.TT (Name(..))--import Idris.AbsSyntaxTree (Idris)-import Idris.AbsSyntax (getContext)  -- | Find the sub-namespaces of a given namespace. The components -- should be in display order rather than the order that they are in
src/Idris/REPL/Commands.hs view
@@ -1,8 +1,8 @@ module Idris.REPL.Commands where -import Idris.Core.TT-import Idris.Colours import Idris.AbsSyntaxTree+import Idris.Colours+import Idris.Core.TT  -- | REPL commands data Command = Quit
src/Idris/REPL/Parser.hs view
@@ -11,31 +11,27 @@   , setOptions   ) where -import System.FilePath ((</>))-import System.Console.ANSI (Color(..))--import Idris.Colours import Idris.AbsSyntax+import Idris.Colours import Idris.Core.TT import Idris.Help import qualified Idris.Parser as P- import Idris.REPL.Commands  import Control.Applicative import Control.Monad.State.Strict-+import qualified Data.ByteString.UTF8 as UTF8+import Data.Char (isSpace, toLower)+import Data.List+import Data.List.Split (splitOn)+import Debug.Trace+import System.Console.ANSI (Color(..))+import System.FilePath ((</>))+import Text.Parser.Char (anyChar, oneOf) import Text.Parser.Combinators-import Text.Parser.Char(anyChar,oneOf)-import Text.Trifecta(Result, parseString)+import Text.Trifecta (Result, parseString) import Text.Trifecta.Delta -import Debug.Trace-import Data.List-import Data.List.Split(splitOn)-import Data.Char(isSpace, toLower)-import qualified Data.ByteString.UTF8 as UTF8- parseCmd :: IState -> String -> String -> Result (Either String Command) parseCmd i inputname = P.runparser pCmd i inputname . trim     where trim = f . f@@ -214,8 +210,8 @@ noArgs :: Command -> String -> P.IdrisParser (Either String Command) noArgs cmd name = do     let emptyArgs = do-        eof-        return (Right cmd)+          eof+          return (Right cmd)      let failure = return (Left $ ":" ++ name ++ " takes no arguments") @@ -229,17 +225,17 @@ exprArg :: (PTerm -> Command) -> String -> P.IdrisParser (Either String Command) exprArg cmd name = do     let noArg = do-        eof-        return $ Left ("Usage is :" ++ name ++ " <expression>")+          eof+          return $ Left ("Usage is :" ++ name ++ " <expression>")      let justOperator = do-        (op, fc) <- P.operatorFC-        eof-        return $ Right $ cmd (PRef fc [] (sUN op))+          (op, fc) <- P.operatorFC+          eof+          return $ Right $ cmd (PRef fc [] (sUN op))      let properArg = do-        t <- P.fullExpr defaultSyntax-        return $ Right (cmd t)+          t <- P.fullExpr defaultSyntax+          return $ Right (cmd t)     try noArg <|> try justOperator <|> properArg  @@ -279,10 +275,10 @@             return $ Left ("Usage is :" ++ name ++ " <option>")      let oneArg = do-        o <- pOption-        P.whiteSpace-        eof-        return (Right (cmd o))+          o <- pOption+          P.whiteSpace+          eof+          return (Right (cmd o))      let failure = return $ Left "Unrecognized setting" @@ -304,14 +300,14 @@ cmd_doc :: String -> P.IdrisParser (Either String Command) cmd_doc name = do     let constant = do-        c <- fmap fst P.constant-        eof-        return $ Right (DocStr (Right c) FullDocs)+          c <- fmap fst P.constant+          eof+          return $ Right (DocStr (Right c) FullDocs)      let pType = do-        P.reserved "Type"-        eof-        return $ Right (DocStr (Left $ P.mkName ("Type", "")) FullDocs)+          P.reserved "Type"+          eof+          return $ Right (DocStr (Left $ P.mkName ("Type", "")) FullDocs)      let fnName = fnNameArg (\n -> DocStr (Left n) FullDocs) name @@ -380,17 +376,17 @@             bytecodeCodegen <|> viaCodegen      let hasOneArg = do-        i <- get-        f <- fst <$> P.identifier-        eof-        return $ Right (Compile defaultCodegen f)+          i <- get+          f <- fst <$> P.identifier+          eof+          return $ Right (Compile defaultCodegen f)      let hasTwoArgs = do-        i <- get-        codegen <- codegenOption-        f <- fst <$> P.identifier-        eof-        return $ Right (Compile codegen f)+          i <- get+          codegen <- codegenOption+          f <- fst <$> P.identifier+          eof+          return $ Right (Compile codegen f)      let failure = return $ Left $ "Usage is :" ++ name ++ " [<codegen>] <filename>"     try hasTwoArgs <|> try hasOneArg <|> failure
src/Idris/Reflection.hs view
@@ -6,31 +6,31 @@ Maintainer  : The Idris Community. -} -{-# LANGUAGE PatternGuards, CPP #-}+{-# LANGUAGE CPP, PatternGuards #-} {-# OPTIONS_GHC -fwarn-incomplete-patterns -fwarn-unused-imports #-} module Idris.Reflection where -#if __GLASGOW_HASKELL__ < 710-import Control.Applicative ((<$>), (<*>), pure)-import Prelude hiding (mapM)-import Data.Traversable (mapM)-#endif-import Control.Monad (liftM, liftM2, liftM4)-import Control.Monad.State.Strict (lift)-import Data.Maybe (catMaybes)-import Data.List ((\\), findIndex)-import qualified Data.Text as T- import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator,                              movelast, runElab, solve)-import Idris.Core.Evaluate (Def(TyDecl), initContext, lookupDefExact, lookupTyExact)+import Idris.Core.Evaluate (Def(TyDecl), initContext, lookupDefExact,+                            lookupTyExact) import Idris.Core.TT -import Idris.AbsSyntaxTree (ArgOpt(..),ElabD, IState(tt_ctxt, idris_implicits,idris_datatypes, idris_patdefs),-                            PArg'(..), PArg, PTactic, PTactic'(..), PTerm(..), Fixity (..),+import Idris.AbsSyntaxTree (ArgOpt(..), ElabD, Fixity(..), IState(idris_datatypes, idris_implicits, idris_patdefs, tt_ctxt),+                            PArg, PArg'(..), PTactic, PTactic'(..), PTerm(..),                             initEState, pairCon, pairTy) import Idris.Delaborate (delab) +#if __GLASGOW_HASKELL__ < 710+import Control.Applicative (pure, (<$>), (<*>))+import Data.Traversable (mapM)+import Prelude hiding (mapM)+#endif+import Control.Monad (liftM, liftM2, liftM4)+import Control.Monad.State.Strict (lift)+import Data.List (findIndex, (\\))+import Data.Maybe (catMaybes)+import qualified Data.Text as T  data RErasure = RErased | RNotErased deriving Show @@ -491,6 +491,9 @@ reflectTTQuotePattern unq Impossible   = lift . tfail . InternalMsg $       "Phase error! The Impossible constructor is for optimization only and should not have been reflected during elaboration."+reflectTTQuotePattern unq (Inferred t)+  = lift . tfail . InternalMsg $+      "Phase error! The Inferred constructor is for coverage checking only and should not have been reflected during elaboration." reflectTTQuotePattern unq (TType exp)   = do ue <- getNameFrom (sMN 0 "uexp")        claim ue (Var (sNS (sUN "TTUExp") ["Reflection", "Language"]))@@ -654,6 +657,8 @@ reflectTTQuote unq Erased = Var (reflm "Erased") reflectTTQuote _   Impossible =   error "Phase error! The Impossible constructor is for optimization only and should not have been reflected during elaboration."+reflectTTQuote _   (Inferred tm) =+  error "Phase error! The Inferred constructor is for coverage checking only and should not have been reflected during elaboration."  reflectRawQuote :: [Name] -> Raw -> Raw reflectRawQuote unq (Var n)
+ src/Idris/Termination.hs view
@@ -0,0 +1,649 @@+{-|+Module      : Idris.Termination+Description : The termination checker for Idris+Copyright   :+License     : BSD3+Maintainer  : The Idris Community.+-}+{-# LANGUAGE PatternGuards #-}+module Idris.Termination where++import Idris.AbsSyntax+import Idris.Core.CaseTree+import Idris.Core.Evaluate+import Idris.Core.TT+import Idris.Delaborate+import Idris.Error+import Idris.Output (iWarn, iputStrLn)++import Control.Monad.State.Strict+import Data.Char+import Data.Either+import Data.List+import Data.Maybe+import Debug.Trace++-- | Check whether function and all descendants cover all cases+-- (partial is okay, as long as it's due to recursion)+checkAllCovering :: FC -> [Name] -> Name -> Name -> Idris ()+checkAllCovering fc done top n | not (n `elem` done)+   = do i <- get+        case lookupTotal n (tt_ctxt i) of+             [tot@(Partial NotCovering)] ->+                    do let msg = show top ++ " is " ++ show tot ++ " due to " ++ show n+                       putIState i { idris_totcheckfail = (fc, msg) : idris_totcheckfail i }+                       addIBC (IBCTotCheckErr fc msg)+             [Partial _] ->+                case lookupCtxt n (idris_callgraph i) of+                     [cg] -> mapM_ (checkAllCovering fc (n : done) top)+                                   (calls cg)+                     _ -> return ()+             x -> return () -- stop if total+checkAllCovering _ _ _ _ = return ()++-- | Check whether all 'Inf' arguments to the name end up guaranteed to be+-- guarded by constructors (conservatively... maybe this can do better later).+-- Essentially, all it does is check that every branch is a constructor application+-- with no other function applications.+--+-- If so, set the 'AllGuarded' flag which can be used by the productivity check+checkIfGuarded :: Name -> Idris ()+checkIfGuarded n +   = do i <- get+        let ctxt = tt_ctxt i+        case lookupDefExact n ctxt of+             Just (CaseOp _ ty _ _ _ cases) ->+                  let gnames = fst (cases_compiletime cases) in+                      if allGuarded gnames i (snd (cases_compiletime cases))+                         then -- trace (show (n, gnames, ty, cases_compiletime cases)) $+                              addFnOpt n AllGuarded+                         else return ()+             _ -> return ()+  where+    guard n ist = isConName n (tt_ctxt ist) || guardFlag n ist+    guardFlag n ist = case lookupCtxtExact n (idris_flags ist) of+                           Nothing -> False+                           Just fs -> AllGuarded `elem` fs++    -- Top level thing always needs to be a constructor application if +    -- the delayed things are going to be definitely guarded by this definition+    allGuarded names i (STerm t) +          | (P _ fn _, args) <- unApply t,+            guard fn i+            = and (map (guardedTerm names i) args)+          | otherwise = False+    allGuarded names i (ProjCase _ alts) = and (map (guardedAlt names i) alts)+    allGuarded names i (Case _ _ alts) = and (map (guardedAlt names i) alts)+    allGuarded names i _ = True++    guardedTerm names i (P _ v _) = v `elem` names || guard v i+    guardedTerm names i (Bind n (Let t v) sc)+          = guardedTerm names i v && guardedTerm names i sc+    guardedTerm names i (Bind n b sc) = False+    guardedTerm names i ap@(App _ _ _)+          | (P _ fn _, args) <- unApply ap,+            guard fn i || fn `elem` names+                = and (map (guardedTerm names i) args)+    guardedTerm names i (App _ f a) = False+    guardedTerm names i tm = True+    +    guardedAlt names i (ConCase _ _ _ t) = allGuarded names i t+    guardedAlt names i (FnCase _ _ t) = allGuarded names i t+    guardedAlt names i (ConstCase _ t) = allGuarded names i t+    guardedAlt names i (SucCase _ t) = allGuarded names i t+    guardedAlt names i (DefaultCase t) = allGuarded names i t++-- | Check if, in a given group of type declarations mut_ns, the+-- constructor cn : ty is strictly positive, and update the context+-- accordingly+checkPositive :: [Name]       -- ^ the group of type declarations+              -> (Name, Type) -- ^ the constructor+              -> Idris Totality+checkPositive mut_ns (cn, ty')+    = do i <- getIState+         let ty = delazy' True (normalise (tt_ctxt i) [] ty')+         let p = cp i ty+         let tot = if p then Total (args ty) else Partial NotPositive+         let ctxt' = setTotal cn tot (tt_ctxt i)+         putIState (i { tt_ctxt = ctxt' })+         logCoverage 5 $ "Constructor " ++ show cn ++ " is " ++ show tot ++ " with " ++ show mut_ns+         addIBC (IBCTotal cn tot)+         return tot+  where+    args t = [0..length (getArgTys t)-1]++    cp i (Bind n (Pi _ aty _) sc)+         = posArg i aty && cp i sc+    cp i t | (P _ n' _ , args) <- unApply t,+             n' `elem` mut_ns = all noRec args+    cp i _ = True++    posArg ist (Bind _ (Pi _ nty _) sc) = noRec nty && posArg ist sc+    posArg ist t = posParams ist t++    noRec arg = all (\x -> x `notElem` mut_ns) (allTTNames arg)++    -- If the type appears recursively in a parameter argument, that's+    -- fine, otherwise if it appears in an argument it's not fine.+    posParams ist t | (P _ n _, args) <- unApply t+       = case lookupCtxtExact n (idris_datatypes ist) of+              Just ti -> checkParamsOK (param_pos ti) 0 args+              Nothing -> and (map (posParams ist) args)+    posParams ist t = noRec t++    checkParamsOK ppos i [] = True+    checkParamsOK ppos i (p : ps)+          | i `elem` ppos = checkParamsOK ppos (i + 1) ps+          | otherwise = noRec p && checkParamsOK ppos (i + 1) ps++-- | Calculate the totality of a function from its patterns.  Either+-- follow the size change graph (if inductive) or check for+-- productivity (if coinductive)+calcTotality :: FC -> Name -> [([Name], Term, Term)] -> Idris Totality+calcTotality fc n pats+    = do i <- getIState+         let opts = case lookupCtxt n (idris_flags i) of+                            [fs] -> fs+                            _ -> []+         case mapMaybe (checkLHS i) (map (\ (_, l, r) -> l) pats) of+            (failure : _) -> return failure+            _ -> checkSizeChange n+  where+    checkLHS i (P _ fn _)+        = case lookupTotalExact fn (tt_ctxt i) of+               Just (Partial _) -> return (Partial (Other [fn]))+               _ -> Nothing+    checkLHS i (App _ f a) = mplus (checkLHS i f) (checkLHS i a)+    checkLHS _ _ = Nothing++checkTotality :: [Name] -> FC -> Name -> Idris Totality+checkTotality path fc n+    | n `elem` path = return (Partial (Mutual (n : path)))+    | otherwise = do+        t <- getTotality n+        i <- getIState+        ctxt' <- do ctxt <- getContext+                    tclift $ simplifyCasedef n (getErasureInfo i) ctxt+        setContext ctxt'+        ctxt <- getContext+        i <- getIState+        let opts = case lookupCtxt n (idris_flags i) of+                            [fs] -> fs+                            _ -> []+        t' <- case t of+                Unchecked ->+                    case lookupDef n ctxt of+                        [CaseOp _ _ _ _ pats _] ->+                            do t' <- if AssertTotal `elem` opts+                                        then return $ Total []+                                        else calcTotality fc n pats+                               logCoverage 2 $ "Set to " ++ show t'+                               setTotality n t'+                               addIBC (IBCTotal n t')+                               return t'+                        [TyDecl (DCon _ _ _) ty] ->+                            case unApply (getRetTy ty) of+                              (P _ tyn _, _) -> do+                                 let ms = case lookupCtxt tyn (idris_datatypes i) of+                                       [TI _ _ _ _ xs@(_:_)] -> xs+                                       ts -> [tyn]+                                 checkPositive ms (n, ty)+                              _-> return $ Total []+                        _ -> return $ Total []+                x -> return x+        case t' of+            Total _ -> return t'+            Productive -> return t'+            e -> do w <- cmdOptType WarnPartial+                    if TotalFn `elem` opts+                       then do totalityError t'; return t'+                       else do when (w && not (PartialFn `elem` opts)) $+                                   warnPartial n t'+                               return t'+  where+    totalityError t = do i <- getIState+                         let msg = show n ++ " is " ++ show t+                         putIState i { idris_totcheckfail = (fc, msg) : idris_totcheckfail i}+                         addIBC (IBCTotCheckErr fc msg)++    warnPartial n t+       = do i <- getIState+            case lookupDef n (tt_ctxt i) of+               [x] -> do+                  iWarn fc . pprintErr i . Msg $ "Warning - " ++ show n ++ " is " ++ show t+--                                ++ "\n" ++ show x+--                   let cg = lookupCtxtName Nothing n (idris_callgraph i)+--                   iputStrLn (show cg)+++checkDeclTotality :: (FC, Name) -> Idris Totality+checkDeclTotality (fc, n)+    = do logCoverage 2 $ "Checking " ++ show n ++ " for totality"+         i <- getIState+         let opts = case lookupCtxtExact n (idris_flags i) of+                              Just fs -> fs+                              _ -> []+         when (CoveringFn `elem` opts) $ checkAllCovering fc [] n n+         t <- checkTotality [] fc n+         return t++-- If the name calls something which is partial, set it as partial+verifyTotality :: (FC, Name) -> Idris ()+verifyTotality (fc, n)+    = do logCoverage 2 $ "Checking " ++ show n ++ "'s descendents are total"+         ist <- getIState+         case lookupTotalExact n (tt_ctxt ist) of+              Just (Total _) -> do+                 let ns = getNames (tt_ctxt ist)++                 case getPartial ist [] ns of+                      Nothing -> return ()+                      Just bad -> do let t' = Partial (Other bad)+                                     logCoverage 2 $ "Set to " ++ show t'+                                     setTotality n t'+                                     addIBC (IBCTotal n t')+              _ -> return ()+  where+    getNames ctxt = case lookupDefExact n ctxt of+                         Just (CaseOp  _ _ _ _ _ defs)+                           -> let (top, def) = cases_compiletime defs in+                                  map fst (findCalls' True def top)+                         _ -> []++    getPartial ist [] [] = Nothing+    getPartial ist bad [] = Just bad+    getPartial ist bad (n : ns)+        = case lookupTotalExact n (tt_ctxt ist) of+               Just (Partial _) -> getPartial ist (n : bad) ns+               _ -> getPartial ist bad ns++-- | Calculate the size change graph for this definition+--+-- SCG for a function f consists of a list of:+--    (g, [(a1, sizechange1), (a2, sizechange2), ..., (an, sizechangen)])+--+-- where g is a function called+-- a1 ... an are the arguments of f in positions 1..n of g+-- sizechange1 ... sizechange2 is how their size has changed wrt the input+-- to f+--    Nothing, if the argument is unrelated to the input+buildSCG :: (FC, Name) -> Idris ()+buildSCG (_, n) = do+   ist <- getIState+   case lookupCtxt n (idris_callgraph ist) of+       [cg] -> case lookupDefExact n (tt_ctxt ist) of+           Just (CaseOp _ _ _ pats _ cd) ->+             let (args, sc) = cases_compiletime cd in+               do logCoverage 2 $ "Building SCG for " ++ show n ++ " from\n"+                                ++ show pats ++ "\n" ++ show sc+                  let newscg = buildSCG' ist n (rights pats) args+                  logCoverage 5 $ "SCG is: " ++ show newscg+                  addToCG n ( cg { scg = newscg } )+           _ -> return () -- CG comes from a type declaration only+       [] -> logCoverage 5 $ "Could not build SCG for " ++ show n ++ "\n"+       x -> error $ "buildSCG: " ++ show (n, x)++delazy = delazy' False -- not lazy codata+delazy' all t@(App _ f a)+     | (P _ (UN l) _, [_, _, arg]) <- unApply t,+       l == txt "Force" = delazy' all arg+     | (P _ (UN l) _, [P _ (UN lty) _, _, arg]) <- unApply t,+       l == txt "Delay" && (all || lty /= txt "Infinite") = delazy arg+     | (P _ (UN l) _, [P _ (UN lty) _, arg]) <- unApply t,+       l == txt "Delayed" && (all || lty /= txt "Infinite") = delazy' all arg+delazy' all (App s f a) = App s (delazy' all f) (delazy' all a)+delazy' all (Bind n b sc) = Bind n (fmap (delazy' all) b) (delazy' all sc)+delazy' all t = t++data Guardedness = Toplevel | Unguarded | Guarded | Delayed+  deriving Show++buildSCG' :: IState -> Name -> [(Term, Term)] -> [Name] -> [SCGEntry]+buildSCG' ist topfn pats args = nub $ concatMap scgPat pats where+  scgPat (lhs, rhs) = let lhs' = delazy lhs+                          rhs' = delazy rhs+                          (f, pargs) = unApply (dePat lhs') in+                            findCalls [] Toplevel (dePat rhs') (patvars lhs')+                                      (zip pargs [0..])++  -- Under a delay, calls are excluded from the graph - if it's a call to a+  -- non-total function we'll find that in the final totality check+  findCalls cases Delayed ap@(P _ n _) pvs args = []+  findCalls cases guarded ap@(App _ f a) pvs pargs+     -- under a call to "assert_total", don't do any checking, just believe+     -- that it is total.+     | (P _ (UN at) _, [_, _]) <- unApply ap,+       at == txt "assert_total" = []+     -- don't go under calls to functions which are asserted total+     | (P _ n _, _) <- unApply ap,+       Just opts <- lookupCtxtExact n (idris_flags ist),+       AssertTotal `elem` opts = []+     -- under a guarded call to "Delay Infinite", we are 'Delayed', so don't+     -- check under guarded constructors.+     | (P _ (UN del) _, [_,_,arg]) <- unApply ap,+       Guarded <- guarded,+       del == txt "Delay"+           = findCalls cases Delayed arg pvs pargs+     | (P _ n _, args) <- unApply ap,+       Delayed <- guarded,+       isConName n (tt_ctxt ist) || allGuarded n ist+           = -- Still under a 'Delay' and constructor guarded, so check+             -- just the arguments to the constructor, remaining Delayed+             concatMap (\x -> findCalls cases guarded x pvs pargs) args+     | (P _ ifthenelse _, [_, _, t, e]) <- unApply ap,+       ifthenelse == sNS (sUN "ifThenElse") ["Bool", "Prelude"]+       -- Continue look inside if...then...else blocks+       -- TODO: Consider whether we should do this for user defined ifThenElse+       -- rather than just the one in the Prelude as a special case+       = findCalls cases guarded t pvs pargs +++         findCalls cases guarded e pvs pargs+     | (P _ n _, args) <- unApply ap,+       caseName n && n /= topfn,+       notPartial (lookupTotalExact n (tt_ctxt ist))+       -- case block - look inside the block, as long as it was covering+       -- (i.e. not currently set at Partial) to get a more accurate size+       -- change result from the top level patterns (also to help pass+       -- information through from guarded corecursion accurately)+       = concatMap (\x -> findCalls cases Unguarded x pvs pargs) args +++             if n `notElem` cases+                then findCallsCase (n : cases) guarded n args pvs pargs+                else []+     | (P _ n _, args) <- unApply ap,+       Delayed <- guarded+       -- Under a delayed recursive call just check the arguments+           = concatMap (\x -> findCalls cases Unguarded x pvs pargs) args+     | (P _ n _, args) <- unApply ap+        -- Ordinary call, not under a delay.+        -- If n is a constructor, set 'args' as Guarded+        = let nguarded = case guarded of+                              Unguarded -> Unguarded+                              x -> if isConName n (tt_ctxt ist)+                                       || allGuarded n ist+                                      then Guarded+                                      else Unguarded in+              mkChange n args pargs +++                 concatMap (\x -> findCalls cases nguarded x pvs pargs) args+    where notPartial (Just (Partial NotCovering)) = False+          notPartial _ = True+  findCalls cases guarded (App _ f a) pvs pargs+        = findCalls cases Unguarded f pvs pargs ++ findCalls cases Unguarded a pvs pargs+  findCalls cases guarded (Bind n (Let t v) e) pvs pargs+        = findCalls cases Unguarded t pvs pargs +++          findCalls cases Unguarded v pvs pargs ++ +          -- Substitute in the scope since this might reveal some useful+          -- structure+          findCalls cases guarded (substV v e) pvs pargs+  findCalls cases guarded (Bind n t e) pvs pargs+        = findCalls cases Unguarded (binderTy t) pvs pargs +++          findCalls cases guarded e (n : pvs) pargs+  findCalls cases guarded (P _ f _ ) pvs pargs+      | not (f `elem` pvs) = [(f, [])]+  findCalls _ _ _ _ _ = []++  -- Assumption is that names are preserved in the case block (shadowing+  -- dealt with by the elaborator) so we can just assume the top level names+  -- are okay for building the size change+  findCallsCase cases guarded n args pvs pargs+      = case lookupDefExact n (tt_ctxt ist) of+           Just (CaseOp _ _ _ pats _ cd) ->+                concatMap (fccPat cases pvs pargs args guarded) (rights pats)+           Nothing -> []++  fccPat cases pvs pargs args g (lhs, rhs)+      = let lhs' = delazy lhs+            rhs' = delazy rhs+            (f, pargs_case) = unApply (dePat lhs')+            -- pargs is a pair of a term, and the argument position that+            -- term appears in. If any of the arguments to the case block+            -- are also on the lhs, we also want those patterns to appear+            -- in the parg list so that we'll spot patterns which are+            -- smaller than then+            newpargs = newPArg args pargs+            -- Now need to update the rhs of the case with the names in the+            -- outer definition: In rhs', wherever we see what's in pargs_case,+            -- replace it with the corresponding thing in pargs+            csubs = zip pargs_case args+            newrhs = doCaseSubs csubs (dePat rhs')+            pargs' = pargs ++ addPArg newpargs pargs_case in+               findCalls cases g newrhs pvs pargs'+    where+      doCaseSubs [] tm = tm+      doCaseSubs ((x, x') : cs) tm+           = doCaseSubs (subIn x x' cs) (substTerm x x' tm)++      subIn x x' [] = []+      subIn x x' ((l, r) : cs)+          = (substTerm x x' l, substTerm x x' r) : subIn x x' cs++  addPArg (Just (t, i) : ts) (t' : ts') = (t', i) : addPArg ts ts'+  addPArg (Nothing : ts) (t' : ts') = addPArg ts ts'+  addPArg _ _ = []++  newPArg :: [Term] -> [(Term, Int)] -> [Maybe (Term, Int)]+  newPArg (t : ts) pargs = case lookup t pargs of+                                Just i -> Just (t, i) : newPArg ts pargs+                                Nothing -> Nothing : newPArg ts pargs+  newPArg [] pargs = []++  expandToArity n args+     = case lookupTy n (tt_ctxt ist) of+            [ty] -> expand 0 (normalise (tt_ctxt ist) [] ty) args+            _ -> args+     where expand i (Bind n (Pi _ _ _) sc) (x : xs) = x : expand (i + 1) sc xs+           expand i (Bind n (Pi _ _ _) sc) [] = Just (i, Same) : expand (i + 1) sc []+           expand i _ xs = xs++  mkChange n args pargs = [(n, expandToArity n (sizes args))]+    where+      sizes [] = []+      sizes (a : as) = checkSize a pargs : sizes as++      -- find which argument in pargs <a> is smaller than, if any+      checkSize a ((p, i) : ps)+          | a == p = Just (i, Same)+          | (P _ (UN as) _, [_,_,arg,_]) <- unApply a,+            as == txt "assert_smaller" && arg == p+                  = Just (i, Smaller)+          | smaller Nothing a (p, Nothing) = Just (i, Smaller)+          | otherwise = checkSize a ps+      checkSize a [] = Nothing++      -- the smaller thing we find must be defined in the same group of mutally+      -- defined types as <a>, and not be coinductive - so carry the type of+      -- the constructor we've gone under.++      smaller (Just tyn) a (t, Just tyt)+         | a == t = isInductive (fst (unApply (getRetTy tyn)))+                                (fst (unApply (getRetTy tyt)))+      smaller ty a (ap@(App _ f s), _)+          | (P (DCon _ _ _) n _, args) <- unApply ap+               = let tyn = getType n in+                     any (smaller (ty `mplus` Just tyn) a)+                         (zip args (map toJust (getArgTys tyn)))+      -- check higher order recursive arguments+      smaller ty (App _ f s) a = smaller ty f a+      smaller _ _ _ = False++      toJust (n, t) = Just t++      getType n = case lookupTyExact n (tt_ctxt ist) of+                       Just ty -> delazy (normalise (tt_ctxt ist) [] ty) -- must exist++      isInductive (P _ nty _) (P _ nty' _) =+          let (co, muts) = case lookupCtxt nty (idris_datatypes ist) of+                                [TI _ x _ _ muts] -> (x, muts)+                                _ -> (False, []) in+              (nty == nty' || any (== nty') muts) && not co+      isInductive _ _ = False++  dePat (Bind x (PVar ty) sc) = dePat (instantiate (P Bound x ty) sc)+  dePat t = t++  patvars (Bind x (PVar _) sc) = x : patvars sc+  patvars _ = []++  allGuarded n ist = case lookupCtxtExact n (idris_flags ist) of+                          Nothing -> False+                          Just fs -> AllGuarded `elem` fs++checkSizeChange :: Name -> Idris Totality+checkSizeChange n = do+   ist <- getIState+   case lookupCtxt n (idris_callgraph ist) of+       [cg] -> do let ms = mkMultiPaths ist [] (scg cg)+                  logCoverage 5 ("Multipath for " ++ show n ++ ":\n" +++                            "from " ++ show (scg cg) ++ "\n" +++                            show (length ms) ++ "\n" +++                            showSep "\n" (map show ms))+                  logCoverage 6 (show cg)+                  -- every multipath must have an infinitely descending+                  -- thread, then the function terminates+                  -- also need to checks functions called are all total+                  -- (Unchecked is okay as we'll spot problems here)+                  let tot = map (checkMP ist n (getArity ist n)) ms+                  logCoverage 4 $ "Generated " ++ show (length tot) ++ " paths"+                  logCoverage 5 $ "Paths for " ++ show n ++ " yield " +++                       (showSep "\n" (map show (zip ms tot)))+                  return (noPartial tot)+       [] -> do logCoverage 5 $ "No paths for " ++ show n+                return Unchecked+  where getArity ist n+          = case lookupTy n (tt_ctxt ist) of+                 [ty] -> arity (normalise (tt_ctxt ist) [] ty)+                 _ -> error "Can't happen: checkSizeChange.getArity"++type MultiPath = [SCGEntry]++mkMultiPaths :: IState -> MultiPath -> [SCGEntry] -> [MultiPath]+mkMultiPaths ist path [] = [reverse path]+mkMultiPaths ist path cg = concatMap extend cg+  where extend (nextf, args)+           | (nextf, args) `inPath` path = [ reverse ((nextf, args) : path) ]+           | [Unchecked] <- lookupTotal nextf (tt_ctxt ist)+               = case lookupCtxt nextf (idris_callgraph ist) of+                    [ncg] -> mkMultiPaths ist ((nextf, args) : path) (scg ncg)+                    _ -> [ reverse ((nextf, args) : path) ]+           | otherwise = [ reverse ((nextf, args) : path) ]++        inPath :: SCGEntry -> [SCGEntry] -> Bool+        inPath f [] = False+        inPath f (g : gs) = smallerEq f g || f == g || inPath f gs++        smallerEq :: SCGEntry -> SCGEntry -> Bool+        smallerEq (f, args) (g, args')+            = f == g && not (null (filter smallers args))+                     && filter smallers args == filter smallers args'+        smallers (Just (_, Smaller)) = True+        smallers _ = False++-- If any route along the multipath leads to infinite descent, we're fine.+-- Try a route beginning with every argument.+--   If we reach a point we've been to before, but with a smaller value,+--   that means there is an infinitely descending path from that argument.++checkMP :: IState -> Name -> Int -> MultiPath -> Totality+checkMP ist topfn i mp = if i > 0+                     then let paths = (map (tryPath 0 [] mp) [0..i-1]) in+--                               trace ("Paths " ++ show paths) $+                               collapse paths+                     else tryPath 0 [] mp 0+  where+    tryPath' d path mp arg+           = let res = tryPath d path mp arg in+                 trace (show mp ++ "\n" ++ show arg ++ " " ++ show res) res++    mkBig (e, d) = (e, 10000)++    tryPath :: Int -> [((SCGEntry, Int), Int)] -> MultiPath -> Int -> Totality+    tryPath desc path [] _ = Total []+--     tryPath desc path ((UN "believe_me", _) : _) arg+--             = Partial BelieveMe+    -- if we get to a constructor, it's fine as long as it's strictly positive+    tryPath desc path ((f, _) : es) arg+        | [TyDecl (DCon _ _ _) _] <- lookupDef f (tt_ctxt ist)+            = case lookupTotalExact f (tt_ctxt ist) of+                   Just (Total _) -> Unchecked -- okay so far+                   Just (Partial _) -> Partial (Other [f])+                   x -> Unchecked -- An error elsewhere, set as Unchecked to make+                                  -- some progress+        | [TyDecl (TCon _ _) _] <- lookupDef f (tt_ctxt ist)+            = Total []+    tryPath desc path (e@(f, args) : es) arg+        | [Total a] <- lookupTotal f (tt_ctxt ist) = Total a+        | e `elem` es && allNothing args = Partial (Mutual [f])+    tryPath desc path (e@(f, nextargs) : es) arg+        | [Total a] <- lookupTotal f (tt_ctxt ist) = Total a+        | [Partial _] <- lookupTotal f (tt_ctxt ist) = Partial (Other [f])+        | Just d <- lookup (e, arg) path+            = if desc - d > 0 -- Now lower than when we were last here+                   then -- trace ("Descent " ++ show (desc - d) ++ " "+                        --      ++ show (path, e)) $+                        Total []+                   else Partial (Mutual (map (fst . fst . fst) path ++ [f]))+        | e `elem` map (fst . fst) path+           && not (f `elem` map fst es)+              = Partial (Mutual (map (fst . fst . fst) path ++ [f]))+        | [Unchecked] <- lookupTotal f (tt_ctxt ist) =+            let argspos = zip nextargs [0..]+                pathres =+                  do (a, pos) <- argspos+                     case a of+                        Nothing -> -- gone up, but if the+                                   -- rest definitely terminates without any+                                   -- cycles (including the path so far, which+                                   -- we take as inaccessible) the path is fine+                            return $ tryPath 0 (map mkBig (((e, arg), desc) : path)) es pos+                        Just (nextarg, sc) ->+                          if nextarg == arg then+                            case sc of+                              Same -> return $ tryPath desc (((e, arg), desc) : path)+                                                       es pos+                              Smaller -> return $ tryPath (desc+1)+                                                          (((e, arg), desc) : path)+                                                          es+                                                          pos+                              _ -> trace ("Shouldn't happen " ++ show e) $+                                      return (Partial Itself)+                            else return Unchecked in+--                   trace (show (desc, argspos, path, es, pathres)) $+                   collapse pathres++        | otherwise = Unchecked++allNothing :: [Maybe a] -> Bool+allNothing xs = null (collapseNothing (zip xs [0..]))++collapseNothing :: [(Maybe a, b)] -> [(Maybe a, b)]+collapseNothing ((Nothing, t) : xs)+   = (Nothing, t) : filter (\ (x, _) -> case x of+                                             Nothing -> False+                                             _ -> True) xs+collapseNothing (x : xs) = x : collapseNothing xs+collapseNothing [] = []++noPartial :: [Totality] -> Totality+noPartial (Partial p : xs) = Partial p+noPartial (_ : xs)         = noPartial xs+noPartial []               = Total []++collapse :: [Totality] -> Totality+collapse xs = collapse' Unchecked xs+collapse' def (Total r : xs)   = Total r+collapse' def (Unchecked : xs) = collapse' def xs+collapse' def (d : xs)         = collapse' d xs+-- collapse' Unchecked []         = Total []+collapse' def []               = def++totalityCheckBlock :: Idris ()+totalityCheckBlock = do+         ist <- getIState+         -- Do totality checking after entire mutual block+         mapM_ (\n -> do logElab 5 $ "Simplifying " ++ show n+                         ctxt' <- do ctxt <- getContext+                                     tclift $ simplifyCasedef n (getErasureInfo ist) ctxt+                         setContext ctxt')+                 (map snd (idris_totcheck ist))+         mapM_ buildSCG (idris_totcheck ist)+         mapM_ checkDeclTotality (idris_totcheck ist)+         clear_totcheck+
src/Idris/TypeSearch.hs view
@@ -13,38 +13,41 @@   , defaultScoreFunction   ) where -import Control.Applicative (Applicative (..), (<$>), (<*>), (<|>))-import Control.Arrow       (first, second, (&&&), (***))-import Control.Monad       (when, guard)--import           Data.List   (find, partition, (\\))-import           Data.Map    (Map)-import qualified Data.Map    as M-import           Data.Maybe  (catMaybes, fromMaybe, isJust, maybeToList, mapMaybe)-import           Data.Monoid (Monoid (mempty, mappend))-import           Data.Ord    (comparing)-import qualified Data.PriorityQueue.FingerTree as Q-import           Data.Set                           (Set)-import qualified Data.Set                      as S-import qualified Data.Text                     as T (pack, isPrefixOf)-import           Data.Traversable                   (traverse)--import Idris.AbsSyntax     (addUsingConstraints, addImpl, getIState, putIState, implicit, logLvl)-import Idris.AbsSyntaxTree (interface_implementations, InterfaceInfo, defaultSyntax, eqTy, Idris-                           , IState (idris_interfaces, idris_docstrings, tt_ctxt, idris_outputmode),-                           implicitAllowed, OutputMode(..), PTerm, toplevel)-import Idris.Core.Evaluate (Context (definitions), Def (Function, TyDecl, CaseOp), normaliseC)-import Idris.Core.TT       hiding (score)-import Idris.Core.Unify    (match_unify)-import Idris.Delaborate    (delabTy)-import Idris.Docstrings    (noDocs, overview)-import Idris.Elab.Type     (elabType)-import Idris.Output        (iputStrLn, iRenderOutput, iPrintResult, iRenderError, iRenderResult, prettyDocumentedIst)+import Idris.AbsSyntax (addImpl, addUsingConstraints, getIState, implicit,+                        logLvl, putIState)+import Idris.AbsSyntaxTree (IState(idris_docstrings, idris_interfaces, idris_outputmode, tt_ctxt),+                            Idris, InterfaceInfo, OutputMode(..), PTerm,+                            defaultSyntax, eqTy, implicitAllowed,+                            interface_implementations, toplevel)+import Idris.Core.Evaluate (Context(definitions), Def(CaseOp, Function, TyDecl),+                            normaliseC)+import Idris.Core.TT hiding (score)+import Idris.Core.Unify (match_unify)+import Idris.Delaborate (delabTy)+import Idris.Docstrings (noDocs, overview)+import Idris.Elab.Type (elabType) import Idris.IBC+import Idris.Output (iPrintResult, iRenderError, iRenderOutput, iRenderResult,+                     iputStrLn, prettyDocumentedIst) +import Util.Pretty (Doc, annotate, char, text, vsep, (<>))+ import Prelude hiding (pred) -import Util.Pretty (text, char, vsep, (<>), Doc, annotate)+import Control.Applicative (Applicative(..), (<$>), (<*>), (<|>))+import Control.Arrow (first, second, (&&&), (***))+import Control.Monad (guard, when)+import Data.List (find, partition, (\\))+import Data.Map (Map)+import qualified Data.Map as M+import Data.Maybe (catMaybes, fromMaybe, isJust, mapMaybe, maybeToList)+import Data.Monoid (Monoid(mappend, mempty))+import Data.Ord (comparing)+import qualified Data.PriorityQueue.FingerTree as Q+import Data.Set (Set)+import qualified Data.Set as S+import qualified Data.Text as T (isPrefixOf, pack)+import Data.Traversable (traverse)  searchByType :: [String] -> PTerm -> Idris () searchByType pkgs pterm = do
src/Idris/Unlit.hs view
@@ -8,6 +8,7 @@ module Idris.Unlit(unlit) where  import Idris.Core.TT+ import Data.Char  unlit :: FilePath -> String -> TC String@@ -18,8 +19,9 @@ data LineType = Prog | Blank | Comm  ulLine :: String -> (LineType, String)-ulLine ('>':' ':xs)        = (Prog, xs)-ulLine ('>':xs)            = (Prog, xs)+ulLine ('>':' ':xs)        = (Prog, ' ':' ':xs) -- Replace with spaces, otherwise text position numbers will be bogus.+ulLine ('>':xs)            = (Prog, ' '    :xs) -- The parser can deal with this, because /every/ (code) line is prefixed+                                                -- with a '>'. ulLine xs | all isSpace xs = (Blank, "") -- make sure it's not a doc comment           | otherwise      = (Comm, '-':'-':' ':'>':xs)@@ -28,7 +30,7 @@ check f l (a:b:cs) = do chkAdj f l (fst a) (fst b)                         check f (l+1) (b:cs) check f l [x] = return ()-check f l [] = return ()+check f l [ ] = return ()  -- Issue #1593 on the issue checker. --
src/Idris/WhoCalls.hs view
@@ -8,13 +8,11 @@ module Idris.WhoCalls (whoCalls, callsWho) where  import Idris.AbsSyntax- import Idris.Core.CaseTree import Idris.Core.Evaluate import Idris.Core.TT  import Data.List (nub)-  occurs :: Name -> Term -> Bool occurs n (P Bound _ _) = False
src/Util/DynamicLinker.hs view
@@ -5,7 +5,7 @@ License     : BSD3 Maintainer  : The Idris Community. -}-{-# LANGUAGE ExistentialQuantification, CPP, ScopedTypeVariables #-}+{-# LANGUAGE CPP, ExistentialQuantification, ScopedTypeVariables #-} module Util.DynamicLinker ( ForeignFun(..)                           , DynamicLib(..)                           , tryLoadLib@@ -14,21 +14,21 @@  #ifdef IDRIS_FFI import Foreign.LibFFI-import Foreign.Ptr (Ptr(), nullPtr, FunPtr, nullFunPtr, castPtrToFunPtr)+import Foreign.Ptr (FunPtr, Ptr(), castPtrToFunPtr, nullFunPtr, nullPtr) import System.Directory #ifndef mingw32_HOST_OS-import Control.Exception (try, IOException, throwIO)-import Data.Array (Array, inRange, bounds, (!))+import Control.Exception (IOException, throwIO, try)+import Data.Array (Array, bounds, inRange, (!)) import Data.Functor ((<$>)) import Data.Maybe (catMaybes)-import System.Posix.DynamicLinker import System.FilePath.Posix ((</>))+import System.Posix.DynamicLinker import Text.Regex.TDFA #else-import qualified Control.Exception as Exception (catch, IOException)+import qualified Control.Exception as Exception (IOException, catch)+import System.FilePath.Windows ((</>)) import System.Win32.DLL import System.Win32.Types-import System.FilePath.Windows ((</>)) type DL = HMODULE #endif 
src/Util/Net.hs view
@@ -7,10 +7,10 @@ -} module Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) where +import Control.Exception (bracketOnError) import Network hiding (socketPort)-import Network.Socket hiding (sClose) import Network.BSD (getProtocolNumber)-import Control.Exception (bracketOnError)+import Network.Socket hiding (sClose)  -- Copied from upstream impl of listenOn -- bound to localhost interface instead of iNADDR_ANY
src/Util/System.hs view
@@ -22,25 +22,20 @@ import Control.Monad (when) import qualified Data.Text as T import qualified Data.Text.IO as TIO- import Foreign.C--import System.Directory (getTemporaryDirectory-                        , removeFile-                        , removeDirectoryRecursive-                        , createDirectoryIfMissing-                        )-import System.FilePath ((</>), normalise)-import System.IO+import System.Directory (createDirectoryIfMissing, getTemporaryDirectory,+                         removeDirectoryRecursive, removeFile)+import System.FilePath (normalise, (</>)) import System.Info+import System.IO import System.IO.Error  #ifdef FREESTANDING-import Tools_idris import Data.List (intercalate)-import System.FilePath (isAbsolute, dropFileName, searchPathSeparator) import System.Directory (doesDirectoryExist)-import System.Environment (getEnv, setEnv, getExecutablePath)+import System.Environment (getEnv, getExecutablePath, setEnv)+import System.FilePath (dropFileName, isAbsolute, searchPathSeparator)+import Tools_idris #endif  catchIO :: IO a -> (IOError -> IO a) -> IO a
stack-shell.nix view
@@ -2,7 +2,7 @@  let   # MUST match resolver in stack.yaml-  resolver = haskell.packages.lts-7_0.ghc;+  resolver = haskell.packages.lts-7_10.ghc;    native_libs = [     libffi
stack.yaml view
@@ -1,4 +1,4 @@-resolver: lts-7.0+resolver: lts-7.10  packages:   - location: .@@ -10,7 +10,7 @@  extra-deps:   - libffi-0.1-+  - safe-0.3.9 nix:   enable: false   shell-file: stack-shell.nix
test/TestData.hs view
@@ -91,7 +91,8 @@       (  2, ANY  ),       (  3, ANY  ),       (  4, ANY  ),-      (  5, ANY  )]),+      (  5, ANY  ),+      (  6, ANY  )]),   ("dsl",             "DSL",     [ (  1, ANY  ),       (  2, C_CG ),@@ -239,7 +240,8 @@       ( 48, ANY  ),       ( 52, C_CG ),       ( 67, ANY  ),-      ( 75, ANY  )]),+      ( 75, ANY  ),+      ( 76, ANY  )]),   ("regression",      "Regression",     [ (  1 , ANY  ),       (  2 , ANY  )]),@@ -273,7 +275,9 @@       ( 14, ANY  ),       ( 15, ANY  ),       ( 16, ANY  ),-      ( 17, ANY  )]),+      ( 17, ANY  ),+      ( 18, ANY  ),+      ( 19, ANY  )]),   ("tutorial",        "Tutorial examples",     [ (  1, ANY  ),       (  2, ANY  ),
test/TestRun.hs view
@@ -1,27 +1,30 @@+{-# LANGUAGE CPP #-} module Main where +import TestData+ import Control.Monad import Data.Char (isLetter)-import Data.Typeable-import Data.Proxy-import Data.List import qualified Data.IntMap as IMap-+import Data.List+#if MIN_VERSION_optparse_applicative(0,13,0)+import Data.Monoid ((<>))+#endif+import Data.Proxy+import Data.Typeable+import Options.Applicative import System.Directory import System.Environment import System.Exit-import System.Process+import System.FilePath ((</>)) import System.Info import System.IO-import System.FilePath ((</>))-import Options.Applicative+import System.Process import Test.Tasty import Test.Tasty.Golden-import Test.Tasty.Runners-import Test.Tasty.Options import Test.Tasty.Ingredients.Rerun--import TestData+import Test.Tasty.Options+import Test.Tasty.Runners  --------------------------------------------------------------------- [ Config ] 
test/basic010/run view
@@ -4,7 +4,7 @@  TIMEOUT=../scripts/timeout -$TIMEOUT 10 "${IDRIS:-idris}" "$@" Main.idr --nocolour --check --warnreach -o basic010-$TIMEOUT 5  ./basic010+$TIMEOUT 20 "${IDRIS:-idris}" "$@" Main.idr --nocolour --check --warnreach -o basic010+$TIMEOUT 20  ./basic010  rm -f -- *.ibc basic010
test/basic013/basic013.idr view
@@ -36,8 +36,41 @@           printLn [(-9), (-7)..(-1)]           printLn [17,15..1]           printLn [19,15..2]+          printLn [-2,0..4]+          printLn [1,0..-2]+          printLn [3,5..3]+          printLn [2,1..2]+          printLn [4,1..3]+          printLn [1,4..2]+          printLn [3,5..1]+          printLn [4,1..5]+          printLn [1,1..2]+          printLn [2,2..1]           printLn $ the (List Nat) [1..5]           printLn $ the (List Nat) [5..1]-          printLn $ the (List Int) [(-1)..(-5)]+          printLn $ the (List Nat) [5,4..1]           printLn $ the (List Nat) [1,3..5]-+          printLn $ the (List Nat) [5,3..1]+          printLn $ the (List Nat) [3,5..3]+          printLn $ the (List Nat) [2,1..2]+          printLn $ the (List Nat) [4,1..3]+          printLn $ the (List Nat) [1,4..2]+          printLn $ the (List Nat) [3,5..1]+          printLn $ the (List Nat) [4,1..5]+          printLn $ the (List Nat) [1,1..2]+          printLn $ the (List Nat) [2,2..1]+          printLn $ the (List Int) [(-1)..(-5)]+          printLn $ the (List Int) [-2,0..4]+          printLn $ the (List Int) [1,0..-2]+          printLn $ the (List Int) [3,5..3]+          printLn $ the (List Int) [2,1..2]+          printLn $ the (List Int) [4,1..3]+          printLn $ the (List Int) [1,4..2]+          printLn $ the (List Int) [3,5..1]+          printLn $ the (List Int) [4,1..5]+          printLn $ the (List Int) [1,1..2]+          printLn $ the (List Int) [2,2..1]+          printLn ['z'..'x']+          printLn ['g','e'..'a']+          printLn ['x'..'z']+          printLn ['a','c'..'g']
test/basic013/expected view
@@ -17,7 +17,41 @@ [-9, -7, -5, -3, -1] [17, 15, 13, 11, 9, 7, 5, 3, 1] [19, 15, 11, 7, 3]+[-2, 0, 2, 4]+[1, 0, -1, -2]+[3]+[2]+[4]+[1]+[]+[]+[]+[] [1, 2, 3, 4, 5] [5, 4, 3, 2, 1]-[-1, -2, -3, -4, -5]+[5, 4, 3, 2, 1] [1, 3, 5]+[5, 3, 1]+[3]+[2]+[4]+[1]+[]+[]+[]+[]+[-1, -2, -3, -4, -5]+[-2, 0, 2, 4]+[1, 0, -1, -2]+[3]+[2]+[4]+[1]+[]+[]+[]+[]+['z', 'y', 'x']+['g', 'e', 'c', 'a']+['x', 'y', 'z']+['a', 'c', 'e', 'g']
test/basic018/expected view
@@ -8,7 +8,7 @@ Type mismatch between         42 = 42 (Type of Refl) and-        thing = 42 (Expected type)+        thing = S (fromIntegerNat 41) (Expected type)  Specifically:         Type mismatch between
test/delab001/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolor delab001.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolor delab001.idr < input rm -f *.ibc
test/docs001/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolor docs001.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolor docs001.idr < input rm *.ibc
test/docs002/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --nobanner --nocolor --quiet docs002.idr < input+${IDRIS:-idris} $@ --nobanner --nocolor --quiet --port none docs002.idr < input rm *.ibc
test/docs003/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolor docs003.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolor docs003.idr < input rm *.ibc
test/docs004/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolor docs004.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolor docs004.idr < input rm *.ibc
test/docs005/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolor docs005.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolor docs005.idr < input rm *.ibc
+ test/docs006/docs006.idr view
@@ -0,0 +1,7 @@+module docs006++||| interface+||| @ t some parameter+interface Eq t => Foo t where+  ||| member of interface+  m : t
+ test/docs006/expected view
@@ -0,0 +1,16 @@+Interface Foo+    interface++Parameters:+    t   -- some parameter++Constraints:+    Eq t++Methods:+    m : Foo t => t+        member of interface+        +        The function is Total+Implementations:+    <no implementations>
+ test/docs006/input view
@@ -0,0 +1,1 @@+:doc Foo
+ test/docs006/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ --quiet --port none --nocolor docs006.idr < input+rm *.ibc
test/dsl001/expected view
@@ -1,14 +1,14 @@ 24 12 testFac : Int-testFac = PE_interp_f79b3e31 [] (PE_fromInteger_a0377313 4)+testFac = PE_interp_f79b3e31 [] (PE_fromInteger_d6648df 4) PE_interp_f79b3e31 : Env G -> Int -> Int PE_interp_f79b3e31 (3arg) = \x =>-                              ifThenElse (PE_==_a03270d8 x-                                                         (PE_fromInteger_a0377313 0))-                                         (Delay (PE_fromInteger_a0377313 1))-                                         (Delay (PE_*_a725d5d6 (PE_interp_f79b3e31 (x ::+                              ifThenElse (PE_==_ba2f651f x+                                                         (PE_fromInteger_d6648df 0))+                                         (Delay (PE_fromInteger_d6648df 1))+                                         (Delay (PE_*_ba2f651f (PE_interp_f79b3e31 (x ::                                                                                     (3arg))-                                                                                   (PE_-_a71cf640 x-                                                                                                  (PE_fromInteger_a0377313 1)))+                                                                                   (PE_-_ba2f651f x+                                                                                                  (PE_fromInteger_d6648df 1)))                                                                x))
test/dsl001/run view
@@ -1,5 +1,5 @@ #!/usr/bin/env bash ${IDRIS:-idris} $@ test001.idr -o test001 ./test001-${IDRIS:-idris} $@ test001.idr --quiet < input+${IDRIS:-idris} $@ test001.idr --quiet --port none < input rm -f test001 test001.ibc
test/dsl001/test001.idr view
@@ -101,4 +101,3 @@             printLn test }  -
test/ffi001/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolour test022.idr --exec main+${IDRIS:-idris} $@ --quiet --port none --nocolour test022.idr --exec main rm -f *.ibc
test/ffi002/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet test023.idr -o test023+${IDRIS:-idris} $@ --quiet --port none test023.idr -o test023 rm -f test023 *.ibc
test/ffi003/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolour test024.idr --exec main < input+${IDRIS:-idris} $@ --quiet --port none --nocolour test024.idr --exec main < input rm -f *.ibc
test/ffi004/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolour --check test026.idr+${IDRIS:-idris} $@ --quiet --port none --nocolour --check test026.idr rm -f *.ibc
test/idrisdoc009/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --nocolour --quiet Test.idr < input+${IDRIS:-idris} $@ --nocolour --quiet --port none Test.idr < input rm -f *.ibc
test/interactive001/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet test032.idr < input+${IDRIS:-idris} $@ --quiet --port none test032.idr < input rm -f *.ibc
test/interactive002/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive002.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive002.idr < input rm -f *.ibc
test/interactive003/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive003.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive003.idr < input rm -f *.ibc
test/interactive004/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive004.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive004.idr < input rm -f *.ibc
test/interactive005/run view
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --nocolour --quiet interactive005.idr --consolewidth 70 < input+${IDRIS:-idris} $@ --nocolour --quiet --port none interactive005.idr --consolewidth 70 < input rm -f *.ibc rm -f hello.bytecode rm -f hello
test/interactive006/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --port 5000 interactive006.idr < input+${IDRIS:-idris} $@ --quiet --port none --port 5000 interactive006.idr < input rm -f *.ibc
test/interactive007/run view
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ -p contrib --nobanner --nocolor < input | perl -pe 's-Data\\Z-Data/Z-g'+${IDRIS:-idris} $@ -p contrib --nobanner --nocolor --port none < input | perl -pe 's-Data\\Z-Data/Z-g'
test/interactive008/run view
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --nobanner --nocolor < input+${IDRIS:-idris} $@ --nobanner --nocolor --port none < input
test/interactive009/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive009.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive009.idr < input rm -f *.ibc
test/interactive010/run view
@@ -1,2 +1,2 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nobanner --nocolor  < input+${IDRIS:-idris} $@ --quiet --port none --nobanner --nocolor  < input
test/interactive011/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive011.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive011.idr < input rm -f *.ibc
test/interactive012/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --nocolour --consolewidth 70 --quiet interactive012.idr < input+${IDRIS:-idris} $@ --nocolour --consolewidth 70 --quiet --port none interactive012.idr < input rm -f *.ibc
test/interactive013/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet interactive013.idr < input+${IDRIS:-idris} $@ --quiet --port none interactive013.idr < input rm -f *.ibc
test/interfaces001/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet --nocolour --consolewidth 70 InterfaceName.idr < input+${IDRIS:-idris} $@ --quiet --port none --nocolour --consolewidth 70 InterfaceName.idr < input rm -f *.ibc
test/interfaces002/interfaces002.idr view
@@ -1,5 +1,7 @@ import Data.Vect +%default total+   interface ArrayM where   Array : (n : Nat) -> (a : Type) -> Type   
test/layout001/run view
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -${IDRIS:-idris} --nobanner --nocolour --quiet <<!+${IDRIS:-idris} --nobanner --nocolour --quiet --port none <<! :load layout001a.idr :load layout001b.idr :load layout001c.idr
test/primitives002/run view
@@ -48,7 +48,7 @@ do     echo ${T%% *} ${T##*#}     generate_testfile "tmptest.idr" "${T%%#*}"-    ${IDRIS:-idris} $@ --quiet tmptest.idr -o tmptest || echo "missing primitive in ${CG}"+    ${IDRIS:-idris} $@ --quiet --port none tmptest.idr -o tmptest || echo "missing primitive in ${CG}"     ./tmptest <<<"${T##*#}"     rm tmptest.idr tmptest.ibc tmptest done
test/proof001/test029.idr view
@@ -12,9 +12,9 @@  -- Step case -- (S k + m = m + S k) <== plus_comm =-plus_comm (S k) m =-    rewrite ((k + m = m + k) <== plus_comm) in-    rewrite ((S (m + k) = m + S k) <== plusSuccRightSucc) in+plus_comm (S len) m =+    rewrite ((len + m = m + len) <== plus_comm) in+    rewrite ((S (m + len) = m + S len) <== plusSuccRightSucc) in         Refl -- QED @@ -29,7 +29,7 @@ simple.append_lemma_2 = proof {   intros;   compute;-  rewrite (plusSuccRightSucc m k);+  rewrite (plusSuccRightSucc m len);   trivial; } @@ -39,4 +39,3 @@   rewrite sym (plusZeroRightNeutral m);   exact value; }-
test/proof009/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --consolewidth 70 --quiet proof009.idr < input+${IDRIS:-idris} $@ --consolewidth 70 --quiet --port none proof009.idr < input rm -f *.ibc
test/quasiquote006/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --check --nocolour --quiet --consolewidth 70 quasiquote006.idr+${IDRIS:-idris} $@ --check --nocolour --quiet --port none --consolewidth 70 quasiquote006.idr rm -f *.ibc
test/reg041/run view
@@ -1,5 +1,5 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet ott.idr -e example+${IDRIS:-idris} $@ --quiet --port none ott.idr -e example ${IDRIS:-idris} $@ showu.idr -o reg040 ./reg040 rm -f reg040 *.ibc
test/reg075/run view
@@ -1,3 +1,3 @@ #!/usr/bin/env bash-${IDRIS:-idris} $@ --quiet reg075.idr < input+${IDRIS:-idris} $@ --quiet --port none reg075.idr < input rm -f *.ibc
+ test/reg076/expected view
@@ -0,0 +1,1 @@+3
+ test/reg076/input view
+ test/reg076/reg076.idr view
@@ -0,0 +1,11 @@+data Op = Add | Mul++binop : Op -> Integer -> Integer -> Integer+binop Add = (+)+binop Mul = (*)++doOp : Op -> IO Integer+doOp op = pure (binop op 1 2)++main : IO ()+main = doOp Add >>= print
+ test/reg076/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ --port none reg076.idr -o reg076+./reg076+rm -f *.ibc reg076
+ test/regression001/coverage001.idr view
@@ -0,0 +1,79 @@+module Data.AVL.Tree++%default total+%access export++data Balance : Nat -> Nat -> Type where+  LHeavy   : Balance (S n) n+  RHeavy   : Balance n     (S n)+  Balanced : Balance n     n++%name Balance b, bal+    +height : Balance n m -> Nat+height b = S (height' b)+  where+    height' : Balance n m -> Nat+    height' (LHeavy {n}) = S n+    height' (RHeavy {n}) = S n+    height' {n} (Balanced {n}) = n++public export+data Tree : (keyTy : Type) -> (valTy : Type) -> Type+  where+    ||| An empty Tree node.+    Empty : Tree k v++    Node : (key   : k)+        -> (val   : v)+        -> (left  : Tree k v)+        -> (right : Tree k v)+        -> Tree k v++%name Tree t, tree++public export+data AVLInvariant : (height : Nat)+                 -> (tree   : Tree k v)+                 -> Type+  where+    AVLEmpty : AVLInvariant 0 Empty++    AVLNode : (left  : AVLInvariant n l) -> +              (right :  AVLInvariant m r) -> +              (b : Balance n m) -> +              AVLInvariant (height b) (Node k v l r)++%name AVLInvariant inv++public export+AVLTree : (height : Nat) -> (keyTy : Type) -> (valueTy : Type) -> Type+AVLTree n k v = Subset (Tree k v) (AVLInvariant n)++-- --------------------------------------------------------------- [ Rotations ]+private+data InsertRes : Nat -> (k : Type) -> Type -> Type where+  Same : AVLTree n k v     -> InsertRes n k v+  Grew : AVLTree (S n) k v -> InsertRes n k v++%name InsertRes res, r++private+runInsertRes : InsertRes n k v -> (n : Nat ** AVLTree n k v)+runInsertRes (Same t) = (_ ** t)+runInsertRes (Grew t) = (_ ** t)++||| Perform a Left roation.+private+rotLeft : k+       -> v+       -> AVLTree n k v+       -> AVLTree (S (S n)) k v+       -> InsertRes (S (S n)) k v+-- Impossible because Empty has depth 0 and we know the depth is at least 2 from the type+rotLeft key val l (Element Empty AVLEmpty) impossible+rotLeft key val (Element l invl) (Element (Node key' val' rl rr) (AVLNode invrl invrr Balanced)) = ?rl1+rotLeft key val (Element l invl) (Element (Node key' val' (Node key'' val'' rll rlr) rr) (AVLNode (AVLNode invrll invrlr LHeavy) invrr LHeavy)) = ?rl2+rotLeft key val (Element l invl) (Element (Node key' val' (Node key'' val'' rll rlr) rr) (AVLNode (AVLNode invrll invrlr RHeavy) invrr LHeavy)) = ?rl3+rotLeft key val (Element l invl) (Element (Node key' val' (Node key'' val'' rll rlr) rr) (AVLNode (AVLNode invrll invrlr Balanced) invrr LHeavy)) = ?rl4+rotLeft key val (Element l invl) (Element (Node key' val' rl rr) (AVLNode invrl invrr RHeavy)) = ?rl5
+ test/regression001/eff001.idr view
@@ -0,0 +1,39 @@+module Test.Random++import Effects+import Effect.Random++genKVPair : (genA : Eff a [RND])+         -> (genB : Eff b [RND])+         -> Eff (Pair a b) [RND]+genKVPair f g = pure (!f, !g)++genRndListKVUE : (Eq a, Eq b) =>+                 (seed : Integer)+              -> (len  : Nat)+              -> (genA : Eff a [RND])+              -> (genB : Eff b [RND])+              -> Eff (List (Pair a b)) [RND]+genRndListKVUE s l f g = do srand s; pure !(doGen l (genKVPair f g))+  where+    genElem : (Eq a, Eq b)+           => (generator : Eff (Pair a b) [RND])+           -> (existing  : List (Pair a b))+           -> Eff (Pair a b) [RND]+    genElem j xs = do+      x <- j+      if elem x xs+        then genElem j xs+        else if isJust $ lookup (fst x) xs+          then genElem j xs+          else pure x++    doGen : (Eq a, Eq b)+         => (count     : Nat)+         -> (generator : Eff (Pair a b) [RND])+         -> Eff (List (Pair a b)) [RND]+    doGen Z     j = pure Nil+    doGen (S n) j = do+      xs <- doGen n j+      x  <- genElem j xs+      pure (x::xs)
test/regression001/reg036.idr view
@@ -5,8 +5,8 @@   data HV : Vect n Type -> Type where     MkHV : HVect ts -> HV ts -  showHV : Shows m ts => HV ts -> String+  showHV : Shows ts => HV ts -> String   showHV (MkHV v) = show v -  implementation Shows m ts => Show (HV ts) where+  implementation Shows ts => Show (HV ts) where     show = showHV
test/regression001/run view
@@ -3,7 +3,11 @@     reg001.idr reg036.idr reg037.idr reg038.idr reg046.idr \     reg047a.idr reg053.idr reg057.idr reg058.idr reg058a.idr \     reg059.idr reg060.idr  reg061.idr reg062.idr reg063.idr \-    reg064.idr reg065.idr  reg066.idr reg071.idr reg074.idr+    reg064.idr reg065.idr  reg066.idr reg071.idr reg074.idr \+    coverage001.idr++${IDRIS:-idris} $@ --check \+    eff001.idr -p effects  ${IDRIS:-idris} $@ --check --nobuiltins reg047.idr 
test/regression002/expected view
@@ -6,8 +6,8 @@ No such variable EvenList reg006.idr:17:1: RBTree.lookup is possibly not total due to recursive path RBTree.lookup --> RBTree.lookup-reg007.lidr:8:1:A.n is already defined-reg007.lidr:12:11-17:When checking right hand side of hurrah with expected type+reg007.lidr:8:3:A.n is already defined+reg007.lidr:12:13-19:When checking right hand side of hurrah with expected type         0 = 1  Type mismatch between@@ -103,7 +103,7 @@ When checking an application of constructor Foo.CAny:         Attempting concrete match on polymorphic argument: Nothing reg055a.idr:13:7:When checking left hand side of Foo.apply:-Can't match on apply (\x => \y => x) a+Can't match on apply (\x, y => x) a reg056.idr:7:7:dodgy n m Refl is a valid case reg056.idr:10:6:nonk Refl is a valid case reg068.idr:1:6:Main.nat has a name which may be implicitly bound.
test/regression002/run view
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -${IDRIS:-idris} $@ --nobanner --nocolour --quiet <<!+${IDRIS:-idris} $@ --nobanner --nocolour --quiet --port none <<! :load reg003.idr :load reg003a.idr :load reg006.idr
test/tactics001/Tactics.idr view
@@ -18,14 +18,16 @@ plusZeroRightNeutralNew : (n : Nat) -> plus n 0 = n plusZeroRightNeutralNew Z = Refl plusZeroRightNeutralNew (S k) =-  %runElab (do rewriteWith `(sym $ plusZeroRightNeutralNew ~(Var `{k}))+  %runElab (do compute+               rewriteWith `(sym $ plusZeroRightNeutralNew ~(Var `{k}))                fill $ refl `(Nat : Type) `(S ~(Var `{k}))                solve)  plusSuccRightSuccNew : (j, k : Nat) -> plus j (S k) = S (plus j k) plusSuccRightSuccNew Z k = Refl plusSuccRightSuccNew (S j) k =-  %runElab (do rewriteWith `(sym $ plusSuccRightSuccNew ~(Var `{j}) ~(Var `{k}))+  %runElab (do compute+               rewriteWith `(sym $ plusSuccRightSuccNew ~(Var `{j}) ~(Var `{k}))                fill $ refl `(Nat : Type) `(S (S (plus ~(Var `{j}) ~(Var `{k}))))                solve) 
test/totality011/expected view
@@ -1,2 +1,2 @@-totality011.lidr:22:1:+totality011.lidr:22:3: Main.weCanOnlyGetOlder is not total as there are missing cases
test/totality013/expected view
@@ -1,4 +1,3 @@ totality013a.idr:5:3:-Main.foo is possibly not total due to recursive path Main.mtot --> Main.mtot --> Main.mtot --> Main.mtot-totality013a.idr:9:3:-Main.mtot is possibly not total due to recursive path Main.mtot --> Main.mtot --> Main.mtot+Main.foo is possibly not total due to recursive path Main.foo --> Main.mtot --> Main.mtot --> Main.mtot+totality013a.idr:9:3:Main.mtot is possibly not total due to: Main.foo
test/totality015/totality015.idr view
@@ -12,7 +12,7 @@      Do : Command a -> (a -> Inf (ConsoleIO b)) -> ConsoleIO b  (>>=) : Command a -> (a -> Inf (ConsoleIO b)) -> ConsoleIO b-(>>=) = Do+(>>=) = Do   data Fuel = Dry | More (Lazy Fuel) 
+ test/totality018/expected view
@@ -0,0 +1,1 @@+totality018.idr:12:1:Main.bar is not total as there are missing cases
+ test/totality018/run view
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ totality018.idr --check+rm -f *.ibc
+ test/totality018/totality018.idr view
@@ -0,0 +1,15 @@+import Data.Fin++%default total++foo : Fin 3 -> Nat+foo FZ = 0+foo (FS FZ) = 1+foo (FS (FS FZ)) = 2+-- testing that there is no need for an extra 'impossible'++bar : Fin 4 -> Nat+bar FZ = 0+bar (FS FZ) = 1+bar (FS (FS FZ)) = 2+-- should be non-total
+ test/totality019/expected view
@@ -0,0 +1,2 @@+totality019.idr:8:1:Main.testCov is not total as there are missing cases+totality019.idr:12:1:Main.testCov' is not total as there are missing cases
+ test/totality019/run view
@@ -0,0 +1,4 @@+#!/usr/bin/env bash+${IDRIS:-idris} $@ totality019.idr --check+${IDRIS:-idris} $@ totality019a.idr --check+rm -f *.ibc
+ test/totality019/totality019.idr view
@@ -0,0 +1,14 @@+%default total++MkThing : Bool -> Type+MkThing True = Nat+MkThing False = Bool++testCov : (x : Bool) -> MkThing x -> Nat+testCov False False = ?testCov_rhs_3+testCov False True = ?testCov_rhs_4++testCov' : (x : Bool ** MkThing x) -> Nat+testCov' (False ** False) = ?testCov_rhs_3+testCov' (False ** True) = ?testCov_rhs_4+
+ test/totality019/totality019a.idr view
@@ -0,0 +1,81 @@+module Test++import Data.Vect+%default total ++genT : Vect n Type -> Type+genT [] = Type+genT (x :: xs) = x -> genT xs++data FunLang: Type where+  Atom : {dt : Vect n Type} -> genT dt -> FunLang +  And  : FunLang -> FunLang -> FunLang+  Uor  : FunLang -> FunLang -> FunLang+  Xor  : FunLang -> FunLang -> FunLang  -- d decides on that++data IndexFL : FunLang -> FunLang -> Type where+  LHere     : IndexFL fl fl+  LLeftAnd  : IndexFL x rfl -> IndexFL (And x y) rfl+  LRightAnd : IndexFL y rfl -> IndexFL (And x y) rfl+  LLeftUor  : IndexFL x rfl -> IndexFL (Uor x y) rfl+  LRightUor : IndexFL y rfl -> IndexFL (Uor x y) rfl+  LLeftXor  : IndexFL x rfl -> IndexFL (Xor x y) rfl+  LRightXor : IndexFL y rfl -> IndexFL (Xor x y) rfl++data SetFL : FunLang -> Type where+  SEmpty      : SetFL fl+  SElem      : SetFL fl+  SLeftAnd   : SetFL x -> SetFL (And x y) +  SRightAnd  : SetFL y -> SetFL (And x y) +  SBothAnd   : SetFL x -> SetFL y -> SetFL (And x y) +  SLeftUor   : SetFL x -> SetFL (Uor x y) +  SRightUor : SetFL y -> SetFL (Uor x y) +  SBothUor   : SetFL x -> SetFL y -> SetFL (Uor x y) +  SLeftXor   : SetFL x -> SetFL (Xor x y) +  SRightXor  : SetFL y -> SetFL (Xor x y) +  SBothXor   : SetFL x -> SetFL y -> SetFL (Xor x y) ++addIndexFLEmpty : IndexFL fl _ -> SetFL fl+addIndexFLEmpty LHere = SElem+addIndexFLEmpty (LLeftAnd z) = SLeftAnd $ addIndexFLEmpty z+addIndexFLEmpty (LRightAnd z) = SRightAnd $ addIndexFLEmpty z+addIndexFLEmpty (LLeftUor z) = SLeftUor $ addIndexFLEmpty z+addIndexFLEmpty (LRightUor z) = SRightUor $ addIndexFLEmpty z+addIndexFLEmpty (LLeftXor z) = SLeftXor $ addIndexFLEmpty z+addIndexFLEmpty (LRightXor z) =  SRightXor $ addIndexFLEmpty z++addIndexFL : SetFL fl -> IndexFL fl _ -> SetFL fl+addIndexFL SEmpty y = addIndexFLEmpty y+addIndexFL SElem y = SElem+addIndexFL x LHere = SElem+addIndexFL (SLeftAnd x) (LLeftAnd w) = SLeftAnd $ addIndexFL x w+addIndexFL (SLeftAnd SElem) (LRightAnd LHere) = SElem+addIndexFL (SLeftAnd x) (LRightAnd w) = SBothAnd x (addIndexFLEmpty w)+addIndexFL (SRightAnd SElem) (LLeftAnd LHere) = SElem+addIndexFL (SRightAnd x) (LLeftAnd w) = SBothAnd (addIndexFLEmpty w) x+addIndexFL (SRightAnd x) (LRightAnd w) = SRightAnd $ addIndexFL x w+addIndexFL (SBothAnd x SElem) (LLeftAnd LHere) = SElem+addIndexFL (SBothAnd SElem y) (LRightAnd LHere) = SElem+addIndexFL (SBothAnd x y) (LLeftAnd w) = SBothAnd (addIndexFL x w) y+addIndexFL (SBothAnd x y) (LRightAnd w) = SBothAnd x (addIndexFL y w)+addIndexFL (SLeftUor x) (LLeftUor w) = SLeftUor $ addIndexFL x w+addIndexFL (SLeftUor SElem) (LRightUor LHere) = SElem+addIndexFL (SLeftUor x) (LRightUor w) = SBothUor x (addIndexFLEmpty w)+addIndexFL (SRightUor SElem) (LLeftUor LHere) = SElem+addIndexFL (SRightUor x) (LLeftUor w) = SBothUor (addIndexFLEmpty w) x+addIndexFL (SRightUor x) (LRightUor w) = SRightUor $ addIndexFL x w+addIndexFL (SBothUor x SElem) (LLeftUor LHere) = SElem+addIndexFL (SBothUor SElem y) (LRightUor LHere) = SElem+addIndexFL (SBothUor x y) (LLeftUor w) = SBothUor (addIndexFL x w) y+addIndexFL (SBothUor x y) (LRightUor w) = SBothUor x (addIndexFL y w)+addIndexFL (SLeftXor x) (LLeftXor w) = SLeftXor $ addIndexFL x w+addIndexFL (SLeftXor SElem) (LRightXor LHere) = SElem+addIndexFL (SLeftXor x) (LRightXor w) = SBothXor x (addIndexFLEmpty w)+addIndexFL (SRightXor SElem) (LLeftXor LHere) = SElem+addIndexFL (SRightXor x) (LLeftXor w) = SBothXor (addIndexFLEmpty w) x+addIndexFL (SRightXor x) (LRightXor w) = SRightXor $ addIndexFL x w+addIndexFL (SBothXor x SElem) (LLeftXor LHere) = SElem+addIndexFL (SBothXor SElem y) (LRightXor LHere) = SElem+addIndexFL (SBothXor x y) (LLeftXor w) = SBothXor (addIndexFL x w) y+addIndexFL (SBothXor x y) (LRightXor w) = SBothXor x (addIndexFL y w)+
test/tutorial006/expected view
@@ -1,18 +1,18 @@ tutorial006a.idr:5:23-25: When checking right hand side of vapp with expected type-        Vect (S k + m) a+        Vect (S len + m) a  When checking argument xs to constructor Data.Vect.:::         Type mismatch between-                Vect (k + k) a (Type of vapp xs xs)+                Vect (len + len) a (Type of vapp xs xs)         and-                Vect (plus k m) a (Expected type)+                Vect (plus len m) a (Expected type)                  Specifically:                 Type mismatch between-                        plus k k+                        plus len len                 and-                        plus k m+                        plus len m tutorial006b.idr:10:10: When checking right hand side of with block in Main.parity with expected type         Parity (S (S (j + j)))
test/unique004/run view
@@ -1,6 +1,6 @@ #!/usr/bin/env bash -${IDRIS:-idris} --nobanner --nocolour --quiet <<!+${IDRIS:-idris} --nobanner --nocolour --quiet --port none <<! :load unique001a.idr :load unique001b.idr :load unique001c.idr