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 +33/−0
- LICENCE +32/−0
- digit.cabal +19/−15
- etc/CONTRIBUTORS +0/−33
- etc/LICENCE +0/−27
- src/Data/Digit.hs +442/−451
- src/Data/Digits.hs +132/−0
- src/Data/Digits1.hs +133/−0
+ 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