fastmemo 0.1.0.1 → 0.1.1
raw patch · 10 files changed
+107/−28 lines, 10 filesdep +containersdep ~basedep ~bytestringdep ~vectorPVP ok
version bump matches the API change (PVP)
Dependencies added: containers
Dependency ranges changed: base, bytestring, vector
API changes (from Hackage documentation)
+ Data.Function.FastMemo: AsList :: t -> AsList t
+ Data.Function.FastMemo: [unAsList] :: AsList t -> t
+ Data.Function.FastMemo: newtype AsList t
Files
- fastmemo.cabal +12/−8
- src/Data/Function/FastMemo.hs +3/−3
- src/Data/Function/FastMemo/ByteString.hs +5/−4
- src/Data/Function/FastMemo/Class.hs +1/−6
- src/Data/Function/FastMemo/Containers.hs +34/−0
- src/Data/Function/FastMemo/Instances.hs +1/−0
- src/Data/Function/FastMemo/List.hs +19/−0
- src/Data/Function/FastMemo/Natural.hs +1/−0
- src/Data/Function/FastMemo/Vector.hs +6/−6
- test/Spec.hs +25/−1
fastmemo.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.35.0. -- -- see: https://github.com/sol/hpack name: fastmemo-version: 0.1.0.1+version: 0.1.1 synopsis: Memoize functions on Generic types description: Please see the README on GitHub at <https://github.com/davidspies/fastmemo#readme> category: Memoization@@ -31,9 +31,11 @@ Data.Function.FastMemo.ByteString Data.Function.FastMemo.Char Data.Function.FastMemo.Class+ Data.Function.FastMemo.Containers Data.Function.FastMemo.Instances Data.Function.FastMemo.Int Data.Function.FastMemo.Integer+ Data.Function.FastMemo.List Data.Function.FastMemo.Natural Data.Function.FastMemo.Ratio Data.Function.FastMemo.Util@@ -44,10 +46,11 @@ src ghc-options: -Wall build-depends:- base >=4.7 && <4.16- , bytestring ==0.10.*+ base >=4.7 && <4.18+ , bytestring >=0.10 && <0.12+ , containers ==0.6.* , utf8-string ==1.0.*- , vector ==0.12.*+ , vector >=0.12 && <0.14 default-language: Haskell2010 test-suite fastmemo-test@@ -61,9 +64,10 @@ ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N build-depends: QuickCheck- , base >=4.7 && <4.16- , bytestring ==0.10.*+ , base >=4.7 && <4.18+ , bytestring >=0.10 && <0.12+ , containers ==0.6.* , fastmemo , utf8-string ==1.0.*- , vector ==0.12.*+ , vector >=0.12 && <0.14 default-language: Haskell2010
src/Data/Function/FastMemo.hs view
@@ -1,16 +1,16 @@-{-# OPTIONS_GHC -Wno-orphans #-}- -- | -- Straightforward function memoization library; -- see [Examples](https://github.com/davidspies/fastmemo/blob/master/test/Examples.hs) for example usage-module Data.Function.FastMemo (Memoizable (..), memoizeFixedLen, memo1, memo2, memo3, memo4, memo5, memo6, memo7) where+module Data.Function.FastMemo (AsList (..), Memoizable (..), memoizeFixedLen, memo1, memo2, memo3, memo4, memo5, memo6, memo7) where import Data.Function.FastMemo.ByteString () import Data.Function.FastMemo.Char () import Data.Function.FastMemo.Class (Memoizable (..))+import Data.Function.FastMemo.Containers () import Data.Function.FastMemo.Instances () import Data.Function.FastMemo.Int () import Data.Function.FastMemo.Integer ()+import Data.Function.FastMemo.List (AsList (..)) import Data.Function.FastMemo.Natural () import Data.Function.FastMemo.Ratio () import Data.Function.FastMemo.Util (memoizeFixedLen)
src/Data/Function/FastMemo/ByteString.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE StandaloneDeriving #-} {-# OPTIONS_GHC -Wno-orphans #-} module Data.Function.FastMemo.ByteString () where@@ -5,10 +7,9 @@ import qualified Data.ByteString as SBS import qualified Data.ByteString.Lazy as LBS import Data.Function.FastMemo.Class (Memoizable (..))+import Data.Function.FastMemo.List (AsList (..)) import Data.Function.FastMemo.Word () -instance Memoizable SBS.ByteString where- memoize f = memoize (f . SBS.pack) . SBS.unpack+deriving via (AsList SBS.ByteString) instance Memoizable SBS.ByteString -instance Memoizable LBS.ByteString where- memoize f = memoize (f . LBS.pack) . LBS.unpack+deriving via (AsList LBS.ByteString) instance Memoizable LBS.ByteString
src/Data/Function/FastMemo/Class.hs view
@@ -6,7 +6,6 @@ module Data.Function.FastMemo.Class (Memoizable (..)) where -import Data.List.NonEmpty (NonEmpty) import GHC.Generics class Memoizable a where@@ -21,7 +20,7 @@ gMemoize f = gMemoize (f . M1) . unM1 instance GMemoize V1 where- gMemoize _f = \case+ gMemoize _f = \case {} instance GMemoize U1 where gMemoize f = let fu = f U1 in \U1 -> fu@@ -43,7 +42,3 @@ R1 x -> fR x instance (Memoizable a, Memoizable b) => Memoizable (a, b)--instance Memoizable a => Memoizable [a]--instance Memoizable a => Memoizable (NonEmpty a)
+ src/Data/Function/FastMemo/Containers.hs view
@@ -0,0 +1,34 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Data.Function.FastMemo.Containers () where++import Data.Function.FastMemo.Class (Memoizable (..))+import Data.Function.FastMemo.Int ()+import Data.Function.FastMemo.List (AsList (..))+import Data.IntMap (IntMap)+import Data.IntSet (IntSet)+import Data.Map (Map)+import Data.Sequence (Seq)+import qualified Data.Sequence as Seq+import Data.Set (Set)+import Data.Tree (Tree)++deriving via AsList (Map a b) instance (Ord a, Memoizable a, Memoizable b) => Memoizable (Map a b)++deriving via AsList (Set a) instance (Ord a, Memoizable a) => Memoizable (Set a)++deriving via AsList (IntMap b) instance (Memoizable b) => Memoizable (IntMap b)++deriving via AsList IntSet instance Memoizable IntSet++deriving via AsList (Seq a) instance Memoizable a => Memoizable (Seq a)++instance Memoizable a => Memoizable (Seq.ViewL a)++instance Memoizable a => Memoizable (Seq.ViewR a)++instance Memoizable a => Memoizable (Tree a)
src/Data/Function/FastMemo/Instances.hs view
@@ -6,6 +6,7 @@ import Data.Function.FastMemo.Char () import Data.Function.FastMemo.Class (Memoizable) import Data.Function.FastMemo.Int ()+import Data.Function.FastMemo.List () import Data.Functor.Identity (Identity) import Data.Proxy (Proxy) import Data.Version (Version)
+ src/Data/Function/FastMemo/List.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE UndecidableInstances #-}+{-# OPTIONS_GHC -Wno-orphans #-}++module Data.Function.FastMemo.List (AsList (..)) where++import Data.Function.FastMemo.Class (Memoizable (..))+import Data.List.NonEmpty (NonEmpty)+import GHC.Exts+import qualified GHC.Exts as IsList++instance Memoizable a => Memoizable [a]++instance Memoizable a => Memoizable (NonEmpty a)++newtype AsList t = AsList {unAsList :: t}++instance (IsList t, Memoizable (IsList.Item t)) => Memoizable (AsList t) where+ memoize f = memoize (f . AsList . IsList.fromList) . IsList.toList . unAsList
src/Data/Function/FastMemo/Natural.hs view
@@ -5,6 +5,7 @@ import Data.Bits (shiftL, shiftR, (.|.)) import Data.Foldable (foldl') import Data.Function.FastMemo.Class (Memoizable (..))+import Data.Function.FastMemo.List () import Data.Function.FastMemo.Word () import Data.List.NonEmpty (NonEmpty (..)) import Data.Word (Word8)
src/Data/Function/FastMemo/Vector.hs view
@@ -1,17 +1,17 @@+{-# LANGUAGE DerivingVia #-}+{-# LANGUAGE StandaloneDeriving #-} {-# OPTIONS_GHC -Wno-orphans #-} module Data.Function.FastMemo.Vector () where import Data.Function.FastMemo.Class (Memoizable (..))+import Data.Function.FastMemo.List (AsList (..)) import qualified Data.Vector as V import qualified Data.Vector.Storable as SV import qualified Data.Vector.Unboxed as UV -instance Memoizable a => Memoizable (V.Vector a) where- memoize f = memoize (f . V.fromList) . V.toList+deriving via AsList (V.Vector a) instance Memoizable a => Memoizable (V.Vector a) -instance (SV.Storable a, Memoizable a) => Memoizable (SV.Vector a) where- memoize f = memoize (f . SV.fromList) . SV.toList+deriving via AsList (SV.Vector a) instance (SV.Storable a, Memoizable a) => Memoizable (SV.Vector a) -instance (UV.Unbox a, Memoizable a) => Memoizable (UV.Vector a) where- memoize f = memoize (f . UV.fromList) . UV.toList+deriving via AsList (UV.Vector a) instance (UV.Unbox a, Memoizable a) => Memoizable (UV.Vector a)
test/Spec.hs view
@@ -7,8 +7,14 @@ import Data.Function.FastMemo import Data.Functor (($>)) import Data.Int (Int16, Int32, Int64, Int8)+import Data.IntMap (IntMap)+import Data.IntSet (IntSet)+import Data.Map (Map) import Data.Proxy (Proxy (Proxy)) import Data.Ratio (Ratio)+import Data.Sequence (Seq)+import Data.Set (Set)+import qualified Data.Tree as Containers import Data.Word (Word16, Word32, Word64, Word8) import Examples (Color (Color), Tree (Leaf, Node), fibonacci) import Numeric.Natural (Natural)@@ -60,7 +66,7 @@ prop_bigIntegerMemoizesId :: Property prop_bigIntegerMemoizesId = forAllShrink- (genBigBound >>= \b -> choose (- b, b))+ (genBigBound >>= \b -> choose (-b, b)) shrink prop_memoizesId @@ -137,6 +143,24 @@ prop_ratioMemoizesId :: (Integral a, Memoizable a, Show a) => Ratio a -> Property prop_ratioMemoizesId = prop_memoizesId++prop_intsetMemoizesId :: IntSet -> Property+prop_intsetMemoizesId = prop_memoizesId++prop_intmapMemoizesId :: (Eq a, Memoizable a, Show a) => IntMap a -> Property+prop_intmapMemoizesId = prop_memoizesId++prop_setMemoizesId :: (Ord a, Memoizable a, Show a) => Set a -> Property+prop_setMemoizesId = prop_memoizesId++prop_mapMemoizesId :: (Ord a, Memoizable a, Show a, Eq b, Memoizable b, Show b) => Map a b -> Property+prop_mapMemoizesId = prop_memoizesId++prop_seqMemoizesId :: (Eq a, Memoizable a, Show a) => Seq a -> Property+prop_seqMemoizesId = prop_memoizesId++prop_containerTreeMemoizesId :: (Eq a, Memoizable a, Show a) => Containers.Tree a -> Property+prop_containerTreeMemoizesId = prop_memoizesId deriving instance Eq Color