strict-lens (empty) → 0.4
raw patch · 5 files changed
+251/−0 lines, 5 filesdep +basedep +lensdep +strictsetup-changed
Dependencies added: base, lens, strict
Files
- CHANGES.md +3/−0
- LICENSE +28/−0
- Setup.lhs +3/−0
- src/Data/Strict/Lens.hs +163/−0
- strict-lens.cabal +54/−0
+ CHANGES.md view
@@ -0,0 +1,3 @@+## 0.4++- Initial release, splitted of `strict-base-types`
+ LICENSE view
@@ -0,0 +1,28 @@+Copyright (c) 2020 Oleg Grenrus+ 2013-2014 Simon Meier+ 2006-2008 Roman Leshchinskiy++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+2. 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.+3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE 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 AUTHORS 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.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ src/Data/Strict/Lens.hs view
@@ -0,0 +1,163 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++{-# OPTIONS_GHC -fno-warn-orphans #-}+module Data.Strict.Lens (+ -- * Tuple+ -- | See instances, in particular for 'Field1' and 'Field2' type classes.+ -- * Either+ _Left, _Right,+ -- * Maybe+ _Just, _Nothing,+ -- * These+ here, there,+ _This, _That, _These,+ ) where+++import Control.Applicative (pure, (<$>), (<*>))+import Prelude (Int, flip, ($), (.))++-- Lazy variants+import qualified Prelude as L+import qualified Control.Lens as L++import Control.Lens (Each (..), Field1 (..), Field2 (..),+ Index, Prism, Prism', Swapped (..),+ Traversal, indexed, iso, prism, prism',+ (<&>))++import Data.Strict (Either (..), Maybe (..), Pair (..),+ Strict (..), These (..), either, maybe,+ swap, these)++-------------------------------------------------------------------------------+-- Tuple+-------------------------------------------------------------------------------++instance L.Strict (a, b) (Pair a b) where+ strict = iso toStrict toLazy++instance Field1 (Pair a b) (Pair a' b) a a' where+ _1 k (a :!: b) = indexed k (0 :: Int) a <&> \a' -> (a' :!: b)++instance Field2 (Pair a b) (Pair a b') b b' where+ _2 k (a :!: b) = indexed k (1 :: Int) b <&> \b' -> (a :!: b')++instance Swapped Pair where+ swapped = iso swap swap++type instance Index (Pair a b) = Int+instance (a~a', b~b') => Each (Pair a a') (Pair b b') a b where+ each f ~(a :!: b) = (:!:) <$> f a <*> f b+ {-# INLINE each #-}++-------------------------------------------------------------------------------+-- Either+-------------------------------------------------------------------------------++instance L.Strict (L.Either a b) (Either a b) where+ strict = iso toStrict toLazy++instance Swapped Either where+ swapped = either Right Left `iso` either Right Left++instance (a ~ a', b ~ b') => Each (Either a a') (Either b b') a b where+ each f (Left x) = Left <$> f x+ each f (Right x) = Right <$> f x++-- | Analogous to 'Control.Lens.Prism._Left' in "Control.Lens.Prism".+_Left :: Prism (Either a c) (Either b c) a b+_Left = prism Left $ either L.Right (L.Left . Right)++-- | Analogous to 'Control.Lens.Prism._Right' in "Control.Lens.Prism".+_Right :: Prism (Either c a) (Either c b) a b+_Right = prism Right $ either (L.Left . Left) L.Right++-------------------------------------------------------------------------------+-- Maybe+-------------------------------------------------------------------------------++instance L.Strict (L.Maybe a) (Maybe a) where+ strict = iso toStrict toLazy++instance Each (Maybe a) (Maybe b) a b++-- | Analogous to 'Control.Lens.Prism._Just' in "Control.Lens.Prism"+_Just :: Prism (Maybe a) (Maybe b) a b+_Just = prism Just $ maybe (L.Left Nothing) L.Right++-- | Analogous to 'Control.Lens.Prism._Nothing' in "Control.Lens.Prism"+_Nothing :: Prism' (Maybe a) ()+_Nothing = prism' (L.const Nothing) $ maybe (L.Just ()) (L.const L.Nothing)++-------------------------------------------------------------------------------+-- These+-------------------------------------------------------------------------------++instance Swapped These where+ swapped = iso swapThese swapThese++instance (a ~ a', b ~ b') => Each (These a a') (These b b') a b where+ each f (This a) = This <$> f a+ each f (That b) = This <$> f b+ each f (These a b) = These <$> f a <*> f b++-- | A 'Control.Lens.Traversal' of the first half of a 'These', suitable for use with "Control.Lens".+--+-- >>> over here show (That 1)+-- That 1+--+-- >>> over here show (These 'a' 2)+-- These "'a'" 2+--+here :: Traversal (These a c) (These b c) a b+here f (This x) = This <$> f x+here f (These x y) = flip These y <$> f x+here _ (That x) = pure (That x)++-- | A 'Control.Lens.Traversal' of the second half of a 'These', suitable for use with "Control.Lens".+--+-- @+-- 'there' :: 'Control.Lens.Traversal' ('These' t b) ('These' t b) a b+-- @+--+-- >>> over there show (That 1)+-- That "1"+--+-- >>> over there show (These 'a' 2)+-- These 'a' "2"+--+there :: Traversal (These c a) (These c b) a b+there _ (This x) = pure (This x)+there f (These x y) = These x <$> f y+there f (That x) = That <$> f x++-- | A 'Control.Lens.Prism'' selecting the 'This' constructor.+--+-- /Note:/ cannot change type.+_This :: Prism' (These a b) a+_This = prism This (these L.Right (L.Left . That) (\x y -> L.Left $ These x y))++-- | A 'Control.Lens.Prism'' selecting the 'That' constructor.+--+-- /Note:/ cannot change type.+_That :: Prism' (These a b) b+_That = prism That (these (L.Left . This) L.Right (\x y -> L.Left $ These x y))++-- | A 'Control.Lens.Prism'' selecting the 'These' constructor. 'These' names are ridiculous!+--+-- /Note:/ cannot change type.+_These :: Prism' (These a b) (a, b)+_These = prism (\(a,b) -> These a b) (these (L.Left . This) (L.Left . That) (\x y -> L.Right (x, y)))++swapThese :: These a b -> These b a+swapThese (This a) = That a+swapThese (That b) = This b+swapThese (These a b) = These b a
+ strict-lens.cabal view
@@ -0,0 +1,54 @@+name: strict-lens+version: 0.4+synopsis: Lenses for types in strict package+category: Data, Lenses+description: Lenses for types in strict package.+license: BSD3+license-file: LICENSE+author:+ Roman Leshchinskiy <rl@cse.unsw.edu.au>,+ Simon Meier <iridcode@gmail.com>++maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>+copyright:+ (c) 2006-2008 by Roman Leshchinskiy+ (c) 2013-2014 by Simon Meier++homepage: https://github.com/haskell-strict/strict+cabal-version: >=1.10+build-type: Simple+tested-with:+ GHC ==7.4.2+ || ==7.6.3+ || ==7.8.4+ || ==7.10.3+ || ==8.0.2+ || ==8.2.2+ || ==8.4.4+ || ==8.6.5+ || ==8.8.3+ || ==8.10.1++extra-source-files: CHANGES.md++source-repository head+ type: git+ location: https://github.com/haskell-strict/strict.git+ subdir: strict-lens++library+ default-language: Haskell2010+ ghc-options: -Wall -fwarn-incomplete-uni-patterns++ if impl(ghc >=8.0)+ ghc-options:+ -Wcompat -Wnoncanonical-monad-instances+ -Wnoncanonical-monadfail-instances++ build-depends:+ base >=4.5 && <5+ , lens >=4.19.2 && <4.20+ , strict >=0.4 && <0.4.1++ hs-source-dirs: src+ exposed-modules: Data.Strict.Lens