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 +35/−37
- library/Focus.hs +1/−1
- test/Main.hs +44/−0
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)+ ]