packages feed

aop-prelude 0.2.0.0 → 0.3.0.0

raw patch · 2 files changed

+81/−13 lines, 2 filesdep +integer-gmpPVP ok

version bump matches the API change (PVP)

Dependencies added: integer-gmp

API changes (from Hackage documentation)

- AOPPrelude: (++) :: () => [a] -> [a] -> [a]
+ AOPPrelude: (++) :: [a] -> [a] -> [a]
- AOPPrelude: (.) :: () => (t1 -> t2) -> (t3 -> t1) -> t3 -> t2
+ AOPPrelude: (.) :: (b -> c) -> (a -> b) -> a -> c
- AOPPrelude: assocl :: () => (a, (b1, b2)) -> ((a, b1), b2)
+ AOPPrelude: assocl :: (a, (b, c)) -> ((a, b), c)
- AOPPrelude: assocr :: () => ((a1, a2), b) -> (a1, (a2, b))
+ AOPPrelude: assocr :: ((a, b), c) -> (a, (b, c))
- AOPPrelude: bmax :: () => ((a, a) -> Bool) -> (a, a) -> a
+ AOPPrelude: bmax :: ((a, a) -> Bool) -> (a, a) -> a
- AOPPrelude: bmin :: () => ((a, a) -> Bool) -> (a, a) -> a
+ AOPPrelude: bmin :: ((a, a) -> Bool) -> (a, a) -> a
- AOPPrelude: cat :: () => ([a], [a]) -> [a]
+ AOPPrelude: cat :: ([a], [a]) -> [a]
- AOPPrelude: cata1list :: () => (a -> b, (a, b) -> b) -> [a] -> b
+ AOPPrelude: cata1list :: (a -> b, (a, b) -> b) -> [a] -> b
- AOPPrelude: cata2list :: () => ((a, a) -> b, (a, b) -> b) -> [a] -> b
+ AOPPrelude: cata2list :: ((a, a) -> b, (a, b) -> b) -> [a] -> b
- AOPPrelude: catalist :: () => (b, (a, b) -> b) -> [a] -> b
+ AOPPrelude: catalist :: (b, (a, b) -> b) -> [a] -> b
- AOPPrelude: concat :: () => [[a]] -> [a]
+ AOPPrelude: concat :: [[a]] -> [a]
- AOPPrelude: cond :: () => (t -> Bool) -> (t -> p, t -> p) -> t -> p
+ AOPPrelude: cond :: (a -> Bool) -> (a -> b, a -> b) -> a -> b
- AOPPrelude: cons :: () => (a, [a]) -> [a]
+ AOPPrelude: cons :: (a, [a]) -> [a]
- AOPPrelude: const :: () => p1 -> p2 -> p1
+ AOPPrelude: const :: a -> b -> a
- AOPPrelude: cpl :: () => ([a], b) -> [(a, b)]
+ AOPPrelude: cpl :: ([a], b) -> [(a, b)]
- AOPPrelude: cplist :: () => [[a]] -> [[a]]
+ AOPPrelude: cplist :: [[a]] -> [[a]]
- AOPPrelude: cpp :: () => ([a], [b]) -> [(a, b)]
+ AOPPrelude: cpp :: ([a], [b]) -> [(a, b)]
- AOPPrelude: cpr :: () => (a, [b]) -> [(a, b)]
+ AOPPrelude: cpr :: (a, [b]) -> [(a, b)]
- AOPPrelude: cross :: () => (t1 -> a, t2 -> b) -> (t1, t2) -> (a, b)
+ AOPPrelude: cross :: (a -> c, b -> d) -> (a, b) -> (c, d)
- AOPPrelude: curry :: () => ((a, b) -> t) -> a -> b -> t
+ AOPPrelude: curry :: ((a, b) -> c) -> a -> b -> c
- AOPPrelude: dupl :: () => (a, (b1, b2)) -> ((a, b1), (a, b2))
+ AOPPrelude: dupl :: (a, (b, c)) -> ((a, b), (a, c))
- AOPPrelude: dupr :: () => ((a1, a2), b) -> ((a1, b), (a2, b))
+ AOPPrelude: dupr :: ((a, b), c) -> ((a, c), (b, c))
- AOPPrelude: false :: () => p -> Bool
+ AOPPrelude: false :: a -> Bool
- AOPPrelude: filter :: () => (a -> Bool) -> [a] -> [a]
+ AOPPrelude: filter :: (a -> Bool) -> [a] -> [a]
- AOPPrelude: flip :: () => (t1 -> t2 -> t3) -> t2 -> t1 -> t3
+ AOPPrelude: flip :: (a -> b -> c) -> b -> a -> c
- AOPPrelude: head :: () => [a] -> a
+ AOPPrelude: head :: [a] -> a
- AOPPrelude: id :: () => p -> p
+ AOPPrelude: id :: a -> a
- AOPPrelude: init :: () => [a] -> [a]
+ AOPPrelude: init :: [a] -> [a]
- AOPPrelude: inits :: () => [a] -> [[a]]
+ AOPPrelude: inits :: [a] -> [[a]]
- AOPPrelude: join :: () => (p -> Bool, p -> Bool) -> p -> Bool
+ AOPPrelude: join :: (a -> Bool, a -> Bool) -> a -> Bool
- AOPPrelude: last :: () => [a] -> a
+ AOPPrelude: last :: [a] -> a
- AOPPrelude: length :: () => [a] -> Integer
+ AOPPrelude: length :: [a] -> Natural
- AOPPrelude: lines :: [Char] -> [[Char]]
+ AOPPrelude: lines :: String -> [String]
- AOPPrelude: list :: () => (t -> a) -> [t] -> [a]
+ AOPPrelude: list :: (a -> b) -> [a] -> [b]
- AOPPrelude: loop :: () => ((a, b) -> a) -> (a, [b]) -> a
+ AOPPrelude: loop :: ((a, b) -> a) -> (a, [b]) -> a
- AOPPrelude: maxlist :: () => ((b, b) -> Bool) -> [b] -> b
+ AOPPrelude: maxlist :: ((a, a) -> Bool) -> [a] -> a
- AOPPrelude: meet :: () => (p -> Bool, p -> Bool) -> p -> Bool
+ AOPPrelude: meet :: (a -> Bool, a -> Bool) -> a -> Bool
- AOPPrelude: merge :: () => ((a, a) -> Bool) -> ([a], [a]) -> [a]
+ AOPPrelude: merge :: ((a, a) -> Bool) -> ([a], [a]) -> [a]
- AOPPrelude: minlist :: () => ((b, b) -> Bool) -> [b] -> b
+ AOPPrelude: minlist :: ((a, a) -> Bool) -> [a] -> a
- AOPPrelude: minus :: (Integer, Integer) -> Integer
+ AOPPrelude: minus :: Num a => (a, a) -> a
- AOPPrelude: negative :: Integer -> Bool
+ AOPPrelude: negative :: (Ord a, Num a) => a -> Bool
- AOPPrelude: nil :: () => p -> [a]
+ AOPPrelude: nil :: t -> [a]
- AOPPrelude: null :: () => [a] -> Bool
+ AOPPrelude: null :: [a] -> Bool
- AOPPrelude: outl :: () => (a, b) -> a
+ AOPPrelude: outl :: (a, b) -> a
- AOPPrelude: outr :: () => (a, b) -> b
+ AOPPrelude: outr :: (a, b) -> b
- AOPPrelude: pair :: () => (t -> a, t -> b) -> t -> (a, b)
+ AOPPrelude: pair :: (a -> b, a -> c) -> a -> (b, c)
- AOPPrelude: plus :: (Integer, Integer) -> Integer
+ AOPPrelude: plus :: Num a => (a, a) -> a
- AOPPrelude: positive :: Integer -> Bool
+ AOPPrelude: positive :: (Ord a, Num a) => a -> Bool
- AOPPrelude: pred :: Integer
+ AOPPrelude: pred :: Natural -> Natural
- AOPPrelude: snoc :: () => ([a], a) -> [a]
+ AOPPrelude: snoc :: ([a], a) -> [a]
- AOPPrelude: split :: () => [a] -> (a, [a])
+ AOPPrelude: split :: [a] -> (a, [a])
- AOPPrelude: splits :: () => [a] -> [([a], [a])]
+ AOPPrelude: splits :: [a] -> [([a], [a])]
- AOPPrelude: strict :: () => (a -> b) -> a -> b
+ AOPPrelude: strict :: (a -> b) -> a -> b
- AOPPrelude: succ :: Integer -> Integer
+ AOPPrelude: succ :: Natural -> Natural
- AOPPrelude: sum :: [Integer] -> Integer
+ AOPPrelude: sum :: Num a => [a] -> a
- AOPPrelude: swap :: () => (b, a) -> (a, b)
+ AOPPrelude: swap :: (a, b) -> (b, a)
- AOPPrelude: tail :: () => [a] -> [a]
+ AOPPrelude: tail :: [a] -> [a]
- AOPPrelude: tails :: () => [a] -> [[a]]
+ AOPPrelude: tails :: [a] -> [[a]]
- AOPPrelude: thinlist :: () => ((a, a) -> Bool) -> [a] -> [a]
+ AOPPrelude: thinlist :: ((a, a) -> Bool) -> [a] -> [a]
- AOPPrelude: times :: (Integer, Integer) -> Integer
+ AOPPrelude: times :: Num a => (a, a) -> a
- AOPPrelude: trans :: () => [[a]] -> [[a]]
+ AOPPrelude: trans :: [[a]] -> [[a]]
- AOPPrelude: true :: () => p -> Bool
+ AOPPrelude: true :: a -> Bool
- AOPPrelude: uncurry :: () => (t1 -> t2 -> t3) -> (t1, t2) -> t3
+ AOPPrelude: uncurry :: (a -> b -> c) -> (a, b) -> c
- AOPPrelude: unlines :: [[Char]] -> [Char]
+ AOPPrelude: unlines :: [String] -> String
- AOPPrelude: unwords :: [[Char]] -> [Char]
+ AOPPrelude: unwords :: [String] -> String
- AOPPrelude: unzip :: () => [(a1, a2)] -> ([a1], [a2])
+ AOPPrelude: unzip :: [(a, b)] -> ([a], [b])
- AOPPrelude: wok :: () => ((a, b) -> t) -> (b, a) -> t
+ AOPPrelude: wok :: ((b, a) -> c) -> (a, b) -> c
- AOPPrelude: words :: [Char] -> [[Char]]
+ AOPPrelude: words :: String -> [String]
- AOPPrelude: wrap :: () => a -> [a]
+ AOPPrelude: wrap :: a -> [a]
- AOPPrelude: zero :: () => p -> Integer
+ AOPPrelude: zero :: a -> Natural
- AOPPrelude: zip :: () => ([a], [b]) -> [(a, b)]
+ AOPPrelude: zip :: ([a], [b]) -> [(a, b)]

Files

aop-prelude.cabal view
@@ -4,7 +4,7 @@ -- http://haskell.org/cabal/users-guide/  name:                aop-prelude-version:             0.2.0.0+version:             0.3.0.0 synopsis:            prelude for Algebra of Programming description:         prelude for Algenra of Programming, the original code was created by Richard Bird. homepage:            https://github.com/cutsea110/aop-prelude.git@@ -21,7 +21,7 @@   exposed-modules:     AOPPrelude   -- other-modules:   other-extensions:    NoImplicitPrelude-  build-depends:       base ^>=4.12.0.0, ghc-prim ^>=0.5.3+  build-depends:       base ^>=4.12.0.0, ghc-prim ^>=0.5.3, integer-gmp ^>=1.0.2   hs-source-dirs:      src   default-language:    Haskell2010 
src/AOPPrelude.hs view
@@ -58,14 +58,15 @@ ---------------------------------------------------------------------  -- Operator precedence table: ----------------------------------------import GHC.Base ((==), (/=), (<), (<=), (>=), (>), ($!))+import GHC.Base ((==), (/=), (<), (<=), (>=), (>), ($!), String) import GHC.Err (error)-import GHC.Num ((+), (-), (*), negate)+import GHC.Num ((+), (-), (*), negate, Num) import GHC.Real ((/), div, mod, Fractional) import GHC.Show (Show, show) import GHC.Classes hiding (not, (&&), (||)) import GHC.Types +import Numeric.Natural (Natural) import Data.Char (ord, chr) import System.IO (print) @@ -75,46 +76,64 @@ infixr 2 ||  -- Standard combinators: ---------------------------------------------+(.) :: (b -> c) -> (a -> b) -> a -> c (f . g) x = f (g x)+const :: a -> b -> a const k a = k+id :: a -> a id a      = a +outl :: (a, b) -> a outl (a, _) = a+outr :: (a, b) -> b outr (_, b) = b+swap :: (a, b) -> (b, a) swap (a, b) = (b, a) +assocl :: (a, (b, c)) -> ((a, b), c) assocl (a, (b, c)) = ((a, b), c)+assocr :: ((a, b), c) -> (a, (b, c)) assocr ((a, b), c) = (a, (b, c)) +dupl :: (a, (b, c)) -> ((a, b), (a, c)) dupl (a, (b, c)) = ((a, b), (a, c))+dupr :: ((a, b), c) -> ((a, c), (b, c)) dupr ((a, b), c) = ((a, c), (b, c)) +pair :: (a -> b, a -> c) -> a -> (b, c) pair (f, g) a       = (f a, g a)+cross :: (a -> c, b -> d) -> (a, b) -> (c, d) cross (f, g) (a, b) = (f a, g b)+cond :: (a -> Bool) -> (a -> b, a -> b) -> a -> b cond p (f, g) a     = if p a then f a else g a +curry :: ((a, b) -> c) -> a -> b -> c curry f a b      = f (a, b)+uncurry :: (a -> b -> c) -> (a, b) -> c uncurry f (a, b) = f a b  -- Boolean functions: ------------------------------------------------+false :: a -> Bool false = const False+true  :: a -> Bool true  = const True +(&&) :: Bool -> Bool -> Bool False && _ = False True  && x = x +(||) :: Bool -> Bool -> Bool False || x = x True  || _ = True +not :: Bool -> Bool not True   = False not False  = True +otherwise :: Bool otherwise  = True  -- Relations: -------------------------------------------------------- leq :: Ord a => (a, a) -> Bool leq  = uncurry (<=) less :: Ord a => (a, a) -> Bool@@ -128,125 +147,174 @@ geq :: Ord a => (a, a) -> Bool geq  = uncurry (>=) +meet :: (a -> Bool, a -> Bool) -> a -> Bool meet (r, s) = cond r (s, false)+join :: (a -> Bool, a -> Bool) -> a -> Bool join (r, s) = cond r (true, s)+wok :: ((b, a) -> c) -> (a, b) -> c wok r       = r . swap  -- Numerical functions: ----------------------------------------------+zero   :: a -> Natural zero   = const 0+succ   :: Natural -> Natural succ   = (+1)-pred   = (-1)+pred   :: Natural -> Natural+pred n = n - 1 +plus   :: Num a => (a, a) -> a plus   = uncurry (+)+minus  :: Num a => (a, a) -> a minus  = uncurry (-)+times  :: Num a => (a, a) -> a times  = uncurry (*) divide :: Fractional a => (a, a) -> a divide = uncurry (/) +negative :: (Ord a, Num a) => a -> Bool negative = (< 0)+positive :: (Ord a, Num a) => a -> Bool positive = (> 0)  -- List-processing functions: ----------------------------------------+(++) :: [a] -> [a] -> [a] [] ++ y    = y (a:x) ++ y = a : (x ++ y) +null :: [a] -> Bool null []    = True null (_:_) = False +nil :: t -> [a] nil    = const []+wrap :: a -> [a] wrap   = cons . pair (id, nil)+cons :: (a, [a]) -> [a] cons   = uncurry (:)+cat :: ([a], [a]) -> [a] cat    = uncurry (++)+concat :: [[a]] -> [a] concat = catalist ([], cat)+snoc :: ([a], a) -> [a] snoc   = cat . cross (id, wrap) +head :: [a] -> a head (a:_) = a+tail :: [a] -> [a] tail (_:x) = x+split :: [a] -> (a, [a]) split      = pair (head, tail) +last :: [a] -> a last = cata1list (id, outr)+init :: [a] -> [a] init = cata1list (nil, cons) +inits :: [a] -> [[a]] inits = catalist ([[]], extend)   where extend (a, xs) = [[]] ++ list (a:) xs+tails :: [a] -> [[a]] tails = catalist ([[]], extend)   where extend (a, x:xs) = (a:x):x:xs+splits :: [a] -> [([a], [a])] splits = zip . pair (inits, tails) +cpp :: ([a], [b]) -> [(a, b)] cpp (x, y) = [(a, b) | a <- x, b <- y]+cpl :: ([a], b) -> [(a, b)] cpl (x, b) = [(a, b) | a <- x]+cpr :: (a, [b]) -> [(a, b)] cpr (a, y) = [(a, b) | b <- y]+cplist :: [[a]] -> [[a]] cplist     = catalist ([[]], list cons . cpp) +minlist :: ((a, a) -> Bool) -> [a] -> a minlist r = cata1list (id, bmin r)+bmin :: ((a, a) -> Bool) -> (a, a) -> a bmin r    = cond r (outl, outr) +maxlist :: ((a, a) -> Bool) -> [a] -> a maxlist r = cata1list (id, bmax r)+bmax :: ((a, a) -> Bool) -> (a, a) -> a bmax r    = cond (r . swap) (outl, outr) +thinlist :: ((a, a) -> Bool) -> [a] -> [a] thinlist r = catalist ([], bump r)   where bump r (a, [])  = [a]         bump r (a, b:x) | r (a, b)  = a:x                         | r (b, a)  = b:x                         | otherwise = a:b:x +length :: [a] -> Natural length   = catalist (0, succ . outr)+sum :: Num a => [a] -> a sum      = catalist (0, plus)+trans :: [[a]] -> [[a]] trans    = cata1list (list wrap, list cons . zip)+list :: (a -> b) -> [a] -> [b] list f   = catalist ([], cons . cross (f, id))+filter :: (a -> Bool) -> [a] -> [a] filter p = catalist ([], cond (p . outl) (cons, outr)) -+catalist :: (b, (a, b) -> b) -> [a] -> b catalist (c, f) []    = c catalist (c, f) (a:x) = f (a, catalist (c, f) x) +cata1list :: (a -> b, (a, b) -> b) -> [a] -> b cata1list (f, g) [a]   = f a cata1list (f, g) (a:x) = g (a, cata1list (f, g) x) +cata2list :: ((a, a) -> b, (a, b) -> b) -> [a] -> b cata2list (f, g) [a,b] = f (a, b) cata2list (f, g) (a:x) = g (a, cata2list (f, g) x) +loop :: ((a, b) -> a) -> (a, [b]) -> a loop f (a, [])  = a loop f (a, b:x) = loop f (f (a, b), x) +merge :: ((a, a) -> Bool) -> ([a], [a]) -> [a] merge _ ([], y)    = y merge _ (x, [])    = x merge r (a:x, b:y) | r (a, b)  = a : merge r (x, b:y)                    | otherwise = b : merge r (a:x, y) +zip :: ([a], [b]) -> [(a, b)] zip (x, [])    = [] zip ([], y)    = [] zip (a:x, b:y) = (a, b) : zip (x, y) +unzip :: [(a, b)] -> ([a], [b]) unzip = pair (list outl, list outr)  -- Word and line processing functions: -------------------------------+words :: String -> [String] words = filter (not . null) . catalist ([[]], cond ok (glue, new))   where ok (a, xs)     = (a /= ' ' && a /= '\n')         glue (a, x:xs) = (a:x):xs         new (a, xs)    = []:xs +lines :: String -> [String] lines = catalist ([[]], cond ok (glue, new))   where ok (a, xs)     = (a /= '\n')         glue (a, x:xs) = (a:x):xs         new (a,xs)     = []:xs +unwords :: [String] -> String unwords = cata1list (id, join)   where join (x, y) = x ++ " " ++ y +unlines :: [String] -> String unlines = cata1list (id, join)   where join (x, y) = x ++ "\n" ++ y  -- Essentials and built-in primitives: -------------------------------- primPrint :: Show a => a -> IO () primPrint = print +strict :: (a -> b) -> a -> b strict = ($!) +flip :: (a -> b -> c) -> b -> a -> c flip f a b = f b a  -- End of Algebra of Programming prelude ----------------------------