packages feed

thrist 0.2.2 → 0.3

raw patch · 4 files changed

+64/−53 lines, 4 filesdep ~base

Dependency ranges changed: base

Files

Data/Thrist.hs view
@@ -1,10 +1,10 @@-{-# LANGUAGE GADTs, RankNTypes, KindSignatures, FlexibleInstances, TypeOperators #-}-module Data.Thrist ( +{-# LANGUAGE GADTs, RankNTypes, KindSignatures, FlexibleInstances, TypeOperators, PolyKinds #-}+module Data.Thrist (       -- * Types:         Thrist (..)       , Flipped (..)       -- * Fold and map functions:-      , mapThrist +      , mapThrist       , foldrThrist       , foldlThrist       , foldr1Thrist@@ -15,6 +15,7 @@       -- * Other list-like functions:       , appendThrist       , nullThrist+      , lengthThrist       ) where  import Prelude hiding ((.), id)@@ -25,107 +26,107 @@   -- | A type-threaded list of binary polymorphic types.-data Thrist :: (* -> * -> *) -> * -> * -> * where-  Nil :: Thrist (~>) a a-  Cons :: (a ~> b) -> Thrist (~>) b c -> Thrist (~>) a c+data Thrist :: (k -> k -> *) -> k -> k -> * where+  Nil :: Thrist arr a a+  Cons :: (a `arr` b) -> Thrist arr b c -> Thrist arr a c -instance Monoid (Thrist (~>) a a) where+instance Monoid (Thrist arr a a) where   mempty  = Nil   mappend = appendThrist -instance (Arrow (~>)) => Arrow (Thrist (~>)) where+instance (Arrow arr) => Arrow (Thrist arr) where   arr f     = Cons (arr f) Nil   first Nil = Nil   first t   = Cons ((foldrThrist (flip (.)) id t) *** id) Nil -instance Category (Thrist (~>)) where+instance Category (Thrist arr) where   id    = Nil   b . a = appendThrist a b   -- | A newtype wrapper, defined for convenience, that "swaps" the two type--- variables of a binary type. Can be used to reverse a Thrist using +-- variables of a binary type. Can be used to reverse a Thrist using -- `foldlThrist`. See examples. newtype Flipped m a b = Flipped { unflip :: m b a }   -- | Equivalent to `foldr` for thrists. Takes a combining function, a value to -- replace Nil, and a thrist, returning some new binary type.-foldrThrist :: (forall i j . (i ~> j) -> (j +> c) -> (i +> c)) -            -> (b +> c) -            -> Thrist (~>) a b -            -> (a +> c)+foldrThrist :: (forall i j . (i `arr` j) -> (j `brr` c) -> (i `brr` c))+            -> (b `brr` c)+            -> Thrist arr a b+            -> (a `brr` c) foldrThrist _ v Nil        = v foldrThrist f v (Cons h t) = h `f` (foldrThrist f v t) --- | Equivalent to (++) for thrists. -appendThrist :: Thrist (~>) a b -> Thrist (~>) b c -> Thrist (~>) a c+-- | Equivalent to (++) for thrists.+appendThrist :: Thrist arr a b -> Thrist arr b c -> Thrist arr a c appendThrist = flip (foldrThrist Cons) --- | Equivalent to `map` for thrists. Takes a function from one binary type to --- another and applies it to each thrist element. For example this could +-- | Equivalent to `map` for thrists. Takes a function from one binary type to+-- another and applies it to each thrist element. For example this could -- convert a thrist of (a,b) into a thrist of Either a b:-mapThrist :: (forall i j . (i +> j) -> (i ~> j)) -          -> Thrist (+>) a b -          -> Thrist (~>) a b-mapThrist f = foldrThrist (Cons . f) Nil +mapThrist :: (forall i j . (i `brr` j) -> (i `arr` j))+          -> Thrist brr a b+          -> Thrist arr a b+mapThrist f = foldrThrist (Cons . f) Nil   -- | Equivalent to `foldl` for `Thrist`s.-foldlThrist :: (forall j k . (a +> j) -> (j ~> k) -> (a +> k)) -            -> (a +> b) -            -> Thrist (~>) b c -            -> (a +> c)+foldlThrist :: (forall j k . (a `brr` j) -> (j `arr` k) -> (a `brr` k))+            -> (a `brr` b)+            -> Thrist arr b c+            -> (a `brr` c) foldlThrist _ v Nil        = v-foldlThrist f v (Cons h t) = foldlThrist f (v `f` h) t +foldlThrist f v (Cons h t) = foldlThrist f (v `f` h) t    -- | Equivalent to `foldl1` for `Thrist`s.-foldl1Thrist :: (forall i j k. (i ~> j) -> (j ~> k) -> (i ~> k))-             -> Thrist (~>) a b-             -> (a ~> b)+foldl1Thrist :: (forall i j k. (i `arr` j) -> (j `arr` k) -> (i `arr` k))+             -> Thrist arr a b+             -> (a `arr` b) foldl1Thrist f (Cons a th) = foldlThrist f a th foldl1Thrist _ Nil         = error "empty thrist" -     + -- | Equivalent to `foldr1` for `Thrist`s.-foldr1Thrist :: (forall i j k. (i ~> j) -> (j ~> k) -> (i ~> k))-             -> Thrist (~>) a b-             -> (a ~> b)+foldr1Thrist :: (forall i j k. (i `arr` j) -> (j `arr` k) -> (i `arr` k))+             -> Thrist arr a b+             -> (a `arr` b) foldr1Thrist _ (Cons b Nil) = b foldr1Thrist f (Cons a th)  = f a $ foldr1Thrist f th foldr1Thrist _ Nil          = error "empty thrist"   --- | Equivalent to `mapM` on `Thrist`s. -mapMThrist :: Monad m => -             (forall i j . (i +> j) -> m (i ~> j)) -           -> Thrist (+>) a b -           -> m (Thrist (~>) a b)+-- | Equivalent to `mapM` on `Thrist`s.+mapMThrist :: Monad m =>+             (forall i j . (i `brr` j) -> m (i `arr` j))+           -> Thrist brr a b+           -> m (Thrist arr a b) mapMThrist _ Nil        = return Nil mapMThrist f (Cons h t) = liftM2 Cons (f h) (mapMThrist f t)   -- | Equivalent to `foldM` on `Thrist`s.-foldMThrist :: Monad m => -               (forall j k . (a +> j) -> (j ~> k) -> m (a +> k)) -            -> (a +> b) -            -> Thrist (~>) b c -            -> m (a +> c)+foldMThrist :: Monad m =>+               (forall j k . (a `brr` j) -> (j `arr` k) -> m (a `brr` k))+            -> (a `brr` b)+            -> Thrist arr b c+            -> m (a `brr` c) foldMThrist _ a Nil        = return a foldMThrist f a (Cons h t) = f a h >>= \fah -> foldMThrist f fah t    -- | Returns `True` when the Thrist is `Nil`.-nullThrist :: Thrist (~>) a b -> Bool+nullThrist :: Thrist arr a b -> Bool nullThrist Nil = True nullThrist _   = False  -- | Returns the length of the Thrist.-lengthThrist :: Thrist (~>) a b -> Int+lengthThrist :: Thrist arr a b -> Int lengthThrist Nil = 0 lengthThrist (Cons _ rest) = 1 + lengthThrist rest
Data/Thrist/List.hs view
@@ -1,7 +1,7 @@ module Data.Thrist.List ( List(..) ) where  import Data.Thrist-import Control.Monad+import Control.Monad()  -- Adapter for creating lists: --   (Thrist List a a) is isomorphic to [a]
examples.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TypeOperators #-}+ module Main     where @@ -6,7 +8,7 @@   -- identity function on thrists in terms of foldrThrist:-idThrist :: Thrist (~>) a c -> Thrist (~>) a c+idThrist :: Thrist arr a c -> Thrist arr a c idThrist = foldrThrist Cons Nil  
thrist.cabal view
@@ -1,9 +1,9 @@ Name:                thrist-Version:             0.2.2+Version:             0.3 Synopsis:            Type-threaded list  Description:-    Thrist is a list-like data structure (GADT)+    @Thrist@ is a list-like data structure (GADT)     whose elements are values of a two-parameter     datatype. The typing constraint ensures that     the second type parameter of a former value@@ -21,6 +21,14 @@     For further ideas, please consult the companion     (draft) paper \"Thrists: Dominoes of Data\" at     <http://omega.googlecode.com/files/Thrist-draft-2011-11-20.pdf>+    .+    Release history:+    .+    [0.3] Support for (GHC v7.6.1) @PolyKinds@ extension, this compiler is required now+    .+    [0.2] Several new functions introduced, some renamed+    .+    [0.1] Initial version  Category:            Data Structures License:             BSD3@@ -33,7 +41,7 @@ Bug-Reports:         mailto:ggreif+thrist@gmail.com  Stability:           experimental-Tested-With:         GHC == 7.0.4, GHC == 7.2.2+Tested-With:         GHC == 7.6.1 Cabal-Version:       >= 1.6 Extra-Source-Files:  examples.hs Build-Type:          Simple@@ -43,7 +51,7 @@   Location: http://patch-tag.com/r/heisenbug/thrist/  Library-    Build-Depends:       base >= 4 && < 5+    Build-Depends:       base >= 4.6 && < 5     Exposed-Modules:     Data.Thrist Data.Thrist.List Data.Thrist.Monad-    Extensions:          GADTs, RankNTypes, KindSignatures, FlexibleInstances, TypeOperators, FlexibleContexts+    Extensions:          GADTs, RankNTypes, KindSignatures, FlexibleInstances, TypeOperators     Ghc-Options:         -Wall