keera-hails-reactive-cbmvar (empty) → 0.6.0
raw patch · 6 files changed
+283/−0 lines, 6 filesdep +basedep +directorydep +filepathsetup-changed
Dependencies added: base, directory, filepath, hlint, keera-callbacks, keera-hails-reactivevalues, lens, process, regex-posix
Files
- LICENSE +31/−0
- Setup.hs +2/−0
- keera-hails-reactive-cbmvar.cabal +104/−0
- src/Data/CBMVar/Reactive.hs +32/−0
- tests/HLintMain.hs +23/−0
- tests/HaddockCoverage.hs +91/−0
+ LICENSE view
@@ -0,0 +1,31 @@+Copyright (c) 2013-2020, Keera Studios Ltd+Copyright (c) 2010-2012, Ivan Perez++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Ivan Perez, nor the name of Keera Studios, nor the+ names of other contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ keera-hails-reactive-cbmvar.cabal view
@@ -0,0 +1,104 @@+-- Copyright : (C) Keera Studios Ltd, 2013+-- License : All Rights Reserved+-- Maintainer : support@keera.co.uk+--+cabal-version: >= 1.10+build-type: Simple++name: keera-hails-reactive-cbmvar+version: 0.6.0+author: Sasha Pavlenko+maintainer: support@keera.co.uk+homepage: https://keera.co.uk/+license: BSD3+license-file: LICENSE+category: Development+synopsis: Reactive Haskell on Rails - CBMVars as reactive values+description:+ CBMVars are MVars enriched with a notion of callbacks that are+ executed when the value in the MVar is altered.+ .+ This package wraps CBMVars into reactive values, making it easy+ to use them as models of reactive applications.++source-repository head+ type: git+ location: git://github.com/keera-studios/keera-hails+ subdir: keera-hails-reactive-cbmvar++-- You can disable the hlint test suite with -f-test-hlint+flag test-hlint+ default: True+ manual: True++-- You can disable the haddock coverage test suite with -f-test-doc-coverage+flag test-doc-coverage+ default: True+ manual: True++library++ exposed-modules:+ Data.CBMVar.Reactive++ build-depends:+ base >= 4 && < 5+ , lens+ , keera-hails-reactivevalues+ , keera-callbacks++ default-language: Haskell2010++ hs-source-dirs: src/++ ghc-options: -Wall++test-suite hlint++ type:+ exitcode-stdio-1.0++ main-is:+ HLintMain.hs++ hs-source-dirs:+ tests++ if !flag(test-hlint)+ buildable: False+ else+ build-depends:+ base+ , hlint >= 1.7++ default-language:+ Haskell2010+++-- Verify that the code is thoroughly documented+test-suite haddock-coverage++ type:+ exitcode-stdio-1.0++ main-is:+ HaddockCoverage.hs++ ghc-options:+ -Wall++ hs-source-dirs:+ tests++ if !flag(test-doc-coverage)+ buildable: False+ else+ build-depends:+ base >= 4 && < 5+ , directory+ , filepath+ , process+ , regex-posix++ default-language:+ Haskell2010
+ src/Data/CBMVar/Reactive.hs view
@@ -0,0 +1,32 @@+-- |+-- Copyright : (C) Keera Studios Ltd, 2013+-- License : BSD3+-- Maintainer : support@keera.co.uk+--+-- MVars as Reactive Values.+--+-- CBMVars are MVars enriched with a notion of callbacks that are+-- executed when the value in the MVar is altered.+--+-- This module wraps CBMVars into reactive values, making it easy+-- to use them as models of reactive applications.+module Data.CBMVar.Reactive where++import Data.CBMVar (CBMVar, installCallbackCBMVar, readCBMVar,+ writeCBMVar)+import Data.ReactiveValue (ReactiveFieldRead(..), ReactiveFieldReadWrite(..))++-- | Return a read-only reactive value wrapping a CBMVar.+cbmvarReactiveRO :: CBMVar a -> ReactiveFieldRead IO a+cbmvarReactiveRO mvar = ReactiveFieldRead getter notifier+ where+ getter = readCBMVar mvar+ notifier n = installCallbackCBMVar mvar n++-- | Return a read-write reactive value wrapping a CBMVar.+cbmvarReactiveRW :: CBMVar a -> ReactiveFieldReadWrite IO a+cbmvarReactiveRW mvar = ReactiveFieldReadWrite setter getter notifier+ where+ setter = writeCBMVar mvar+ getter = readCBMVar mvar+ notifier n = installCallbackCBMVar mvar n
+ tests/HLintMain.hs view
@@ -0,0 +1,23 @@+-----------------------------------------------------------------------------+-- |+-- Module : Main (hlint)+-- Copyright : (C) 2013 Edward Kmett+-- License : BSD-style (see the file LICENSE)+-- Maintainer : Edward Kmett <ekmett@gmail.com>+-- Stability : provisional+-- Portability : portable+--+-- This module runs HLint on the lens source tree.+-----------------------------------------------------------------------------+module Main where++import Control.Monad+import Language.Haskell.HLint+import System.Environment+import System.Exit++main :: IO ()+main = do+ args <- getArgs+ hints <- hlint $ ["src", "--cross", "--hint=tests/hlint.yaml" ] ++ args+ unless (null hints) exitFailure
+ tests/HaddockCoverage.hs view
@@ -0,0 +1,91 @@+-----------------------------------------------------------------------------+-- |+-- Module : Main (HaddockCoverage)+-- Copyright : (C) 2015 Ivan Perez+-- License : BSD-style (see the file LICENSE)+-- Maintainer : Ivan Perez <ivan.perez@keera.co.uk>+-- Stability : provisional+-- Portability : portable+--+-- Copyright notice: This file borrows code+-- https://hackage.haskell.org/package/lens-4.7/src/tests/doctests.hsc+-- which is itself licensed BSD-style as well.+--+-- Run haddock on a source tree and report if anything in any+-- module is not documented.+-----------------------------------------------------------------------------+module Main where++import Control.Applicative+import Control.Monad+import Data.List+import System.Directory+import System.Exit+import System.FilePath+import System.IO+import System.Process+import Text.Regex.Posix++main :: IO ()+main = do+ -- Find haskell modules+ -- TODO: Ideally cabal should do this (provide us with the+ -- list of modules). An alternative would be to use cabal haddock+ -- but that would need a --no-html argument or something like that.+ -- Alternatively, we could use cabal haddock with additional arguments.+ --+ -- See:+ -- https://github.com/keera-studios/haddock/commit/d5d752943c4e5c6c9ffcdde4dc136fcee967c495+ -- https://github.com/haskell/haddock/issues/309#issuecomment-150811929+ files <- getSources++ let haddockArgs = [ "--no-warnings", "--ignore-all-exports" ] ++ files+ let cabalArgs = [ "exec", "--", "haddock" ] ++ haddockArgs+ (code, out, _err) <- readProcessWithExitCode "cabal" cabalArgs ""++ -- Filter out coverage lines, and find those that denote undocumented+ -- modules.+ --+ -- TODO: is there a way to annotate a function as self-documenting,+ -- in the same way we do with ANN for hlint?+ let isIncompleteModule :: String -> Bool+ isIncompleteModule line = isCoverageLine line && not (line =~ "^ *100%")+ where isCoverageLine :: String -> Bool+ isCoverageLine line = line =~ "^ *[0-9]+%"++ let incompleteModules :: [String]+ incompleteModules = filter isIncompleteModule $ lines out++ -- Based on the result of haddock, report errors and exit.+ -- Note that, unline haddock, this script does not+ -- output anything to stdout. It uses stderr instead+ -- (as it should).+ case (code, incompleteModules) of+ (ExitSuccess , []) -> return ()+ -- (ExitFailure _, _) -> exitFailure+ (_ , _) -> do+ hPutStrLn stderr "The following modules are not fully documented:"+ mapM_ (hPutStrLn stderr) incompleteModules+ exitFailure++getSources :: IO [FilePath]+getSources = filter isHaskellFile <$> go "src"+ where+ go dir = do+ (dirs, files) <- getFilesAndDirectories dir+ (files ++) . concat <$> mapM go dirs++ isHaskellFile fp = (isSuffixOf ".hs" fp || isSuffixOf ".lhs" fp)+ && not (any (`isSuffixOf` fp) excludedFiles)++ excludedFiles = [ ]++getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])+getFilesAndDirectories dir = do+ c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir+ (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c++-- find-based implementation (not portable)+--+-- getSources :: IO [FilePath]+-- getSources = fmap lines $ readProcess "find" ["src/", "-iname", "*hs"] ""