iterable (empty) → 1.0
raw patch · 7 files changed
+166/−0 lines, 7 filesdep +basedep +mtldep +template-haskellsetup-changed
Dependencies added: base, mtl, template-haskell, vector
Files
- Data/Iterable.hs +17/−0
- Data/Iterable/Instantiate.hs +33/−0
- Data/Iterable/Instantiate/Vector.hs +24/−0
- LICENSE +29/−0
- README.md +8/−0
- Setup.hs +18/−0
- iterable.cabal +37/−0
+ Data/Iterable.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE MultiParamTypeClasses #-}+-- | Declares Iterable class for handling multi-level, heterogeneous, monomorphic collections that allow nested iteration.+module Data.Iterable(Iterable(..)) where++import Language.Haskell.TH.Syntax+import Control.Monad.Identity(runIdentity,foldM)++-- | Class for iterating all nested components `b` of type `a`.+class Iterable a b where+ imapM :: (Monad m) => (b -> m b) -> a -> m a+ imap :: (b -> b) -> a -> a+ imap f e = runIdentity $ imapM (return . f) e+ ifoldM :: (Monad m) => (c -> b -> m c) -> c -> a -> m c+ ifoldr :: (b -> c -> c) -> c -> a -> c+ ifoldl :: (c -> b -> c) -> c -> a -> c+ ifoldl' :: (c -> b -> c) -> c -> a -> c+ ilength :: b -> a -> Int -- NOTE: b is 'dummy' type argument to satisfy Iterable a b constraint
+ Data/Iterable/Instantiate.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances #-}+-- | Helpers for instantiating transitive and reflexive instances of Iterable.+module Data.Iterable.Instantiate(self_iterable ,+ trans_iterable) where++import Language.Haskell.TH.Syntax+import Data.Iterable++-- | Generates convenience function for iterating over a single object.+--self_iterable typA = gen_iterable typA typA [e| id |] [e| L.singleton |]+self_iterable typA = + [d| instance Iterable $(typA) $(typA) where+ imapM f a = f a + ifoldM f e a = f e a+ ifoldr f e a = f a e+ ifoldl f e a = f e a + ifoldl' f e a = f e a+ ilength d a = 1+ |]++-- | Generates a transitive instance of `Iterable` between $typA and $typC,+-- assuming existence of `Iterable` $typA $typB, and `Iterable` $typB $typC.+trans_iterable typA typB typC = + [d| instance Iterable $(typA) $(typC) where+ imapM f a = (imapM :: (Monad m) => ( $(typB) -> m $(typB) ) -> $(typA) -> m $(typA) ) (imapM f) a + imap f a = (imap :: ( $(typB) -> $(typB) ) -> $(typA) -> $(typA) ) (imap f) a + ifoldM f e a = (ifoldM :: (Monad m) => (c -> $(typB) -> m c) -> c -> $(typA) -> m c ) (ifoldM f) e a + ifoldr f e a = (ifoldr :: ($(typB) -> c -> c) -> c -> $(typA) -> c ) (\bb cc -> ifoldr f cc bb) e a+ ifoldl f e a = (ifoldl :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (ifoldl f) e a+ ifoldl' f e a = (ifoldl' :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (ifoldl' f) e a+ ilength _ a = (ifoldl' :: (c -> $(typB) -> c) -> c -> $(typA) -> c ) (\a b-> a + ilength (undefined :: $(typC)) b) 0 a+ |]+
+ Data/Iterable/Instantiate/Vector.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, FlexibleInstances #-}+-- | Helpers for instantiating Iterable for types with Vector containers.+module Data.Iterable.Instantiate.Vector(gen_vector_iterable) where++import Language.Haskell.TH.Syntax+import Data.Iterable+import qualified Data.Vector as L++-- | Generates a direct instance of iterable between $typA and $typB with+-- given names of getter and setter, so that:+-- $getter :: $typA -> $typB +-- $setter :: $typB -> $typA -> $typA+gen_vector_iterable typA typB getter setter = + [d| instance Iterable $(typA) $(typB) where+ imapM f a =+ do b' <- L.mapM f ( $(getter) a)+ return $ $(setter) a b'+ ifoldM f e a = do r <- L.foldM f e ( $(getter) a)+ return r+ ifoldr f e a = L.foldr f e ( $(getter) a)+ ifoldl f e a = L.foldl f e ( $(getter) a)+ ifoldl' f e a = L.foldl' f e ( $(getter) a) + ilength d a = L.length ( $(getter) a)+ |]
+ LICENSE view
@@ -0,0 +1,29 @@+Haskell code in this package is subject to:++Copyright (c) Michal J. Gajda 2010-2013++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.
+ README.md view
@@ -0,0 +1,8 @@+iterable+========+Typeclass and TemplateHaskell instantiating methods for accessing data within multilevel,+monomorphic, heterogeneous collections.++Used as a main interface to Protein Databank structures parsed by hPDB library.++Details on official releases are on [Hackage](http://hackage.haskell.org/package/iterable).
+ Setup.hs view
@@ -0,0 +1,18 @@+#! /usr/bin/env runhaskell++module Main(main) where++import Distribution.Simple+import System.Environment+import Control.Monad(when)+import Data.List(isPrefixOf)++-- Defaults to installing in --user package database.+isPkgDbOpts arg = ("--package-db" `isPrefixOf` arg ) || (arg `elem` ["--user", "--global"])+haveNotPkgDbOpts = not . any isPkgDbOpts++main = do args <- getArgs+ defaultMainArgs $ if (length args > 0 && (head args `elem` ["configure", "install"]) && haveNotPkgDbOpts args)+ then (head args:"--user":tail args)+ else args+
+ iterable.cabal view
@@ -0,0 +1,37 @@+name: iterable+version: 1.0+stability: stable+homepage: https://github.com/mgajda/iterable+package-url: http://hackage.haskell.org/package/iterable+synopsis: API for hierarchical multilevel collections.+description: Two-argument typeclass that generalizes Foldable, Functor, and Traversable for monomorphic+ multi-level collections. Transitive instances allow for folding and mapping over any+ subordinate level of the hierarchy.+ .+ Main interface for hPDB library.+ .+ Contains convenience TemplateHaskell methods for generating Iterable instances that have Vector containers.+category: Data Structures+license: BSD3+license-file: LICENSE++author: Michal J. Gajda+copyright: Copyright by Michal J. Gajda '2013+maintainer: mjgajda@googlemail.com+bug-reports: mailto:mjgajda@googlemail.com++build-type: Simple+cabal-version: >=1.8+tested-with: GHC==7.0.3, GHC==7.2.1, GHC==7.4.2, GHC==7.6.2+data-files: README.md++source-repository head+ type: git+ location: git://github.com:mgajda/hpdb.git++Library+ build-depends: base>4 && <=5, mtl >= 2.0, vector >= 0.9, template-haskell >= 2.7+ other-extensions: TemplateHaskell, MultiParamTypeClasses, FlexibleInstances+ exposed-modules: Data.Iterable, Data.Iterable.Instantiate, Data.Iterable.Instantiate.Vector+ exposed: True+