Semigroup (empty) → 0.0.1
raw patch · 4 files changed
+137/−0 lines, 4 filesdep +basesetup-changed
Dependencies added: base
Files
- Data/Semigroup.hs +81/−0
- LICENSE +27/−0
- Semigroup.cabal +26/−0
- Setup.lhs +3/−0
+ Data/Semigroup.hs view
@@ -0,0 +1,81 @@+-- | A semigroup is a binary associative operation.+module Data.Semigroup(+ Semigroup,+ Identity,+ (<++>)+ ) where++import Data.Monoid+import Control.Applicative++-- | A binary operation that must satisfy associativity. Unlike a @Monoid@, an identity in not essential.+class Semigroup a where+ (.++.) :: a -> a -> a++-- | A wrapper used to construct a @Semigroup@ from a @Monoid@.+newtype Identity a = Identity { run :: a }++-- | A binary associative operation lifted into an applicative functor.+(<++>) :: (Applicative f, Semigroup a) => f a -> f a -> f a+(<++>) = liftA2 (.++.)++instance Functor Identity where+ fmap f (Identity a) = Identity (f a)++instance Applicative Identity where+ pure = Identity+ Identity f <*> Identity a = Identity (f a)++instance Monad Identity where+ return = Identity+ Identity a >>= f = f a++instance Monoid a => Semigroup (Identity a) where+ (.++.) = liftA2 mappend++instance Semigroup () where+ _ .++. _ = ()++instance Semigroup b => Semigroup (a -> b) where+ (.++.) = (<++>)++instance Semigroup a => Semigroup (IO a) where+ (.++.) = (<++>)++instance (Semigroup a, Semigroup b) => Semigroup (a, b) where+ (a1, b1) .++. (a2, b2) = (a1 .++. a2, b1 .++. b2)++instance (Semigroup a, Semigroup b, Semigroup c) => Semigroup (a, b, c) where+ (a1, b1, c1) .++. (a2, b2, c2) = (a1 .++. a2, b1 .++. b2, c1 .++. c2)++instance Semigroup All where+ a .++. b = run (Identity a .++. Identity b)++instance Semigroup Any where+ a .++. b = run (Identity a .++. Identity b)++instance Semigroup a => Semigroup (Dual a) where+ Dual a .++. Dual b = Dual (b .++. a)++instance Semigroup (Endo a) where+ a .++. b = run (Identity a .++. Identity b)++instance Num a => Semigroup (Product a) where+ a .++. b = run (Identity a .++. Identity b)++instance Num a => Semigroup (Sum a) where+ a .++. b = run (Identity a .++. Identity b)++instance Semigroup a => Semigroup (Maybe a) where+ Nothing .++. b = b+ a .++. Nothing = a+ Just a .++. Just b = Just (a .++. b)++instance Semigroup (First a) where+ a .++. b = run (Identity a .++. Identity b)++instance Semigroup (Last a) where+ a .++. b = run (Identity a .++. Identity b)++instance Semigroup [a] where+ (.++.) = (++)
+ LICENSE view
@@ -0,0 +1,27 @@+Copyright 2010 Tony Morris++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.
+ Semigroup.cabal view
@@ -0,0 +1,26 @@+Name: Semigroup+Version: 0.0.1+License: BSD3+License-File: LICENSE+Synopsis: A semigroup+Description: A semigroup is a binary associative operation+Homepage: http://code.google.com/p/semigroup/+Category: Data+Author: Tony Morris+Maintainer: code@tmorris.net+Copyright: 2010 Tony Morris+build-type: Simple+cabal-version: >= 1.2++Flag small_base+ Description: Choose the new, split-up base package.++Library+ if flag(small_base)+ Build-Depends: base < 5 && >= 3+ else+ Build-Depends: base < 5 && >= 3++ GHC-Options: -Wall+ Exposed-Modules: Data.Semigroup+
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain