packages feed

focus 1.0.1.2 → 1.0.1.3

raw patch · 3 files changed

+80/−38 lines, 3 filesdep +QuickCheckdep +focusdep +quickcheck-instancesdep ~basePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: QuickCheck, focus, quickcheck-instances, rerebase, tasty, tasty-hunit, tasty-quickcheck

Dependency ranges changed: base

API changes (from Hackage documentation)

- Focus: Focus :: (m (result, Change element)) -> (element -> m (result, Change element)) -> Focus element m result
+ Focus: Focus :: m (result, Change element) -> (element -> m (result, Change element)) -> Focus element m result

Files

focus.cabal view
@@ -1,9 +1,6 @@-name:-  focus-version:-  1.0.1.2-synopsis:-  A general abstraction for manipulating elements of container data structures+name: focus+version: 1.0.1.3+synopsis: A general abstraction for manipulating elements of container data structures description:   An API for construction of free-form strategies of access and manipulation of    elements of arbitrary data structures.@@ -18,44 +15,45 @@   .   This library provides pure and monadic interfaces,   so it supports both immutable and mutable data structures.-category:-  Containers, Data-homepage:-  https://github.com/nikita-volkov/focus -bug-reports:-  https://github.com/nikita-volkov/focus/issues -author:-  Nikita Volkov <nikita.y.volkov@mail.ru>-maintainer:-  Nikita Volkov <nikita.y.volkov@mail.ru>-copyright:-  (c) 2014, Nikita Volkov-license:-  MIT-license-file:-  LICENSE-build-type:-  Simple-cabal-version:-  >=1.10+category: Containers, Data+homepage: https://github.com/nikita-volkov/focus+bug-reports: https://github.com/nikita-volkov/focus/issues+author: Nikita Volkov <nikita.y.volkov@mail.ru>+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>+copyright: (c) 2014, Nikita Volkov+license: MIT+license-file: LICENSE+build-type: Simple+cabal-version: >=1.10  source-repository head-  type:-    git-  location:-    git://github.com/nikita-volkov/focus.git+  type: git+  location: git://github.com/nikita-volkov/focus.git  library-  hs-source-dirs:-    library-  default-extensions:-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedLists, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples-  default-language:-    Haskell2010+  hs-source-dirs: library+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedLists, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples+  default-language: Haskell2010   exposed-modules:     Focus   other-modules:     Focus.Prelude   build-depends:-    base >=4.6 && <5,+    base >=4.9 && <5,     transformers >=0.5 && <0.6++test-suite test+  type: exitcode-stdio-1.0+  hs-source-dirs: test+  default-extensions: BangPatterns, DeriveDataTypeable, DeriveGeneric, DeriveFunctor, DeriveTraversable, FlexibleContexts, FlexibleInstances, LambdaCase, NoImplicitPrelude, RankNTypes, ScopedTypeVariables, StandaloneDeriving, TypeApplications, TypeFamilies+  default-language: Haskell2010+  main-is:+    Main.hs+  build-depends:+    focus,+    QuickCheck >=2.8.1 && <3,+    quickcheck-instances >=0.3.11 && <0.4,+    rerebase <2,+    tasty >=0.12 && <2,+    tasty-hunit >=0.9 && <0.11,+    tasty-quickcheck >=0.9 && <0.11
library/Focus.hs view
@@ -20,7 +20,7 @@   (<*>) = ap  instance Monad m => Monad (Focus element m) where-  return result = Focus (return (result, Leave)) (\ _ -> return (result, Leave))+  return result = Focus (return (result, Leave)) (\ element -> return (result, Set element))   (>>=) (Focus aAbsent bPresent) bKleisli = let     sendSome element = do       (aResult, aChange) <- bPresent element
+ test/Main.hs view
@@ -0,0 +1,44 @@+module Main where++import Prelude hiding (choose)+import Test.QuickCheck.Instances+import Test.Tasty+import Test.Tasty.Runners+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck+import qualified Test.QuickCheck as QuickCheck+import qualified Test.QuickCheck.Property as QuickCheck+import qualified Focus+++main =+  defaultMain $+  testGroup "" $+  [+    testCase "Monadically composed lookup and insert (https://github.com/nikita-volkov/stm-containers/issues/25)" $ let+      Focus.Focus absent present = do+        prev <- Focus.lookup+        Focus.insert "one"+        pure (isJust prev)+      in do+        assertEqual "" (True, Focus.Set "one") $ runIdentity (present "zero")+        assertEqual "" (False, Focus.Set "one") $ runIdentity absent+    ,+    testCase "Applicatively composed lookup and insert" $ let+      Focus.Focus absent present = (isJust <$> Focus.lookup) <* Focus.insert "one"+      in do+        assertEqual "" (True, Focus.Set "one") $ runIdentity (present "zero")+        assertEqual "" (False, Focus.Set "one") $ runIdentity absent+    ,+    testCase "Applicatively composed pure and insert" $ let+      Focus.Focus absent present = pure () <* Focus.insert "one"+      in do+        assertEqual "" ((), Focus.Set "one") (runIdentity (present "zero"))+        assertEqual "" ((), Focus.Set "one") (runIdentity absent)+    ,+    testCase "insert" $ let+      Focus.Focus absent present = Focus.insert "one"+      in do+        assertEqual "" ((), Focus.Set "one") (runIdentity (present "zero"))+        assertEqual "" ((), Focus.Set "one") (runIdentity absent)+  ]