packages feed

digit 0.2.9 → 0.3.0

raw patch · 8 files changed

+791/−526 lines, 8 filesdep ~basedep ~lensdep ~papanew-uploaderPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base, lens, papa, template-haskell

API changes (from Hackage documentation)

- Data.Digit: (.*.) :: Digits -> Digits -> Digits
- Data.Digit: (.+.) :: Digits -> Digits -> Digits
- Data.Digit: data Digits
- Data.Digit: digitC :: Prism' Char Digit
- Data.Digit: digitlist :: Integral a => Prism' a [Digit]
- Data.Digit: digits :: Integral a => Prism' a Digits
- Data.Digit: digitsI :: Iso' [Digit] Digits
- Data.Digit: digitsS :: Prism' String Digits
- Data.Digit: instance Control.Lens.At.Ixed Data.Digit.Digits
- Data.Digit: instance Control.Lens.Cons.Cons Data.Digit.Digits Data.Digit.Digits Data.Digit.Digit Data.Digit.Digit
- Data.Digit: instance Control.Lens.Cons.Snoc Data.Digit.Digits Data.Digit.Digits Data.Digit.Digit Data.Digit.Digit
- Data.Digit: instance Control.Lens.Each.Each Data.Digit.Digits Data.Digit.Digits Data.Digit.Digit Data.Digit.Digit
- Data.Digit: instance Control.Lens.Empty.AsEmpty Data.Digit.Digits
- Data.Digit: instance Control.Lens.Internal.Iso.Reversing Data.Digit.Digits
- Data.Digit: instance Control.Lens.Plated.Plated Data.Digit.Digits
- Data.Digit: instance Data.Data.Data Data.Digit.Digits
- Data.Digit: instance Data.Semigroup.Semigroup Data.Digit.Digits
- Data.Digit: instance GHC.Base.Monoid Data.Digit.Digits
- Data.Digit: instance GHC.Classes.Eq Data.Digit.Digits
- Data.Digit: instance GHC.Classes.Ord Data.Digit.Digits
- Data.Digit: instance GHC.Show.Show Data.Digit.Digits
- Data.Digit: mantissa :: Floating a => Digits -> a
- Data.Digit: parsedigitlist :: (Monad p, CharParsing p) => p [Digit]
- Data.Digit: parsedigitlist1 :: (Monad p, CharParsing p) => p (NonEmpty Digit)
- Data.Digit: parsedigits :: (Monad p, CharParsing p) => p Digits
- Data.Digit: parsenotdigit :: CharParsing p => p Char
- Data.Digit: parsenotdigits :: CharParsing p => p String
- Data.Digit: parsenotdigits1 :: CharParsing p => p String
- Data.Digit: skipdigitlist :: (Monad p, CharParsing p) => p ()
- Data.Digit: skipdigitlist1 :: (Monad p, CharParsing p) => p ()
- Data.Digit: skipnotdigits :: CharParsing p => p ()
- Data.Digit: skipnotdigits1 :: CharParsing p => p ()
+ Data.Digit: absrem10 :: Integral a => a -> Digit
+ Data.Digit: class AsDigit a
+ Data.Digit: class ManyDigit a
+ Data.Digit: digitT :: ManyDigit a => Traversal' a Digit
+ Data.Digit: instance Data.Digit.AsDigit Data.Digit.Digit
+ Data.Digit: instance Data.Digit.AsDigit GHC.Int.Int16
+ Data.Digit: instance Data.Digit.AsDigit GHC.Int.Int32
+ Data.Digit: instance Data.Digit.AsDigit GHC.Int.Int64
+ Data.Digit: instance Data.Digit.AsDigit GHC.Int.Int8
+ Data.Digit: instance Data.Digit.AsDigit GHC.Integer.Type.Integer
+ Data.Digit: instance Data.Digit.AsDigit GHC.Types.Char
+ Data.Digit: instance Data.Digit.AsDigit GHC.Types.Int
+ Data.Digit: instance Data.Digit.AsDigit GHC.Types.Word
+ Data.Digit: instance Data.Digit.ManyDigit Data.Digit.Digit
+ Data.Digit: instance GHC.Real.Integral a => Data.Digit.AsDigit (Data.Functor.Const.Const a b)
+ Data.Digit: instance GHC.Real.Integral a => Data.Digit.AsDigit (Data.Functor.Identity.Identity a)
+ Data.Digits: Digits :: [Digit] -> Digits
+ Data.Digits: _Digits :: AsDigits a => Prism' a Digits
+ Data.Digits: class AsDigits a
+ Data.Digits: class HasDigits a
+ Data.Digits: class ManyDigits a
+ Data.Digits: digitsL :: HasDigits a => Lens' a Digits
+ Data.Digits: digitsT :: ManyDigits a => Traversal' a Digits
+ Data.Digits: instance Control.Lens.At.Ixed Data.Digits.Digits
+ Data.Digits: instance Control.Lens.Cons.Cons Data.Digits.Digits Data.Digits.Digits Data.Digit.Digit Data.Digit.Digit
+ Data.Digits: instance Control.Lens.Cons.Snoc Data.Digits.Digits Data.Digits.Digits Data.Digit.Digit Data.Digit.Digit
+ Data.Digits: instance Control.Lens.Each.Each Data.Digits.Digits Data.Digits.Digits Data.Digit.Digit Data.Digit.Digit
+ Data.Digits: instance Control.Lens.Empty.AsEmpty Data.Digits.Digits
+ Data.Digits: instance Control.Lens.Internal.Iso.Reversing Data.Digits.Digits
+ Data.Digits: instance Control.Lens.Plated.Plated Data.Digits.Digits
+ Data.Digits: instance Control.Lens.Wrapped.Wrapped Data.Digits.Digits
+ Data.Digits: instance Data.Data.Data Data.Digits.Digits
+ Data.Digits: instance Data.Digit.AsDigit a => Data.Digits.AsDigits [a]
+ Data.Digits: instance Data.Digit.ManyDigit Data.Digits.Digits
+ Data.Digits: instance Data.Digits.AsDigits Data.Digits.Digits
+ Data.Digits: instance Data.Digits.Digits ~ t0 => Control.Lens.Wrapped.Rewrapped Data.Digits.Digits t0
+ Data.Digits: instance Data.Digits.HasDigits Data.Digits.Digits
+ Data.Digits: instance Data.Digits.ManyDigits Data.Digits.Digits
+ Data.Digits: instance Data.Digits1.AsDigits1 Data.Digits.Digits
+ Data.Digits: instance Data.Semigroup.Semigroup Data.Digits.Digits
+ Data.Digits: instance GHC.Base.Monoid Data.Digits.Digits
+ Data.Digits: instance GHC.Classes.Eq Data.Digits.Digits
+ Data.Digits: instance GHC.Classes.Ord Data.Digits.Digits
+ Data.Digits: instance GHC.Show.Show Data.Digits.Digits
+ Data.Digits: newtype Digits
+ Data.Digits: parsedigits :: CharParsing p => p Digits
+ Data.Digits1: Digits1 :: (NonEmpty Digit) -> Digits1
+ Data.Digits1: _Digits1 :: AsDigits1 a => Prism' a Digits1
+ Data.Digits1: class AsDigits1 a
+ Data.Digits1: class HasDigits1 a
+ Data.Digits1: class ManyDigits1 a
+ Data.Digits1: digits1L :: HasDigits1 a => Lens' a Digits1
+ Data.Digits1: digits1T :: ManyDigits1 a => Traversal' a Digits1
+ Data.Digits1: instance Control.Lens.At.Ixed Data.Digits1.Digits1
+ Data.Digits1: instance Control.Lens.Cons.Cons Data.Digits1.Digits1 Data.Digits1.Digits1 Data.Digit.Digit Data.Digit.Digit
+ Data.Digits1: instance Control.Lens.Cons.Snoc Data.Digits1.Digits1 Data.Digits1.Digits1 Data.Digit.Digit Data.Digit.Digit
+ Data.Digits1: instance Control.Lens.Each.Each Data.Digits1.Digits1 Data.Digits1.Digits1 Data.Digit.Digit Data.Digit.Digit
+ Data.Digits1: instance Control.Lens.Internal.Iso.Reversing Data.Digits1.Digits1
+ Data.Digits1: instance Control.Lens.Plated.Plated Data.Digits1.Digits1
+ Data.Digits1: instance Control.Lens.Wrapped.Wrapped Data.Digits1.Digits1
+ Data.Digits1: instance Data.Data.Data Data.Digits1.Digits1
+ Data.Digits1: instance Data.Digit.AsDigit a => Data.Digits1.AsDigits1 (Data.List.NonEmpty.NonEmpty a)
+ Data.Digits1: instance Data.Digit.AsDigit a => Data.Digits1.AsDigits1 [a]
+ Data.Digits1: instance Data.Digit.ManyDigit Data.Digits1.Digits1
+ Data.Digits1: instance Data.Digits1.AsDigits1 Data.Digits1.Digits1
+ Data.Digits1: instance Data.Digits1.Digits1 ~ t0 => Control.Lens.Wrapped.Rewrapped Data.Digits1.Digits1 t0
+ Data.Digits1: instance Data.Digits1.HasDigits1 Data.Digits1.Digits1
+ Data.Digits1: instance Data.Digits1.ManyDigits1 Data.Digits1.Digits1
+ Data.Digits1: instance Data.Semigroup.Semigroup Data.Digits1.Digits1
+ Data.Digits1: instance GHC.Classes.Eq Data.Digits1.Digits1
+ Data.Digits1: instance GHC.Classes.Ord Data.Digits1.Digits1
+ Data.Digits1: instance GHC.Show.Show Data.Digits1.Digits1
+ Data.Digits1: newtype Digits1
+ Data.Digits1: parsedigitlist1 :: CharParsing p => p Digits1
- Data.Digit: class D0 d
+ Data.Digit: class D0 d where x0 = d0 # ()
- Data.Digit: class D1 d
+ Data.Digit: class D1 d where x1 = d1 # ()
- Data.Digit: class D2 d
+ Data.Digit: class D2 d where x2 = d2 # ()
- Data.Digit: class D3 d
+ Data.Digit: class D3 d where x3 = d3 # ()
- Data.Digit: class D4 d
+ Data.Digit: class D4 d where x4 = d4 # ()
- Data.Digit: class D5 d
+ Data.Digit: class D5 d where x5 = d5 # ()
- Data.Digit: class D6 d
+ Data.Digit: class D6 d where x6 = d6 # ()
- Data.Digit: class D7 d
+ Data.Digit: class D7 d where x7 = d7 # ()
- Data.Digit: class D8 d
+ Data.Digit: class D8 d where x8 = d8 # ()
- Data.Digit: class D9 d
+ Data.Digit: class D9 d where x9 = d9 # ()
- Data.Digit: digit :: Integral a => Prism' a Digit
+ Data.Digit: digit :: AsDigit a => Prism' a Digit
- Data.Digit: parsedigit :: (Monad p, CharParsing p) => p Digit
+ Data.Digit: parsedigit :: CharParsing p => p Digit
- Data.Digit: x0 :: D0 d => d
+ Data.Digit: x0 :: (D0 d, D0 d) => d
- Data.Digit: x1 :: D1 d => d
+ Data.Digit: x1 :: (D1 d, D1 d) => d
- Data.Digit: x2 :: D2 d => d
+ Data.Digit: x2 :: (D2 d, D2 d) => d
- Data.Digit: x3 :: D3 d => d
+ Data.Digit: x3 :: (D3 d, D3 d) => d
- Data.Digit: x4 :: D4 d => d
+ Data.Digit: x4 :: (D4 d, D4 d) => d
- Data.Digit: x5 :: D5 d => d
+ Data.Digit: x5 :: (D5 d, D5 d) => d
- Data.Digit: x6 :: D6 d => d
+ Data.Digit: x6 :: (D6 d, D6 d) => d
- Data.Digit: x7 :: D7 d => d
+ Data.Digit: x7 :: (D7 d, D7 d) => d
- Data.Digit: x8 :: D8 d => d
+ Data.Digit: x8 :: (D8 d, D8 d) => d
- Data.Digit: x9 :: D9 d => d
+ Data.Digit: x9 :: (D9 d, D9 d) => d

Files

+ CONTRIBUTORS view
@@ -0,0 +1,33 @@+Tony Morris+tmorris@tmorris.net+http://tmorris.net/+-----BEGIN PGP PUBLIC KEY BLOCK-----+Version: GnuPG v1.4.6 (GNU/Linux)++mQGiBETNyC0RBAC3MYSZSbDZhBLKra2YUphB9OO6+qMFl/v2Lq8590ZfeE2WjIOu+c/KGKyOigXztMrA4+iekUjM4FA8E6AlBRQiAqZK8HF0ftX5hDpuSyEKkZe3jcxxI+BbhwX/SWHtDEVzwNmvO1wEnwhRE1oY/BCmy+bQ9wmAjlNav4UbOIcXcJUwCgz6FF+UwDvPxzybgd9FNS14BE37n8D/AzGmGjunBW/x+g/ndwu6WEpTEn1ZNdja6VrNXSG+xQ8XM+NBulroAIYX+YWdHsKnuGvSKCgVoc1ifVHdztA9sksID5GBGzhmVbIP2E16+w/LEzqqwruv9dX0Y1b7n8hcnvbl4DgEgLgeQ+VgJfLUkY2jFZ2m3dEBRH9USSgB/+V2pBBACP4Us2ZBYEXtMG29g6GqyeeJLEP34PLYVHWJZbet/wPQsHFhYahhzjwZGG+Srp0JUpegJOdaqX/Y0nio2whgCpqJcrbGuUBqNgQI3k4gvBwnPyx7jM0kfHfFORG+lq9SDbfLpV0EJx6fWXGStW33zsQQvenDcV2F5czzKQcy66BFwbQhVG9ueSBNb3Jy+aXMgPHRtb3JyaXNAdG1vcnJpcy5uZXQ+iGMEExECACMFAkTNyC0FCQlmAYAGCwkI+BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCaemCth7qvrf0pAKCFii2pI2W1BKVFuQcw+yoNxP0CAUACgyhuI9isCvtrOkeyjDmCVueRCdaC5Ag0ERM3IThAIAJ6A1z+d40ve+WvPIhpFiGfoS8UX4YdgYpo2mC/orY0xszBitogtaTHQHU5YDemGg81plNg9I3DbM+Er8uyONV4DqF6RbLj4w+iA6zn93+PTEZ73ydhxF6vDuojpVZPXVzXzpgyXHkEVLC+3hKL9oVlEsh+DWCvCiSAIy780JZ3FNVuMC3VH4qKxTw0CwPuuZvVfnMoIRfpODRR+fVEk2VDor+lr8kqJkBaHgN5o/AvOXC7QCYadwbEkpr0ecxIZ1VcASYytIIM3YNL7+ZcHWwU5PCNLOdMXPqOdthhDhsHkKJNEXXr0YsjX/bQqYOUqYKPDyqh/yrrRO9Ro6+7eTSbfIguycAAwcH/2waLIQR8qYKxPknNuSdsOOqF2jf2gglL/7uMsIzjfkFzgHo++GNHw9tmlZqD3yzaZ/N7Yv08ujRHhmWPBYAWRICBM3qo0zMJ9kI5XWRobeRQpLtf+YxxIOenq8R9t6YU9ryHdqf+P+Fi38eN5ERTDhNLrJOnO5/TA+of97BWCmdtJMlWM+RaHtqXxwo02Yi65IqKx6L7oOvT7Gh4NV2eglz8ZafPEoP8+V8ER7rwBYPiLk4Mse+oVImjveq2dmLUip9OPwznoaeyC8zB0mJ13m/KNC+CffkBgoXpMPiKzbu5YTjVw+++MlEmfgL42yDK0hnokmW2i9y1RBh/T1VQQeQbUaeITAQYEQIADAUCRM3ITgUJCWYB+gAAKCRCaemCth7qvrcbtAJ9j3C6lKNRB3uKcrfze66jAVQh0qACaAysOK82TcQ/2+73ryR0xWMFnpGqg=+=bMTb+-----END PGP PUBLIC KEY BLOCK-----
+ LICENCE view
@@ -0,0 +1,32 @@+Copyright (C) 2010-2016 NICTA Limited+Copyright (c) 2017, Commonwealth Scientific and Industrial Research Organisation+(CSIRO) ABN 41 687 119 230.++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * 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.++    * Neither the name of QFPL nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 COPYRIGHT+OWNER 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.
digit.cabal view
@@ -1,25 +1,26 @@ name:               digit-version:            0.2.9+version:            0.3.0 license:            BSD3-license-File:       etc/LICENCE-author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ>-maintainer:         Tony Morris+license-file:       LICENCE+author:             Queensland Functional Programming Lab <oᴉ˙ldɟb@llǝʞsɐɥ>+maintainer:         Queensland Functional Programming Lab <oᴉ˙ldɟb@llǝʞsɐɥ> copyright:          Copyright (C) 2010-2016 NICTA Limited+copyright:          Copyright (c) 2017, Commonwealth Scientific and Industrial Research Organisation (CSIRO) ABN 41 687 119 230. synopsis:           A data-type representing digits 0-9 and other combinations category:           Data-homepage:           https://github.com/NICTA/digit-bug-reports:        https://github.com/NICTA/digit/issues+homepage:           https://github.com/qfpl/digit+bug-reports:        https://github.com/qfpl/digit/issues cabal-version:      >= 1.10 build-type:         Custom-extra-source-files: etc/CONTRIBUTORS, changelog.md+extra-source-files: CONTRIBUTORS, changelog.md description:-  <<http://i.imgur.com/Ns5hntl.jpg>>+  <<http://i.imgur.com/uZnp9ke.png>>   .   @Digit@ is a data-type that represents the digits 0-9 and other combinations.  source-repository   head   type:             git-  location:         git@github.com:NICTA/digit.git+  location:         git@github.com:qfpl/digit.git  flag                small_base   description:      Choose the new, split-up base package.@@ -29,12 +30,12 @@                     Haskell2010    build-depends:-                    base < 5 && >= 4.8-                    , lens >= 4.3.3 && < 5.0-                    , parsers >= 0.12.3 && < 0.13-                    , semigroups >= 0.12 && < 1.0-                    , template-haskell >= 2.8-                    , papa+                    base               >= 4.7 && < 5+                    , lens             >= 4.0 && < 5+                    , parsers          >= 0.12.3 && < 0.13+                    , semigroups       >= 0.12 && < 1.0+                    , template-haskell >= 2.8 && < 3+                    , papa             >= 0.3 && < 0.4                        ghc-options:                     -Wall@@ -44,6 +45,8 @@    exposed-modules:                     Data.Digit+                    Data.Digits+                    Data.Digits1  test-suite doctests   type:@@ -63,6 +66,7 @@                     , QuickCheck >= 2.0                     , template-haskell >= 2.8                     , parsec >= 3.1+                       ghc-options:                     -Wall                     -threaded
− etc/CONTRIBUTORS
@@ -1,33 +0,0 @@-Tony Morris-tmorris@tmorris.net-http://tmorris.net/------BEGIN PGP PUBLIC KEY BLOCK------Version: GnuPG v1.4.6 (GNU/Linux)--mQGiBETNyC0RBAC3MYSZSbDZhBLKra2YUphB9OO6+qMFl/v2Lq8590ZfeE2WjIOu-c/KGKyOigXztMrA4+iekUjM4FA8E6AlBRQiAqZK8HF0ftX5hDpuSyEKkZe3jcxxI-BbhwX/SWHtDEVzwNmvO1wEnwhRE1oY/BCmy+bQ9wmAjlNav4UbOIcXcJUwCgz6FF-UwDvPxzybgd9FNS14BE37n8D/AzGmGjunBW/x+g/ndwu6WEpTEn1ZNdja6VrNXSG-xQ8XM+NBulroAIYX+YWdHsKnuGvSKCgVoc1ifVHdztA9sksID5GBGzhmVbIP2E16-w/LEzqqwruv9dX0Y1b7n8hcnvbl4DgEgLgeQ+VgJfLUkY2jFZ2m3dEBRH9USSgB/-V2pBBACP4Us2ZBYEXtMG29g6GqyeeJLEP34PLYVHWJZbet/wPQsHFhYahhzjwZGG-Srp0JUpegJOdaqX/Y0nio2whgCpqJcrbGuUBqNgQI3k4gvBwnPyx7jM0kfHfFORG-lq9SDbfLpV0EJx6fWXGStW33zsQQvenDcV2F5czzKQcy66BFwbQhVG9ueSBNb3Jy-aXMgPHRtb3JyaXNAdG1vcnJpcy5uZXQ+iGMEExECACMFAkTNyC0FCQlmAYAGCwkI-BwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCaemCth7qvrf0pAKCFii2pI2W1BKVFuQcw-yoNxP0CAUACgyhuI9isCvtrOkeyjDmCVueRCdaC5Ag0ERM3IThAIAJ6A1z+d40ve-WvPIhpFiGfoS8UX4YdgYpo2mC/orY0xszBitogtaTHQHU5YDemGg81plNg9I3DbM-Er8uyONV4DqF6RbLj4w+iA6zn93+PTEZ73ydhxF6vDuojpVZPXVzXzpgyXHkEVLC-3hKL9oVlEsh+DWCvCiSAIy780JZ3FNVuMC3VH4qKxTw0CwPuuZvVfnMoIRfpODRR-fVEk2VDor+lr8kqJkBaHgN5o/AvOXC7QCYadwbEkpr0ecxIZ1VcASYytIIM3YNL7-ZcHWwU5PCNLOdMXPqOdthhDhsHkKJNEXXr0YsjX/bQqYOUqYKPDyqh/yrrRO9Ro6-7eTSbfIguycAAwcH/2waLIQR8qYKxPknNuSdsOOqF2jf2gglL/7uMsIzjfkFzgHo-+GNHw9tmlZqD3yzaZ/N7Yv08ujRHhmWPBYAWRICBM3qo0zMJ9kI5XWRobeRQpLtf-YxxIOenq8R9t6YU9ryHdqf+P+Fi38eN5ERTDhNLrJOnO5/TA+of97BWCmdtJMlWM-RaHtqXxwo02Yi65IqKx6L7oOvT7Gh4NV2eglz8ZafPEoP8+V8ER7rwBYPiLk4Mse-oVImjveq2dmLUip9OPwznoaeyC8zB0mJ13m/KNC+CffkBgoXpMPiKzbu5YTjVw++-MlEmfgL42yDK0hnokmW2i9y1RBh/T1VQQeQbUaeITAQYEQIADAUCRM3ITgUJCWYB-gAAKCRCaemCth7qvrcbtAJ9j3C6lKNRB3uKcrfze66jAVQh0qACaAysOK82TcQ/2-73ryR0xWMFnpGqg=-=bMTb------END PGP PUBLIC KEY BLOCK-----
− etc/LICENCE
@@ -1,27 +0,0 @@-Copyright 2013 NICTA Limited--All rights reserved.--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 REGENTS AND 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.
src/Data/Digit.hs view
@@ -4,83 +4,42 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE NoImplicitPrelude #-}  -- | A data type with ten nullary constructors [0-9] and combinators. module Data.Digit (--- * Data type   Digit--- * Destructors , foldDigit--- * Lenses , HasDigit(..)--- * Prisms+, AsDigit(..)+, ManyDigit(..) , D0(..)-, x0 , D1(..)-, x1 , D2(..)-, x2 , D3(..)-, x3 , D4(..)-, x4 , D5(..)-, x5 , D6(..)-, x6 , D7(..)-, x7 , D8(..)-, x8 , D9(..)-, x9-, digit-, digitC-, digitlist--- * mod operations , mod10+, absrem10 , divMod10--- * Parsers , parsedigit-, parsedigitlist-, parsedigits-, parsedigitlist1-, skipdigitlist-, skipdigitlist1-, parsenotdigit-, parsenotdigits-, parsenotdigits1-, skipnotdigits-, skipnotdigits1--- * Quasi-Quoters , digitQ--- * Digits-, Digits-, digits-, digitsI-, digitsS , (/+/)-, (.+.)-, (.*.)-, mantissa ) where -import Control.Applicative(many, some) import Data.Data (Data)-import Data.Foldable(foldl', asum)-import Data.List(unfoldr)-import Data.List.NonEmpty(some1) import Data.Maybe(fromMaybe)-import Data.Monoid(mappend)-import Data.Semigroup((<>))-import Data.String(String) import Data.Typeable (Typeable) import Language.Haskell.TH(ExpQ, PatQ, varE, varP, mkName) import Language.Haskell.TH.Quote(QuasiQuoter(QuasiQuoter), quotePat, quoteExp, quoteDec, dataToExpQ, dataToPatQ, quoteType) import Prelude(fromEnum, Bounded, error) -- livin on the edge-import Text.Parser.Char(CharParsing, char, satisfy)-import Text.Parser.Combinators(skipMany, skipSome, (<?>))+import Text.Parser.Char(CharParsing, char)+import Text.Parser.Combinators((<?>)) import Papa  -- $setup@@ -100,6 +59,10 @@   | D9   deriving (Eq, Ord, Enum, Bounded, Data, Typeable) +instance Show Digit where+  show =+    show . fromEnum+ -- | Catamorphism for @Digit@. -- -- prop> foldDigit q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 D0 == q0@@ -168,6 +131,11 @@     Prism'       d       ()+  x0 ::+    D0 d =>+    d+  x0 =+    d0 # ()  instance D0 Digit where   d0 =@@ -177,17 +145,16 @@                D0 -> Just ()                _ -> Nothing) -x0 ::-  D0 d =>-  d-x0 =-  d0 # ()- class D1 d where   d1 ::     Prism'       d       ()+  x1 ::+    D1 d =>+    d+  x1 =+    d1 # ()  instance D1 Digit where   d1 =@@ -197,17 +164,16 @@                D1 -> Just ()                _ -> Nothing) -x1 ::-  D1 d =>-  d-x1 =-  d1 # ()- class D2 d where   d2 ::     Prism'       d       ()+  x2 ::+    D2 d =>+    d+  x2 =+    d2 # ()  instance D2 Digit where   d2 =@@ -217,17 +183,16 @@                D2 -> Just ()                _ -> Nothing) -x2 ::-  D2 d =>-  d-x2 =-  d2 # ()- class D3 d where   d3 ::     Prism'       d       ()+  x3 ::+    D3 d =>+    d+  x3 =+    d3 # ()  instance D3 Digit where   d3 =@@ -237,17 +202,16 @@                D3 -> Just ()                _ -> Nothing) -x3 ::-  D3 d =>-  d-x3 =-  d3 # ()- class D4 d where   d4 ::     Prism'       d       ()+  x4 ::+    D4 d =>+    d+  x4 =+    d4 # ()  instance D4 Digit where   d4 =@@ -257,17 +221,16 @@                D4 -> Just ()                _ -> Nothing) -x4 ::-  D4 d =>-  d-x4 =-  d4 # ()- class D5 d where   d5 ::     Prism'       d       ()+  x5 ::+    D5 d =>+    d+  x5 =+    d5 # ()  instance D5 Digit where   d5 =@@ -277,17 +240,16 @@                D5 -> Just ()                _ -> Nothing) -x5 ::-  D5 d =>-  d-x5 =-  d5 # ()- class D6 d where   d6 ::     Prism'       d       ()+  x6 ::+    D6 d =>+    d+  x6 =+    d6 # ()  instance D6 Digit where   d6 =@@ -297,17 +259,16 @@                D6 -> Just ()                _ -> Nothing) -x6 ::-  D6 d =>-  d-x6 =-  d6 # ()- class D7 d where   d7 ::     Prism'       d       ()+  x7 ::+    D7 d =>+    d+  x7 =+    d7 # ()  instance D7 Digit where   d7 =@@ -317,17 +278,16 @@                D7 -> Just ()                _ -> Nothing) -x7 ::-  D7 d =>-  d-x7 =-  d7 # ()- class D8 d where   d8 ::     Prism'       d       ()+  x8 ::+    D8 d =>+    d+  x8 =+    d8 # ()  instance D8 Digit where   d8 =@@ -337,17 +297,16 @@                D8 -> Just ()                _ -> Nothing) -x8 ::-  D8 d =>-  d-x8 =-  d8 # ()- class D9 d where   d9 ::     Prism'       d       ()+  x9 ::+    D9 d =>+    d+  x9 =+    d9 # ()  instance D9 Digit where   d9 =@@ -357,189 +316,337 @@                D9 -> Just ()                _ -> Nothing) -x9 ::-  D9 d =>-  d-x9 =-  d9 # ()+class AsDigit a where+  digit ::+    Prism'+      a+      Digit --- | A prism for using @Int@ as @Digit@.+instance AsDigit Digit where+  digit =+    id      ++-- |  ----- >>> 5 ^? digit+-- >>> (5 :: Int) ^? digitIntegral -- Just 5 ----- >>> 0 ^? digit+-- >>> (0 :: Int) ^? digitIntegral -- Just 0 ----- >>> 9 ^? digit+-- >>> (9 :: Int) ^? digitIntegral -- Just 9 ----- >>> 10 ^? digit+-- >>> (10 :: Int) ^? digitIntegral -- Nothing ----- >>> (-5) ^? digit+-- >>> ((-5) :: Int) ^? digitIntegral -- Nothing ----- >>> digit # D5+-- >>> digitIntegral # D5 :: Int -- 5 ----- >>> digit # D9+-- >>> digitIntegral # D9 :: Int -- 9 ----- >>> digit # D0+-- >>> digitIntegral # D0 :: Int -- 0-digit ::-  Integral a =>-  Prism' a Digit-digit =-  prism'-    (\n -> case n of D0 -> 0-                     D1 -> 1-                     D2 -> 2-                     D3 -> 3-                     D4 -> 4-                     D5 -> 5-                     D6 -> 6-                     D7 -> 7-                     D8 -> 8-                     D9 -> 9)+instance AsDigit Int where+  digit =+    digitIntegral -    (\n -> case n of 0 -> Just D0-                     1 -> Just D1-                     2 -> Just D2-                     3 -> Just D3-                     4 -> Just D4-                     5 -> Just D5-                     6 -> Just D6-                     7 -> Just D7-                     8 -> Just D8-                     9 -> Just D9-                     _ -> Nothing)+-- | +--+-- >>> (5 :: Int8) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Int8) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Int8) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Int8) ^? digitIntegral+-- Nothing+--+-- >>> ((-5) :: Int8) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Int8+-- 5+--+-- >>> digitIntegral # D9 :: Int8+-- 9+--+-- >>> digitIntegral # D0 :: Int8+-- 0+instance AsDigit Int8 where+  digit =+    digitIntegral --- | A prism for using @Char@ as @Digit@.+-- |  ----- >>> '5' ^? digitC+-- >>> (5 :: Int16) ^? digitIntegral -- Just 5 ----- >>> '0' ^? digitC+-- >>> (0 :: Int16) ^? digitIntegral -- Just 0 ----- >>> '9' ^? digitC+-- >>> (9 :: Int16) ^? digitIntegral -- Just 9 ----- >>> 'a' ^? digitC+-- >>> (10 :: Int16) ^? digitIntegral -- Nothing ----- >>> '@' ^? digitC+-- >>> ((-5) :: Int16) ^? digitIntegral -- Nothing ----- >>> digitC # D5--- '5'+-- >>> digitIntegral # D5 :: Int16+-- 5 ----- >>> digitC # D9--- '9'+-- >>> digitIntegral # D9 :: Int16+-- 9 ----- >>> digitC # D0--- '0'-digitC ::-  Prism' Char Digit-digitC =-  prism'-    (\d -> case d of D0 -> '0'-                     D1 -> '1'-                     D2 -> '2'-                     D3 -> '3'-                     D4 -> '4'-                     D5 -> '5'-                     D6 -> '6'-                     D7 -> '7'-                     D8 -> '8'-                     D9 -> '9')-    (\n -> case n of '0' -> Just D0-                     '1' -> Just D1-                     '2' -> Just D2-                     '3' -> Just D3-                     '4' -> Just D4-                     '5' -> Just D5-                     '6' -> Just D6-                     '7' -> Just D7-                     '8' -> Just D8-                     '9' -> Just D9-                     _ -> Nothing)+-- >>> digitIntegral # D0 :: Int16+-- 0   +instance AsDigit Int16 where+  digit =+    digitIntegral+    +-- | +--+-- >>> (5 :: Int32) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Int32) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Int32) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Int32) ^? digitIntegral+-- Nothing+--+-- >>> ((-5) :: Int32) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Int32+-- 5+--+-- >>> digitIntegral # D9 :: Int32+-- 9+--+-- >>> digitIntegral # D0 :: Int32+-- 0+instance AsDigit Int32 where+  digit =+    digitIntegral --- | A prism for the list of digits in an integer+-- |  ----- >>> 1234 ^? digitlist--- Just [1,2,3,4]--- --- >>> 0 ^? digitlist--- Just []--- --- >>> 1 ^? digitlist--- Just [1]--- --- >>> 90 ^? digitlist--- Just [9,0]--- --- >>> 05 ^? digitlist--- Just [5]--- --- >>> 105 ^? digitlist--- Just [1,0,5]--- --- >>> (-1) ^? digitlist+-- >>> (5 :: Int64) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Int64) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Int64) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Int64) ^? digitIntegral -- Nothing ----- λ> digitlist # [D0]+-- >>> ((-5) :: Int64) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Int64+-- 5+--+-- >>> digitIntegral # D9 :: Int64+-- 9+--+-- >>> digitIntegral # D0 :: Int64 -- 0+instance AsDigit Int64 where+  digit =+    digitIntegral++-- |  ----- >>> digitlist # [D0, D1]--- 1+-- >>> (5 :: Integer) ^? digitIntegral+-- Just 5 ----- >>> digitlist # [D1]--- 1+-- >>> (0 :: Integer) ^? digitIntegral+-- Just 0 ----- >>> digitlist # [D1, D2, D3]--- 123+-- >>> (9 :: Integer) ^? digitIntegral+-- Just 9 ----- >>> digitlist # [D1, D0, D3]--- 103+-- >>> (10 :: Integer) ^? digitIntegral+-- Nothing ----- >>> digitlist # [D1, D0, D3, D0]--- 1030-digitlist ::-  Integral a =>-  Prism'-    a-    [Digit]-digitlist =-  prism'-    (foldl' (\a b -> a * 10 + digit # b) 0)-    (\i ->  if  i < 0-              then-                Nothing-              else -                Just (reverse (unfoldr (\n -> -                  let (x, r) = divMod10 n-                  in  if x == 0-                        then-                          if r == D0-                            then-                              Nothing-                            else-                              Just (r, 0)-                        else-                              Just (r, x)) i))-    )+-- >>> ((-5) :: Integer) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Integer+-- 5+--+-- >>> digitIntegral # D9 :: Integer+-- 9+--+-- >>> digitIntegral # D0 :: Integer+-- 0+instance AsDigit Integer where+  digit =+    digitIntegral -digits ::-  Integral a =>-  Prism'-    a-    Digits-digits =-  digitlist . digitsI+-- | +--+-- >>> (5 :: Identity Int) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Identity Int) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Identity Int) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Identity Int) ^? digitIntegral+-- Nothing+--+-- >>> ((-5) :: Identity Int) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Identity Int+-- Identity 5+--+-- >>> digitIntegral # D9 :: Identity Int+-- Identity 9+--+-- >>> digitIntegral # D0 :: Identity Int+-- Identity 0+instance Integral a => AsDigit (Identity a) where+  digit =+    digitIntegral +-- | +--+-- >>> (5 :: Const Int String) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Const Int String) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Const Int String) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Const Int String) ^? digitIntegral+-- Nothing+--+-- >>> ((-5) :: Const Int String) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Const Int String+-- Const 5+--+-- >>> digitIntegral # D9 :: Const Int String+-- Const 9+--+-- >>> digitIntegral # D0 :: Const Int String+-- Const 0+instance Integral a => AsDigit (Const a b) where+  digit =+    digitIntegral++-- | +--+-- >>> (5 :: Word) ^? digitIntegral+-- Just 5+--+-- >>> (0 :: Word) ^? digitIntegral+-- Just 0+--+-- >>> (9 :: Word) ^? digitIntegral+-- Just 9+--+-- >>> (10 :: Word) ^? digitIntegral+-- Nothing+--+-- >>> ((-5) :: Word) ^? digitIntegral+-- Nothing+--+-- >>> digitIntegral # D5 :: Word+-- 5+--+-- >>> digitIntegral # D9 :: Word+-- 9+--+-- >>> digitIntegral # D0 :: Word+-- 0+instance AsDigit Word where+  digit =+    digitIntegral++-- | +--+-- >>> '5' ^? digit+-- Just 5+--+-- >>> '0' ^? digit+-- Just 0+--+-- >>> '9' ^? digit+-- Just 9+--+-- >>> 'a' ^? digit+-- Nothing+--+-- >>> '@' ^? digit+-- Nothing+--+-- >>> digit # D5 :: Char+-- '5'+--+-- >>> digit # D9 :: Char+-- '9'+--+-- >>> digit # D0 :: Char+-- '0'+instance AsDigit Char where+  digit =+    prism'+      (\d -> case d of D0 -> '0'+                       D1 -> '1'+                       D2 -> '2'+                       D3 -> '3'+                       D4 -> '4'+                       D5 -> '5'+                       D6 -> '6'+                       D7 -> '7'+                       D8 -> '8'+                       D9 -> '9')+      (\n -> case n of '0' -> Just D0+                       '1' -> Just D1+                       '2' -> Just D2+                       '3' -> Just D3+                       '4' -> Just D4+                       '5' -> Just D5+                       '6' -> Just D6+                       '7' -> Just D7+                       '8' -> Just D8+                       '9' -> Just D9+                       _ -> Nothing)++class ManyDigit a where+  digitT ::+    Traversal'+      a+      Digit++instance ManyDigit Digit where+  digitT =+    id+     -- | Modulus with 10. -- -- >>> mod10 0@@ -565,14 +672,53 @@ -- -- >>> mod10 (-1) -- 9+--+-- >>> mod10 (-12)+-- 8 mod10 ::   Integral a =>   a   -> Digit mod10 n =   let r = n `mod` 10-  in fromMaybe (mod10 r) (r ^? digit)+  in fromMaybe (mod10 r) (r ^? digitIntegral) +-- | Absolute value of remainder 10.+--+-- >>> absrem10 0+-- 0+--+-- >>> absrem10 1+-- 1+--+-- >>> absrem10 8+-- 8+--+-- >>> absrem10 9+-- 9+--+-- >>> absrem10 10+-- 0+--+-- >>> absrem10 90+-- 0+--+-- >>> absrem10 91+-- 1+--+-- >>> absrem10 (-1)+-- 1+--+-- >>> absrem10 (-12)+-- 2+absrem10 ::+  Integral a =>+  a+  -> Digit+absrem10 n =+  let r = abs n `rem` 10+  in fromMaybe (absrem10 r) (r ^? digitIntegral)+ -- | Division/modulus with 10. -- -- >>> divMod10 0@@ -607,75 +753,11 @@   in (x, mod10 r)  parsedigit ::-  (Monad p, CharParsing p) =>+  CharParsing p =>   p Digit parsedigit =-  let p = asum ((\d -> d <$ char (digitC # d)) <$> [D0 .. D9])-  in p <?> "digit"--parsedigitlist ::-  (Monad p, CharParsing p) =>-  p [Digit]-parsedigitlist =-  many parsedigit--parsedigits ::-  (Monad p, CharParsing p) =>-  p Digits-parsedigits = -  Digits <$> parsedigitlist--parsedigitlist1 ::-  (Monad p, CharParsing p) =>-  p (NonEmpty Digit)-parsedigitlist1 =-  some1 parsedigit--skipdigitlist ::-  (Monad p, CharParsing p) =>-  p ()-skipdigitlist =-  skipMany parsedigit--skipdigitlist1 ::-  (Monad p, CharParsing p) =>-  p ()-skipdigitlist1 =-  skipSome parsedigit--parsenotdigit ::-  CharParsing p =>-  p Char-parsenotdigit =-  let p = satisfy (`notElem` ['0' .. '9'])-  in p <?> "not digit"--parsenotdigits ::-  CharParsing p =>-  p String-parsenotdigits =-  many parsenotdigit--parsenotdigits1 ::-  CharParsing p =>-  p String-parsenotdigits1 =-  some parsenotdigit--skipnotdigits ::-  CharParsing p =>-  p ()-skipnotdigits =-  skipMany parsenotdigit--skipnotdigits1 ::-  CharParsing p =>-  p ()-skipnotdigits1 =-  skipSome parsenotdigit--instance Show Digit where-  show = show . fromEnum+  let p = asum ((\d -> d <$ char (digit # d)) <$> [D0 .. D9])+  in p <?> "Digit"  -- | A QuasiQuoter for any range of @Digit@. --@@ -688,99 +770,32 @@ -- mod10D x = let y = mod x 10 in [digitQ|$y|] digitQ :: QuasiQuoter digitQ = QuasiQuoter {-    quoteExp = dexp-  , quotePat = dpat-  , quoteType = error "not quotable"-  , quoteDec = error "not quotable"+    quoteExp =  let dexp ::+                      [Char]+                      -> ExpQ+                    dexp ('$':vn) =+                      varE (mkName vn)+                    dexp (d:[]) =+                      maybe (error "not a digit") (dataToExpQ (const Nothing)) (d ^? digit)+                    dexp _ =+                      error "not a digit"+                in  dexp+  , quotePat =  let dpat ::+                      [Char]+                      -> PatQ+                    dpat ('$':vn) =+                      varP (mkName vn)+                    dpat (d:[]) =+                      maybe (error "not a digit") (dataToPatQ (const Nothing)) (d ^? digit)+                    dpat _ =+                      error "not a digit"+                in  dpat+  , quoteType =+      error "not quotable"+  , quoteDec =+      error "not quotable"   } -dexp :: [Char] -> ExpQ-dexp ('$':vn) = varE (mkName vn)-dexp (d:[])   = maybe (error "not a digit") (dataToExpQ (const Nothing)) (d ^? digitC)-dexp _        = error "not a digit"--dpat :: [Char] -> PatQ-dpat ('$':vn) = varP (mkName vn)-dpat (d:[])   = maybe (error "not a digit") (dataToPatQ (const Nothing)) (d ^? digitC)-dpat _        = error "not a digit"--newtype Digits =-  Digits [Digit]-  deriving (Eq, Ord, Show, Data, Typeable)--digitsI ::-  Iso'-    [Digit]-    Digits-digitsI =-  iso-    Digits-    (\(Digits x) -> x)--digitsS ::-  Prism'-    String-    Digits-digitsS =-  prism'-    (\(Digits d) -> (digitC #) <$> d)-    (\s -> Digits <$> traverse (^? digitC) s)--instance Cons Digits Digits Digit Digit where-  _Cons =-    prism'-      (\(h, Digits t) -> Digits (h:t))-      (\(Digits d) -> case d of -                        [] ->-                          Nothing-                        (h:t) ->-                          Just (h, Digits t))---instance Snoc Digits Digits Digit Digit where-  _Snoc =-    prism'-      (\(Digits t, z) -> Digits (t ++ [z]))-      (\(Digits d) -> (\(a, b) -> (Digits a, b)) <$> d ^? _Snoc)--instance AsEmpty Digits where-  _Empty =-    prism'-      (\() -> Digits [])-      (\(Digits d) -> case d of-                        [] ->-                          Just ()-                        (_:_) ->-                          Nothing)--instance Each Digits Digits Digit Digit where-  each f (Digits d) =-    Digits <$> each f d--type instance IxValue Digits = Digit-type instance Index Digits = Int-instance Ixed Digits where-  ix i f (Digits d) =-    Digits <$> ix i f d--instance Plated Digits where-  plate f (Digits d) =-    Digits <$> plate (\x -> (\(Digits e) -> e) <$> f (Digits x)) d--instance Reversing Digits where-  reversing (Digits d) =-    Digits (reversing d)--instance Semigroup Digits where-  Digits d <> Digits e =-    Digits (d <> e)--instance Monoid Digits where-  mempty =-    Digits mempty-  mappend =-    (<>)- -- | -- -- >>> D0 /+/ D0@@ -811,57 +826,33 @@   -> Digit   -> (Digit, Digit) a /+/ b =-  let (x, r) = divMod10 (digit # a + digit # b)+  let (x, r) = divMod10 (digitIntegral # a + digitIntegral # b)   in (mod10 (x :: Integer), r)  --- |--------- >>> Digits [x2] .+. Digits [x1, x0]--- Digits [1,2]------ >>> Digits [x1, x2, x3] .+. Digits [x4, x5, x6]--- Digits [5,7,9]-(.+.) ::-  Digits-  -> Digits-  -> Digits-d .+. e =-  fromMaybe mempty ((digits # d + digits # e :: Integer) ^? digits)---- |--------- >>> Digits [x2] .*. Digits [x1, x0]--- Digits [2,0]------ >>> Digits [x1, x2, x3] .*. Digits [x4, x5, x6]--- Digits [5,6,0,8,8]-(.*.) ::-  Digits-  -> Digits-  -> Digits-d .*. e =-  fromMaybe mempty ((digits # d * digits # e :: Integer) ^? digits)---- |------ >>> mantissa (Digits []) :: Double--- 0.0------ > mantissa (Digits [x0]) :: Double--- 0.0------ >>> mantissa (Digits [x1]) :: Double--- 0.1------ >>> mantissa (Digits [x1, x9]) :: Double--- 0.19-mantissa ::-  Floating a =>-  Digits-  -> a-mantissa d =-  let acc a (e, x) = -        a + fromIntegral (digit # x :: Int) * 10 ** fromIntegral (negate e :: Int)-  in foldl' acc 0 (zip [1..] (digitsI # d))+---- not exported+digitIntegral ::+  Integral a =>+  Prism' a Digit+digitIntegral =+  prism'+    (\n -> case n of D0 -> 0+                     D1 -> 1+                     D2 -> 2+                     D3 -> 3+                     D4 -> 4+                     D5 -> 5+                     D6 -> 6+                     D7 -> 7+                     D8 -> 8+                     D9 -> 9)+    (\n -> case n of 0 -> Just D0+                     1 -> Just D1+                     2 -> Just D2+                     3 -> Just D3+                     4 -> Just D4+                     5 -> Just D5+                     6 -> Just D6+                     7 -> Just D7+                     8 -> Just D8+                     9 -> Just D9+                     _ -> Nothing)
+ src/Data/Digits.hs view
@@ -0,0 +1,132 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE NoImplicitPrelude #-}++module Data.Digits(+  Digits(..)+, AsDigits(..)+, HasDigits(..)+, ManyDigits(..)+, parsedigits+) where++import Control.Applicative(many)+import Data.Data (Data)+import Data.Digit(Digit, AsDigit(..), ManyDigit(..), parsedigit)+import Data.Digits1(Digits1(..), AsDigits1(..))+import Data.Monoid(mappend)+import Data.Semigroup((<>))+import Data.Typeable (Typeable)+import Text.Parser.Char(CharParsing)+import Text.Parser.Combinators((<?>))+import Papa++newtype Digits =+  Digits+    [Digit]+  deriving (Eq, Ord, Show, Data, Typeable)++makeWrapped ''Digits++class AsDigits a where+  _Digits ::+    Prism'+      a+      Digits++instance AsDigits Digits where+  _Digits =+    id+    +instance AsDigit a => AsDigits [a] where+  _Digits =+    prism'+      (\(Digits d) -> (digit #) <$> d)+      (\s -> Digits <$> traverse (^? digit) s)++class HasDigits a where+  digitsL :: +    Lens'+      a+      Digits++instance HasDigits Digits where+  digitsL =+    id++class ManyDigits a where+  digitsT ::+    Traversal' +      a+      Digits++instance ManyDigits Digits where+  digitsT =+    id++instance Cons Digits Digits Digit Digit where+  _Cons =+    prism'+      (\(h, Digits t) -> Digits (h:t))+      (\(Digits d) -> (_2 %~ Digits) <$> d ^? _Cons)++instance Snoc Digits Digits Digit Digit where+  _Snoc =+    prism'+      (\(Digits t, z) -> Digits (t ++ [z]))+      (\(Digits d) -> (_1 %~ Digits) <$> d ^? _Snoc)++instance AsEmpty Digits where+  _Empty =+    _Wrapped . _Empty++instance Each Digits Digits Digit Digit where+  each f (Digits d) =+    Digits <$> each f d++type instance IxValue Digits = Digit+type instance Index Digits = Int+instance Ixed Digits where+  ix i f (Digits d) =+    Digits <$> ix i f d++instance Plated Digits where+  plate f (Digits d) =+    Digits <$> plate (\x -> (\(Digits e) -> e) <$> f (Digits x)) d++instance Reversing Digits where+  reversing (Digits d) =+    Digits (reversing d)++instance Semigroup Digits where+  Digits d <> Digits e =+    Digits (d <> e)++instance Monoid Digits where+  mempty =+    Digits mempty+  mappend =+    (<>)++parsedigits ::+  CharParsing p =>+  p Digits+parsedigits = +  Digits <$> many parsedigit <?> "Digits"++instance AsDigits1 Digits where+  _Digits1 =+    prism'+      (\(Digits1 x) -> Digits (toList x))+      (\(Digits x) -> case x of+                        [] ->+                          Nothing+                        h:t -> +                          Just (Digits1 (h :| t)))++instance ManyDigit Digits where+  digitT f (Digits d) =+    Digits <$> traverse f d
+ src/Data/Digits1.hs view
@@ -0,0 +1,133 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE NoImplicitPrelude #-}++module Data.Digits1(+  Digits1(..)+, AsDigits1(..)+, HasDigits1(..)+, ManyDigits1(..)+, parsedigitlist1+) where++import Data.Data(Data)+import Data.Digit(Digit, AsDigit(..), ManyDigit(..), parsedigit)+import Data.List.NonEmpty(some1)+import qualified Data.List.NonEmpty as NonEmpty(cons)+import Data.Semigroup((<>))+import Data.Typeable (Typeable)+import Text.Parser.Char(CharParsing)+import Text.Parser.Combinators((<?>))+import Papa++newtype Digits1 =+  Digits1+    (NonEmpty Digit)+  deriving (Eq, Ord, Show, Data, Typeable)++makeWrapped ''Digits1++class AsDigits1 a where+  _Digits1 ::+    Prism'+      a+      Digits1++instance AsDigits1 Digits1 where+  _Digits1 =+    id+++instance AsDigit a => AsDigits1 (NonEmpty a) where+  _Digits1 =+    prism'+      (\(Digits1 d) -> (digit #) <$> d)+      (\s -> Digits1 <$> traverse (^? digit) s)++instance AsDigit a => AsDigits1 [a] where+  _Digits1 =+    -- where does this live?+    let nonemptyP ::+          Prism [a] [a] (NonEmpty a) (NonEmpty a)+        nonemptyP =+            prism'+              toList+              (\x ->  case x of+                        [] ->+                          Nothing+                        h:t ->+                          Just (h :| t))+    in  nonemptyP . _Digits1++class HasDigits1 a where+  digits1L :: +    Lens'+      a+      Digits1++instance HasDigits1 Digits1 where+  digits1L =+    id++class ManyDigits1 a where+  digits1T ::+    Traversal' +      a+      Digits1++instance ManyDigits1 Digits1 where+  digits1T =+    id++instance Semigroup Digits1 where+  Digits1 x <> Digits1 y =+    Digits1 (x <> y)++instance Plated Digits1 where+  plate f (Digits1 d) =+    let platedNonEmpty ::+          Traversal' (NonEmpty a) (NonEmpty a)+        platedNonEmpty k l@(_ :| []) = +          k l+        platedNonEmpty k (h :| i : t) = +          (h `NonEmpty.cons`) <$> k (i :| t)+    in  Digits1 <$> platedNonEmpty (\n -> (\(Digits1 x) -> x) <$> f (Digits1 n)) d++instance Reversing Digits1 where+  reversing (Digits1 d) =+    Digits1 (reversing d)++instance Each Digits1 Digits1 Digit Digit where+  each f (Digits1 d) =+    Digits1 <$> each f d++instance Snoc Digits1 Digits1 Digit Digit where+  _Snoc =+    prism'+      (\(Digits1 ds, d) -> Digits1 (ds <> (d :| [])))+      (\(Digits1 (h :| t)) -> (_1 %~ (\ds -> Digits1 (h :| ds))) <$> t ^? _Snoc)++instance Cons Digits1 Digits1 Digit Digit where+  _Cons =+    prism'+      (\(d, Digits1 ds) -> Digits1 (d `NonEmpty.cons` ds))+      (\(Digits1 (h :| t)) -> (_2 %~ (\ds -> Digits1 (h :| ds))) <$> t ^? _Cons)++type instance IxValue Digits1 = Digit+type instance Index Digits1 = Int+instance Ixed Digits1 where+  ix i f (Digits1 d) =+    Digits1 <$> ix i f d++parsedigitlist1 ::+  CharParsing p =>+  p Digits1+parsedigitlist1 =+  Digits1 <$> some1 parsedigit <?> "Digits1"++instance ManyDigit Digits1 where+  digitT f (Digits1 d) =+    Digits1 <$> traverse f d