packages feed

ftree 0.1.3 → 0.1.5

raw patch · 3 files changed

+40/−18 lines, 3 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.FTree.BottomUp: B :: T f n (f a) -> T f (S n) a
- Data.FTree.BottomUp: L :: a -> T f Z a
- Data.FTree.BottomUp: instance (Foldable f, Applicative f, IsNat n, Eq a) => Eq ((:^) f n a)
- Data.FTree.BottomUp: instance (Foldable f, Applicative f, IsNat n, Ord a) => Ord ((:^) f n a)
- Data.FTree.BottomUp: instance (Functor f, Foldable f) => Foldable (f :^ n)
- Data.FTree.BottomUp: instance (Functor f, ShowF f) => ShowF (f :^ n)
- Data.FTree.BottomUp: instance (Functor f, ShowF f, Show a) => Show ((:^) f n a)
- Data.FTree.BottomUp: instance (IsNat n, Applicative f) => Applicative (f :^ n)
- Data.FTree.BottomUp: instance (IsNat n, Applicative f, Monoid m) => Monoid ((:^) f n m)
- Data.FTree.BottomUp: instance Functor f => Functor (f :^ n)
- Data.FTree.BottomUp: instance Traversable f => Traversable (f :^ n)
- Data.FTree.TopDown: B :: f (T f n a) -> T f (S n) a
- Data.FTree.TopDown: L :: a -> T f Z a
- Data.FTree.TopDown: instance (Foldable f, Applicative f, IsNat n, Eq a) => Eq ((:^) f n a)
- Data.FTree.TopDown: instance (Foldable f, Applicative f, IsNat n, Ord a) => Ord ((:^) f n a)
- Data.FTree.TopDown: instance (Functor f, Foldable f) => Foldable (f :^ n)
- Data.FTree.TopDown: instance (IsNat n, Applicative f) => Applicative (f :^ n)
- Data.FTree.TopDown: instance (IsNat n, Applicative f, Monoid m) => Monoid ((:^) f n m)
- Data.FTree.TopDown: instance (ShowF f, Show a) => Show ((:^) f n a)
- Data.FTree.TopDown: instance Functor f => Functor (f :^ n)
- Data.FTree.TopDown: instance ShowF f => ShowF (f :^ n)
- Data.FTree.TopDown: instance Traversable f => Traversable (f :^ n)
+ Data.FTree.BottomUp: [B] :: IsNat n => T f n (f a) -> T f (S n) a
+ Data.FTree.BottomUp: [L] :: a -> T f Z a
+ Data.FTree.BottomUp: instance (Data.Foldable.Foldable f, GHC.Base.Applicative f, TypeUnary.Nat.IsNat n, GHC.Classes.Eq a) => GHC.Classes.Eq ((Data.FTree.BottomUp.:^) f n a)
+ Data.FTree.BottomUp: instance (Data.Foldable.Foldable f, GHC.Base.Applicative f, TypeUnary.Nat.IsNat n, GHC.Classes.Ord a) => GHC.Classes.Ord ((Data.FTree.BottomUp.:^) f n a)
+ Data.FTree.BottomUp: instance (GHC.Base.Functor f, Data.Foldable.Foldable f) => Data.Foldable.Foldable (f Data.FTree.BottomUp.:^ n)
+ Data.FTree.BottomUp: instance (GHC.Base.Functor f, Text.ShowF.ShowF f) => Text.ShowF.ShowF (f Data.FTree.BottomUp.:^ n)
+ Data.FTree.BottomUp: instance (GHC.Base.Functor f, Text.ShowF.ShowF f, GHC.Show.Show a) => GHC.Show.Show ((Data.FTree.BottomUp.:^) f n a)
+ Data.FTree.BottomUp: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f) => GHC.Base.Applicative (f Data.FTree.BottomUp.:^ n)
+ Data.FTree.BottomUp: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f, GHC.Base.Monoid m) => GHC.Base.Monoid ((Data.FTree.BottomUp.:^) f n m)
+ Data.FTree.BottomUp: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f, GHC.Base.Semigroup m) => GHC.Base.Semigroup ((Data.FTree.BottomUp.:^) f n m)
+ Data.FTree.BottomUp: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (f Data.FTree.BottomUp.:^ n)
+ Data.FTree.BottomUp: instance GHC.Base.Functor f => GHC.Base.Functor (f Data.FTree.BottomUp.:^ n)
+ Data.FTree.TopDown: [B] :: IsNat n => f (T f n a) -> T f (S n) a
+ Data.FTree.TopDown: [L] :: a -> T f Z a
+ Data.FTree.TopDown: instance (Data.Foldable.Foldable f, GHC.Base.Applicative f, TypeUnary.Nat.IsNat n, GHC.Classes.Eq a) => GHC.Classes.Eq ((Data.FTree.TopDown.:^) f n a)
+ Data.FTree.TopDown: instance (Data.Foldable.Foldable f, GHC.Base.Applicative f, TypeUnary.Nat.IsNat n, GHC.Classes.Ord a) => GHC.Classes.Ord ((Data.FTree.TopDown.:^) f n a)
+ Data.FTree.TopDown: instance (GHC.Base.Functor f, Data.Foldable.Foldable f) => Data.Foldable.Foldable (f Data.FTree.TopDown.:^ n)
+ Data.FTree.TopDown: instance (Text.ShowF.ShowF f, GHC.Show.Show a) => GHC.Show.Show ((Data.FTree.TopDown.:^) f n a)
+ Data.FTree.TopDown: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f) => GHC.Base.Applicative (f Data.FTree.TopDown.:^ n)
+ Data.FTree.TopDown: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f, GHC.Base.Monoid m) => GHC.Base.Monoid ((Data.FTree.TopDown.:^) f n m)
+ Data.FTree.TopDown: instance (TypeUnary.Nat.IsNat n, GHC.Base.Applicative f, GHC.Base.Semigroup m) => GHC.Base.Semigroup ((Data.FTree.TopDown.:^) f n m)
+ Data.FTree.TopDown: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (f Data.FTree.TopDown.:^ n)
+ Data.FTree.TopDown: instance GHC.Base.Functor f => GHC.Base.Functor (f Data.FTree.TopDown.:^ n)
+ Data.FTree.TopDown: instance Text.ShowF.ShowF f => Text.ShowF.ShowF (f Data.FTree.TopDown.:^ n)
- Data.FTree.BottomUp: foldT :: Functor f => (a -> z) -> (f a -> a) -> (f :^ n) a -> z
+ Data.FTree.BottomUp: foldT :: forall f n a z. Functor f => (a -> z) -> (f a -> a) -> (f :^ n) a -> z
- Data.FTree.BottomUp: inB :: ((f :^ n) (f a) -> (f :^ n) (f b)) -> ((f :^ (S n)) a -> (f :^ (S n)) b)
+ Data.FTree.BottomUp: inB :: ((f :^ n) (f a) -> (f :^ n) (f b)) -> (f :^ S n) a -> (f :^ S n) b
- Data.FTree.BottomUp: inB2 :: ((f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c)) -> ((f :^ (S n)) a -> (f :^ (S n)) b -> (f :^ (S n)) c)
+ Data.FTree.BottomUp: inB2 :: ((f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c)) -> (f :^ S n) a -> (f :^ S n) b -> (f :^ S n) c
- Data.FTree.BottomUp: inL :: (a -> b) -> ((f :^ Z) a -> (f :^ Z) b)
+ Data.FTree.BottomUp: inL :: (a -> b) -> (f :^ Z) a -> (f :^ Z) b
- Data.FTree.BottomUp: inL2 :: (a -> b -> c) -> ((f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c)
+ Data.FTree.BottomUp: inL2 :: (a -> b -> c) -> (f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c
- Data.FTree.BottomUp: inT :: (a -> b) -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b)) -> (forall n. (f :^ n) a -> (f :^ n) b)
+ Data.FTree.BottomUp: inT :: (a -> b) -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b)) -> forall n. (f :^ n) a -> (f :^ n) b
- Data.FTree.BottomUp: inT2 :: (a -> b -> c) -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c)) -> (forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c)
+ Data.FTree.BottomUp: inT2 :: (a -> b -> c) -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c)) -> forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c
- Data.FTree.TopDown: foldT :: Functor f => (a -> z) -> (f z -> z) -> (f :^ n) a -> z
+ Data.FTree.TopDown: foldT :: forall f n a z. Functor f => (a -> z) -> (f z -> z) -> (f :^ n) a -> z
- Data.FTree.TopDown: inB :: (f ((f :^ n) a) -> f ((f :^ n) b)) -> ((f :^ (S n)) a -> (f :^ (S n)) b)
+ Data.FTree.TopDown: inB :: (f ((f :^ n) a) -> f ((f :^ n) b)) -> (f :^ S n) a -> (f :^ S n) b
- Data.FTree.TopDown: inB2 :: (f ((f :^ n) a) -> f ((f :^ n) b) -> f ((f :^ n) c)) -> ((f :^ (S n)) a -> (f :^ (S n)) b -> (f :^ (S n)) c)
+ Data.FTree.TopDown: inB2 :: (f ((f :^ n) a) -> f ((f :^ n) b) -> f ((f :^ n) c)) -> (f :^ S n) a -> (f :^ S n) b -> (f :^ S n) c
- Data.FTree.TopDown: inL :: (a -> b) -> ((f :^ Z) a -> (f :^ Z) b)
+ Data.FTree.TopDown: inL :: (a -> b) -> (f :^ Z) a -> (f :^ Z) b
- Data.FTree.TopDown: inL2 :: (a -> b -> c) -> ((f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c)
+ Data.FTree.TopDown: inL2 :: (a -> b -> c) -> (f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c
- Data.FTree.TopDown: inT :: (a -> b) -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b)) -> (forall n. (f :^ n) a -> (f :^ n) b)
+ Data.FTree.TopDown: inT :: (a -> b) -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b)) -> forall n. (f :^ n) a -> (f :^ n) b
- Data.FTree.TopDown: inT2 :: (a -> b -> c) -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b) -> f ((f :^ n) c)) -> (forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c)
+ Data.FTree.TopDown: inT2 :: (a -> b -> c) -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b) -> f ((f :^ n) c)) -> forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c

Files

ftree.cabal view
@@ -1,5 +1,5 @@ Name:                ftree-Version:             0.1.3+Version:             0.1.5 Cabal-Version:       >= 1.6 Synopsis:            Depth-typed functor-based trees, both top-down and bottom-up Category:            Data@@ -25,4 +25,4 @@   Exposed-Modules:                             Data.FTree.TopDown                        Data.FTree.BottomUp-  ghc-options:         -Wall+  ghc-options:         -Wall -O2
src/Data/FTree/BottomUp.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE GADTs, KindSignatures, TypeOperators, Rank2Types, DataKinds #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -Wall #-}  ----------------------------------------------------------------------@@ -16,7 +17,9 @@ -- See <http://conal.net/blog/posts/a-trie-for-length-typed-vectors/>. ---------------------------------------------------------------------- -module Data.FTree.BottomUp (T(..),(:^),unL,unB,foldT,inT,inT2,inL,inB,inL2,inB2) where+module Data.FTree.BottomUp+  ( T(..),(:^),unL,unB,foldT,inT,inT2,inL,inB,inL2,inB2+  ) where  -- TODO: explicit exports @@ -25,7 +28,8 @@ import Control.Applicative (Applicative(..),liftA2,(<$>)) import Data.Foldable (Foldable(..),and) import Data.Traversable (Traversable(..))-import Data.Monoid (Monoid(..))+--import Data.Monoid (Monoid(..))+import qualified Data.Semigroup as Sem  import TypeUnary.Nat @@ -67,35 +71,39 @@  -- Operate inside the representation of `f :^ n`: +-- | Operate inside the representation of `f :^ n` to make another,+-- preserving depth. inT :: (a -> b)     -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b))-    -> (forall n. (f :^ n) a -> (f :^ n) b)+    -> (forall n.            (f :^ n)    a  -> (f :^ n) b) inT l _ (L a ) = (L (l a )) inT _ b (B as) = (B (b as)) +-- | Operate inside the representation of two `f :^ n` to make another,+-- preserving depth. inT2 :: (a -> b -> c)      -> (forall n. IsNat n => (f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c))      -> (forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c) inT2 l _ (L a ) (L b ) = L (l a  b ) inT2 _ b (B as) (B bs) = B (b as bs)-inT2 _ _ _ _ = error "inT2: unhandled case"  -- Possible?? + -- Similar to `inT`, but useful when we can know whether a `L` or a `B`:  inL :: (a -> b)-        -> ((f :^ Z) a -> (f :^ Z) b)+    -> ((f :^ Z) a -> (f :^ Z) b) inL h (L a ) = L (h a )  inB :: ((f :^ n) (f a) -> (f :^ n) (f b))-        -> ((f :^ (S n)) a -> (f :^ (S n)) b)+    -> ((f :^ (S n)) a -> (f :^ (S n)) b) inB h (B as) = B (h as)  inL2 :: (a -> b -> c)-         -> ((f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c)+     -> ((f :^ Z) a -> (f :^ Z) b -> (f :^ Z) c) inL2 h (L a ) (L b ) = L (h a  b )  inB2 :: ((f :^ n) (f a) -> (f :^ n) (f b) -> (f :^ n) (f c))-         -> ((f :^ (S n)) a -> (f :^ (S n)) b -> (f :^ (S n)) c)+     -> ((f :^ (S n)) a -> (f :^ (S n)) b -> (f :^ (S n)) c) inB2 h (B as) (B bs) = B (h as bs)  @@ -144,7 +152,7 @@  instance Traversable f => Traversable (f :^ n) where   sequenceA (L qa) = L <$> qa-  sequenceA (B as) = fmap B . sequenceA . fmap sequenceA $ as+  sequenceA (B as) = B <$> traverse sequenceA as  -- i.e., @@ -154,9 +162,14 @@  -- We can use the `Applicative` instance in standard way to get a `Monoid` instance: +instance (IsNat n, Applicative f, Sem.Semigroup m) => Sem.Semigroup (( f :^ n) m) where+  (<>) = liftA2 (Sem.<>)+ instance (IsNat n, Applicative f, Monoid m) => Monoid ((f :^ n) m) where   mempty  = pure mempty+#if !(MIN_VERSION_base(4,11,0))   mappend = liftA2 mappend+#endif  -- (To follow the general pattern exactly, replace the first two constraints with `Applicative (f :^ n)` and add `FlexibleContexts` to the module's `LANGUAGE` pragma.) 
src/Data/FTree/TopDown.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE GADTs, KindSignatures, TypeOperators, Rank2Types, DataKinds #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE CPP #-} {-# OPTIONS_GHC -Wall #-}  ----------------------------------------------------------------------@@ -16,7 +17,9 @@ -- See <http://conal.net/blog/posts/a-trie-for-length-typed-vectors/>. ---------------------------------------------------------------------- -module Data.FTree.TopDown (T(..),(:^),unL,unB,foldT,inT,inT2,inL,inB,inL2,inB2) where+module Data.FTree.TopDown+  ( T(..),(:^),unL,unB,foldT,inT,inT2,inL,inB,inL2,inB2+  ) where  -- TODO: explicit exports @@ -25,7 +28,7 @@ import Control.Applicative (Applicative(..),liftA2,(<$>)) import Data.Foldable (Foldable(..),and) import Data.Traversable (Traversable(..))-import Data.Monoid (Monoid(..))+import qualified Data.Semigroup as Sem  import TypeUnary.Nat @@ -65,20 +68,21 @@    fo (L a)  = l a    fo (B ts) = b (fo <$> ts) --- Operate inside the representation of `f :^ n`:-+-- | Operate inside the representation of `f :^ n` to make another,+-- preserving depth. inT :: (a -> b)     -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b))     -> (forall n. (f :^ n) a -> (f :^ n) b) inT l _ (L a ) = (L (l a )) inT _ b (B as) = (B (b as)) +-- | Operate inside the representation of two `f :^ n` to make another,+-- preserving depth. inT2 :: (a -> b -> c)      -> (forall n. IsNat n => f ((f :^ n) a) -> f ((f :^ n) b) -> f ((f :^ n) c))-     -> (forall n. (f :^ n) a -> (f :^ n) b -> (f :^ n) c)+     -> (forall n.               (f :^ n) a  ->    (f :^ n) b  ->    (f :^ n) c) inT2 l _ (L a ) (L b ) = L (l a  b ) inT2 _ b (B as) (B bs) = B (b as bs)-inT2 _ _ _ _ = error "inT2: unhandled case"  -- Possible??  -- Similar to `inT`, but useful when we can know whether a `L` or a `B`: @@ -143,7 +147,7 @@  instance Traversable f => Traversable (f :^ n) where   sequenceA (L qa) = L <$> qa-  sequenceA (B as) = fmap B . sequenceA . fmap sequenceA $ as+  sequenceA (B as) = B <$> traverse sequenceA as  -- i.e., @@ -153,9 +157,14 @@  -- We can use the `Applicative` instance in standard way to get a `Monoid` instance: +instance (IsNat n, Applicative f, Sem.Semigroup m) => Sem.Semigroup ((f :^ n) m) where+  (<>) = liftA2 (Sem.<>)+ instance (IsNat n, Applicative f, Monoid m) => Monoid ((f :^ n) m) where   mempty  = pure mempty+#if !(MIN_VERSION_base(4,11,0))   mappend = liftA2 mappend+#endif  -- (To follow the general pattern exactly, replace the first two constraints with `Applicative (f :^ n)` and add `FlexibleContexts` to the module's `LANGUAGE` pragma.)