packages feed

natural 0.1.0.2 → 0.3.0.2

raw patch · 3 files changed

+326/−20 lines, 3 filesdep +semigroupoidsdep ~QuickCheckdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies added: semigroupoids

Dependency ranges changed: QuickCheck, base

API changes (from Hackage documentation)

+ Natural: (!!!) :: NonEmpty a -> Positive -> Maybe a
+ Natural: MaxPositive :: Positive -> MaxPositive
+ Natural: MinPositive :: Positive -> MinPositive
+ Natural: SumPositive :: Positive -> SumPositive
+ Natural: _Positive :: AsPositive a => Prism' a Positive
+ Natural: class AsPositive a
+ Natural: class HasPositive a
+ Natural: data Positive
+ Natural: drop1 :: Positive -> NonEmpty a -> [a]
+ Natural: elemIndex1 :: Eq a => a -> NonEmpty a -> Maybe Positive
+ Natural: elemIndices1 :: Eq a => a -> NonEmpty a -> [Positive]
+ Natural: findIndex1 :: (a -> Bool) -> NonEmpty a -> Maybe Positive
+ Natural: findIndices1 :: (a -> Bool) -> NonEmpty a -> [Positive]
+ Natural: instance (Natural.MaxPositive ~ a) => Control.Lens.Wrapped.Rewrapped Natural.MaxPositive a
+ Natural: instance (Natural.MinPositive ~ a) => Control.Lens.Wrapped.Rewrapped Natural.MinPositive a
+ Natural: instance (Natural.SumPositive ~ a) => Control.Lens.Wrapped.Rewrapped Natural.SumPositive a
+ Natural: instance Control.Lens.Wrapped.Wrapped Natural.MaxPositive
+ Natural: instance Control.Lens.Wrapped.Wrapped Natural.MinPositive
+ Natural: instance Control.Lens.Wrapped.Wrapped Natural.SumPositive
+ Natural: instance GHC.Base.Monoid Natural.Positive
+ Natural: instance GHC.Base.Semigroup Natural.MaxPositive
+ Natural: instance GHC.Base.Semigroup Natural.MinPositive
+ Natural: instance GHC.Base.Semigroup Natural.Positive
+ Natural: instance GHC.Base.Semigroup Natural.SumPositive
+ Natural: instance GHC.Classes.Eq Natural.MaxPositive
+ Natural: instance GHC.Classes.Eq Natural.MinPositive
+ Natural: instance GHC.Classes.Eq Natural.Positive
+ Natural: instance GHC.Classes.Eq Natural.SumPositive
+ Natural: instance GHC.Classes.Ord Natural.MaxPositive
+ Natural: instance GHC.Classes.Ord Natural.MinPositive
+ Natural: instance GHC.Classes.Ord Natural.Positive
+ Natural: instance GHC.Classes.Ord Natural.SumPositive
+ Natural: instance GHC.Real.Integral a => Natural.AsPositive (Data.Functor.Const.Const a b)
+ Natural: instance GHC.Real.Integral a => Natural.AsPositive (Data.Functor.Identity.Identity a)
+ Natural: instance GHC.Show.Show Natural.MaxPositive
+ Natural: instance GHC.Show.Show Natural.MinPositive
+ Natural: instance GHC.Show.Show Natural.Positive
+ Natural: instance GHC.Show.Show Natural.SumPositive
+ Natural: instance Natural.AsPositive GHC.Integer.Type.Integer
+ Natural: instance Natural.AsPositive GHC.Types.Int
+ Natural: instance Natural.AsPositive GHC.Types.Word
+ Natural: instance Natural.AsPositive Natural.MaxPositive
+ Natural: instance Natural.AsPositive Natural.MinPositive
+ Natural: instance Natural.AsPositive Natural.Positive
+ Natural: instance Natural.AsPositive Natural.SumPositive
+ Natural: instance Natural.HasPositive Natural.MaxPositive
+ Natural: instance Natural.HasPositive Natural.MinPositive
+ Natural: instance Natural.HasPositive Natural.Positive
+ Natural: instance Natural.HasPositive Natural.SumPositive
+ Natural: length1 :: Foldable1 f => f a -> Positive
+ Natural: list1 :: Iso' Positive (NonEmpty ())
+ Natural: minus1 :: Positive -> Positive -> Positive
+ Natural: newtype MaxPositive
+ Natural: newtype MinPositive
+ Natural: newtype SumPositive
+ Natural: notZero :: Prism' Natural Positive
+ Natural: positive :: HasPositive a => Lens' a Positive
+ Natural: replicate1 :: Positive -> a -> NonEmpty a
+ Natural: splitAt1 :: Positive -> NonEmpty a -> (NonEmpty a, [a])
+ Natural: successor1 :: Prism' Positive Positive
+ Natural: successor1' :: Positive -> Positive
+ Natural: successorW :: Iso' Natural Positive
+ Natural: take1 :: Positive -> NonEmpty a -> NonEmpty a
- Natural: one :: Prism' Natural ()
+ Natural: one :: Prism' Positive ()
- Natural: one' :: Natural
+ Natural: one' :: Positive

Files

changelog.md view
@@ -1,3 +1,14 @@+0.3.0.2++* fix bug in `zero` and `one` prisms.+* rename `Natural` to `Positive`.+* rename `Whole` to `Natural`.++0.2.0.2++* change `data Natural` to have a minimum bound of 1.+* add `data Whole` which has a minimum bound of 0.+ 0.1.0.2  * add `minus` function.
natural.cabal view
@@ -1,7 +1,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                natural-version:             0.1.0.2+version:             0.3.0.2 synopsis:            Natural number description:          <<http://i.imgur.com/uZnp9ke.png>>@@ -28,6 +28,7 @@   exposed-modules:     Natural   build-depends:       base >=4.8 && <4.12                      , lens >=4.15 && < 4.18+                     , semigroupoids >= 5 && < 6   hs-source-dirs:      src   default-language:    Haskell2010   ghc-options:         -Wall
src/Natural.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} -module Natural(+module Natural (   Natural , HasNatural(..) , AsNatural(..)@@ -12,8 +12,6 @@ , MinNatural(..) , zero , zero'-, one-, one' , successor , successor' , length@@ -28,11 +26,35 @@ , elemIndex , minus , list+, Positive+, HasPositive(..)+, AsPositive(..)+, SumPositive(..)+, MaxPositive(..)+, MinPositive(..)+, one+, one'+, successor1+, successor1'+, successorW+, notZero+, length1+, replicate1+, take1+, drop1+, splitAt1+, (!!!)+, findIndices1+, findIndex1+, elemIndices1+, elemIndex1+, minus1+, list1 ) where  import Control.Applicative(Const) import Control.Category((.), id)-import Control.Lens(Wrapped(_Wrapped', Unwrapped), Rewrapped, Prism', Lens', Iso', (^?), ( # ), _Wrapped, prism', iso)+import Control.Lens(Wrapped(_Wrapped', Unwrapped), Rewrapped, Prism', Lens', Iso', (^?), ( # ), (^.), _Wrapped, prism', iso) import Control.Monad((>>=)) import Data.Bool(Bool) import Data.Eq(Eq((==)))@@ -41,10 +63,13 @@ import Data.Functor.Identity(Identity) import Data.Int(Int) import Data.List(iterate, zip, filter, map, repeat)+import Data.List.NonEmpty(NonEmpty((:|)))+import qualified Data.List.NonEmpty as NonEmpty(iterate, zip, filter) import Data.Maybe(listToMaybe, Maybe(Just, Nothing)) import Data.Monoid(Monoid(mappend, mempty)) import Data.Ord(Ord((<)), min, max) import Data.Semigroup(Semigroup((<>)))+import Data.Semigroup.Foldable(Foldable1(foldMap1)) import Data.Tuple(fst, snd) import Data.Word(Word) import Prelude(Show, Integral, Integer, (-), (+), (*), fromIntegral)@@ -208,27 +233,13 @@ zero =   prism'     (\() -> Natural 0)-    (\(Natural n) -> if n == 0 then Nothing else Just ())+    (\(Natural n) -> if n == 0 then Just () else Nothing)  zero' ::   Natural zero' =   zero # () -one ::-  Prism'-    Natural-    ()-one =-  prism'-    (\() -> Natural 1)-    (\(Natural n) -> if n == 1 then Nothing else Just ())--one' ::-  Natural-one' =-  one # ()- successor ::   Prism'     Natural@@ -345,3 +356,286 @@   iso     (\n -> replicate n ())     length++----++newtype Positive =+  Positive+    Integer+  deriving (Eq, Ord, Show)++instance Semigroup Positive where+  Positive x <> Positive y =+    Positive (x + y)++instance Monoid Positive where+  mappend =+    (<>)+  mempty =+    Positive 0++class HasPositive a where+  positive ::+    Lens'+      a+      Positive++instance HasPositive Positive where+  positive =+    id++class AsPositive a where+  _Positive ::+    Prism'+      a+      Positive++instance AsPositive Positive where+  _Positive =+    id++integralPrism1 ::+  Integral a =>+  Prism'+    a+    Positive+integralPrism1 =+  prism'+    (\(Positive n) -> fromIntegral n)+    (\n -> if n < 1 then Nothing else Just (Positive (fromIntegral n)))++instance AsPositive Int where+  _Positive =+    integralPrism1++instance AsPositive Integer where+  _Positive =+    integralPrism1++instance AsPositive Word where+  _Positive =+    integralPrism1++instance Integral a => AsPositive (Const a b) where+  _Positive =+    integralPrism1++instance Integral a => AsPositive (Identity a) where+  _Positive =+    integralPrism1++newtype SumPositive =+  SumPositive+    Positive+  deriving (Eq, Ord, Show)++instance HasPositive SumPositive where+  positive =+    _Wrapped . positive++instance AsPositive SumPositive where+  _Positive =+    _Wrapped . _Positive++instance SumPositive ~ a =>+  Rewrapped SumPositive a+  +instance Wrapped SumPositive where+  type Unwrapped SumPositive = Positive+  _Wrapped' =+    iso+      (\(SumPositive x) -> x)+      SumPositive++instance Semigroup SumPositive where+  SumPositive (Positive x) <> SumPositive (Positive y) =+    SumPositive (Positive (x + y))++newtype MaxPositive =+  MaxPositive+    Positive+  deriving (Eq, Ord, Show)++instance HasPositive MaxPositive where+  positive =+    _Wrapped . positive++instance AsPositive MaxPositive where+  _Positive =+    _Wrapped . _Positive++instance MaxPositive ~ a =>+  Rewrapped MaxPositive a+  +instance Wrapped MaxPositive where+  type Unwrapped MaxPositive = Positive+  _Wrapped' =+    iso+      (\(MaxPositive x) -> x)+      MaxPositive++instance Semigroup MaxPositive where+  MaxPositive (Positive x) <> MaxPositive (Positive y) =+    MaxPositive (Positive (x `max` y))++newtype MinPositive =+  MinPositive+    Positive+  deriving (Eq, Ord, Show)++instance HasPositive MinPositive where+  positive =+    _Wrapped . positive++instance AsPositive MinPositive where+  _Positive =+    _Wrapped . _Positive++instance MinPositive ~ a =>+  Rewrapped MinPositive a+  +instance Wrapped MinPositive where+  type Unwrapped MinPositive = Positive+  _Wrapped' =+    iso+      (\(MinPositive x) -> x)+      MinPositive++instance Semigroup MinPositive where+  MinPositive (Positive x) <> MinPositive (Positive y) =+    MinPositive (Positive (x `min` y))++one ::+  Prism'+    Positive+    ()+one =+  prism'+    (\() -> Positive 1)+    (\(Positive n) -> if n == 1 then Just () else Nothing)++one' ::+  Positive+one' =+  one # ()++successor1 ::+  Prism'+    Positive+    Positive+successor1 =+  prism'+    (\(Positive n) -> Positive (n + 1))+    (\(Positive n) -> if n == 1 then Nothing else Just (Positive (n - 1)))++successor1' ::+  Positive+  -> Positive+successor1' =+  (successor1 #)++successorW ::+  Iso'+    Natural+    Positive+successorW =+  iso+    (\(Natural n) -> Positive (n + 1))+    (\(Positive n) -> Natural (n - 1))++notZero ::+  Prism'+    Natural+    Positive+notZero =+  prism'+    (\(Positive n) -> Natural n)+    (\(Natural n) -> if n == 0 then Nothing else Just (Positive n))++length1 ::+  Foldable1 f =>+  f a+  -> Positive+length1 x =+  foldMap1 (const (SumPositive one')) x ^. _Wrapped++replicate1 ::+  Positive+  -> a+  -> NonEmpty a+replicate1 n a =+  take1 n (a :| repeat a)++take1 ::+  Positive+  -> NonEmpty a+  -> NonEmpty a+take1 n (h:|t) =+  h :| take (successorW # n) t++drop1 ::+  Positive+  -> NonEmpty a+  -> [a]+drop1 n (_:|t) =+  drop (successorW # n) t++splitAt1 ::+  Positive+  -> NonEmpty a+  -> (NonEmpty a, [a])+splitAt1 n x =+  (take1 n x, drop1 n x)++(!!!) ::+  NonEmpty a+  -> Positive+  -> Maybe a+(_:|t) !!! n =+  t !! (successorW # n)++findIndices1 ::+  (a -> Bool)+  -> NonEmpty a+  -> [Positive]+findIndices1 p x =+  map snd (NonEmpty.filter (p . fst) (NonEmpty.zip x (NonEmpty.iterate successor1' one')))+  +findIndex1 ::+  (a -> Bool)+  -> NonEmpty a+  -> Maybe Positive+findIndex1 p =+  listToMaybe . findIndices1 p++elemIndices1 ::+  Eq a =>+  a+  -> NonEmpty a+  -> [Positive]+elemIndices1 =+  findIndices1 . (==)++elemIndex1 ::+  Eq a =>+  a+  -> NonEmpty a+  -> Maybe Positive+elemIndex1 =+  findIndex1 . (==)++minus1 ::+  Positive+  -> Positive+  -> Positive+minus1 (Positive x) (Positive y) =+  Positive (if x < y then 1 else x - y)++list1 ::+  Iso'+    Positive+    (NonEmpty ())+list1 =+  iso+    (\n -> replicate1 n ())+    length1