packages feed

fixed-vector-hetero 0.3.1.2 → 0.4.0.0

raw patch · 9 files changed

+850/−1168 lines, 9 filesdep −ghc-primdep −transformersdep ~basedep ~fixed-vectordep ~primitivePVP ok

version bump matches the API change (PVP)

Dependencies removed: ghc-prim, transformers

Dependency ranges changed: base, fixed-vector, primitive

API changes (from Hackage documentation)

- Data.Vector.HFixed: data ContVec xs
- Data.Vector.HFixed: elementChTy :: forall a b f n v w proxy. (Index (ToPeano n) (Elems v), a ~ ValueAt (ToPeano n) (Elems v), HVector v, HVector w, Elems w ~ NewElems (ToPeano n) (Elems v) b, Functor f) => proxy n -> (a -> f b) -> (v -> f w)
- Data.Vector.HFixed: elementTy :: forall n a f v proxy. (Index (ToPeano n) (Elems v), ValueAt (ToPeano n) (Elems v) ~ a, NatIso (ToPeano n) n, HVector v, Functor f) => proxy n -> (a -> f a) -> (v -> f v)
- Data.Vector.HFixed: mapFunctor :: (HVectorF v) => (forall a. f a -> g a) -> v f -> v g
- Data.Vector.HFixed: sequenceA :: (Applicative f, HVectorF v, HVector w, ElemsF v ~ Elems w) => v f -> f w
- Data.Vector.HFixed: sequenceAF :: (Applicative f, HVectorF v) => v (f `Compose` g) -> f (v g)
- Data.Vector.HFixed: zipMono :: (HVector v, ArityC c (Elems v)) => Proxy c -> (forall a. c a => a -> a -> a) -> v -> v -> v
- Data.Vector.HFixed: zipMonoF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a -> g a -> h a) -> v f -> v g -> v h
- Data.Vector.HFixed.Class: ContVec :: (forall r. Fun xs r -> r) -> ContVec xs
- Data.Vector.HFixed.Class: Fun :: Fn as b -> Fun b
- Data.Vector.HFixed.Class: [WitAllInstancesCons] :: c x => WitAllInstances c xs -> WitAllInstances c (x : xs)
- Data.Vector.HFixed.Class: [WitAllInstancesNil] :: WitAllInstances c '[]
- Data.Vector.HFixed.Class: [WitConcat] :: (Arity (xs ++ ys)) => WitConcat xs ys
- Data.Vector.HFixed.Class: [WitLenWrap] :: Len xs ~ Len (Wrap f xs) => WitLenWrap f xs
- Data.Vector.HFixed.Class: [WitNestedFun] :: (Fn (xs ++ ys) r ~ Fn xs (Fn ys r)) => WitNestedFun xs ys r
- Data.Vector.HFixed.Class: [WitWrapIndex] :: (ValueAt n (Wrap f xs) ~ f (ValueAt n xs), Index n (Wrap f xs), Arity (Wrap f xs)) => WitWrapIndex f n xs
- Data.Vector.HFixed.Class: [WitWrapped] :: Arity (Wrap f xs) => WitWrapped f xs
- Data.Vector.HFixed.Class: [runContVec] :: ContVec xs -> forall r. Fun xs r -> r
- Data.Vector.HFixed.Class: [unFun] :: Fun b -> Fn as b
- Data.Vector.HFixed.Class: accumTy :: Arity xs => (forall a as. t (a : as) -> f a -> t as) -> (t '[] -> b) -> t xs -> Fn (Wrap f xs) b
- Data.Vector.HFixed.Class: applyM :: (Arity xs, Monad m) => (forall a as. t (a : as) -> m (a, t as)) -> t xs -> m (ContVec xs)
- Data.Vector.HFixed.Class: applyTy :: Arity xs => (forall a as. t (a : as) -> (f a, t as)) -> t xs -> ContVecF xs f
- Data.Vector.HFixed.Class: class ((~) Nat (ToNat a) b, (~) * (ToPeano b) a) => NatIso a (b :: Nat)
- Data.Vector.HFixed.Class: data S n :: * -> *
- Data.Vector.HFixed.Class: data WitAllInstances c xs
- Data.Vector.HFixed.Class: data WitConcat xs ys
- Data.Vector.HFixed.Class: data WitLenWrap :: (* -> *) -> [*] -> *
- Data.Vector.HFixed.Class: data WitNestedFun xs ys r
- Data.Vector.HFixed.Class: data WitWrapIndex f n xs
- Data.Vector.HFixed.Class: data WitWrapped f xs
- Data.Vector.HFixed.Class: data Z :: *
- Data.Vector.HFixed.Class: funToTFun :: Fun (Wrap f xs) b -> TFun f xs b
- Data.Vector.HFixed.Class: instance (Data.Primitive.Types.Prim a, Data.Vector.HFixed.Class.HomArity n a) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Primitive.Vec n a)
- Data.Vector.HFixed.Class: instance (Data.Vector.Fixed.Unboxed.Unbox n a, Data.Vector.HFixed.Class.HomArity n a) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Unboxed.Vec n a)
- Data.Vector.HFixed.Class: instance (Foreign.Storable.Storable a, Data.Vector.HFixed.Class.HomArity n a) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Storable.Vec n a)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.HVector (Data.Vector.HFixed.Class.ContVec xs)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.Index Data.Vector.Fixed.Cont.Z (x : xs)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => GHC.Base.Applicative (Data.Vector.HFixed.Class.Fun xs)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => GHC.Base.Functor (Data.Vector.HFixed.Class.Fun xs)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => GHC.Base.Monad (Data.Vector.HFixed.Class.Fun xs)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.HomArity Data.Vector.Fixed.Cont.Z a
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.HomArity n a => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Boxed.Vec n a)
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.HomArity n a => Data.Vector.HFixed.Class.HomArity (Data.Vector.Fixed.Cont.S n) a
- Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Index n xs => Data.Vector.HFixed.Class.Index (Data.Vector.Fixed.Cont.S n) (x : xs)
- Data.Vector.HFixed.Class: newtype ContVec xs
- Data.Vector.HFixed.Class: newtype Fun (as :: [*]) b
- Data.Vector.HFixed.Class: shuffleF :: forall x xs r. Arity xs => (x -> Fun xs r) -> Fun xs (x -> r)
- Data.Vector.HFixed.Class: stepFun :: (Fun xs a -> Fun ys b) -> Fun (x : xs) a -> Fun (x : ys) b
- Data.Vector.HFixed.Class: tfunToFun :: TFun f xs b -> Fun (Wrap f xs) b
- Data.Vector.HFixed.Class: toContVec :: ContVecF xs f -> ContVec (Wrap f xs)
- Data.Vector.HFixed.Class: toContVecF :: ContVec (Wrap f xs) -> ContVecF xs f
- Data.Vector.HFixed.Class: uncurryFun2 :: (Arity xs) => (x -> y -> Fun xs (Fun ys r)) -> Fun (x : xs) (Fun (y : ys) r)
- Data.Vector.HFixed.Class: uncurryTFun2 :: (Arity xs, Arity ys) => (f x -> f y -> TFun f xs (TFun f ys r)) -> TFun f (x : xs) (TFun f (y : ys) r)
- Data.Vector.HFixed.Class: witAllInstances :: ArityC c xs => WitAllInstances c xs
- Data.Vector.HFixed.Class: witConcat :: (Arity xs, Arity ys) => WitConcat xs ys
- Data.Vector.HFixed.Class: witLenWrap :: Arity xs => WitLenWrap f xs
- Data.Vector.HFixed.Class: witNestedFun :: Arity xs => WitNestedFun xs ys r
- Data.Vector.HFixed.Class: witWrapIndex :: Index n xs => WitWrapIndex f n xs
- Data.Vector.HFixed.Class: witWrapped :: Arity xs => WitWrapped f xs
- Data.Vector.HFixed.Cont: ContVec :: (forall r. Fun xs r -> r) -> ContVec xs
- Data.Vector.HFixed.Cont: Fun :: Fn as b -> Fun b
- Data.Vector.HFixed.Cont: [runContVec] :: ContVec xs -> forall r. Fun xs r -> r
- Data.Vector.HFixed.Cont: [unFun] :: Fun b -> Fn as b
- Data.Vector.HFixed.Cont: accumTy :: Arity xs => (forall a as. t (a : as) -> f a -> t as) -> (t '[] -> b) -> t xs -> Fn (Wrap f xs) b
- Data.Vector.HFixed.Cont: applyM :: (Arity xs, Monad m) => (forall a as. t (a : as) -> m (a, t as)) -> t xs -> m (ContVec xs)
- Data.Vector.HFixed.Cont: applyTy :: Arity xs => (forall a as. t (a : as) -> (f a, t as)) -> t xs -> ContVecF xs f
- Data.Vector.HFixed.Cont: distribute :: forall f xs. (Arity xs, Functor f) => f (ContVec xs) -> ContVecF xs f
- Data.Vector.HFixed.Cont: foldl :: forall xs c b. (ArityC c xs) => Proxy c -> (forall a. c a => b -> a -> b) -> b -> ContVec xs -> b
- Data.Vector.HFixed.Cont: foldr :: forall xs c b. (ArityC c xs) => Proxy c -> (forall a. c a => a -> b -> b) -> b -> ContVec xs -> b
- Data.Vector.HFixed.Cont: mapFunctor :: (Arity xs) => (forall a. f a -> g a) -> ContVecF xs f -> ContVecF xs g
- Data.Vector.HFixed.Cont: mk0 :: ContVec '[]
- Data.Vector.HFixed.Cont: mk1 :: a -> ContVec '[a]
- Data.Vector.HFixed.Cont: mk2 :: a -> b -> ContVec '[a, b]
- Data.Vector.HFixed.Cont: mk3 :: a -> b -> c -> ContVec '[a, b, c]
- Data.Vector.HFixed.Cont: mk4 :: a -> b -> c -> d -> ContVec '[a, b, c, d]
- Data.Vector.HFixed.Cont: mk5 :: a -> b -> c -> d -> e -> ContVec '[a, b, c, d, e]
- Data.Vector.HFixed.Cont: monomorphize :: forall c xs a. (ArityC c xs) => Proxy c -> (forall x. c x => x -> a) -> ContVec xs -> ContVec (Len xs) a
- Data.Vector.HFixed.Cont: newtype ContVec xs
- Data.Vector.HFixed.Cont: newtype Fun (as :: [*]) b
- Data.Vector.HFixed.Cont: replicate :: forall xs c. (ArityC c xs) => Proxy c -> (forall x. c x => x) -> ContVec xs
- Data.Vector.HFixed.Cont: replicateM :: forall xs c m. (ArityC c xs, Monad m) => Proxy c -> (forall x. c x => m x) -> m (ContVec xs)
- Data.Vector.HFixed.Cont: sequence :: (Arity xs, Monad m) => ContVecF xs m -> m (ContVec xs)
- Data.Vector.HFixed.Cont: sequenceA :: (Arity xs, Applicative f) => ContVecF xs f -> f (ContVec xs)
- Data.Vector.HFixed.Cont: sequenceAF :: (Arity xs, Applicative f) => ContVecF xs (f `Compose` g) -> f (ContVecF xs g)
- Data.Vector.HFixed.Cont: toContVec :: ContVecF xs f -> ContVec (Wrap f xs)
- Data.Vector.HFixed.Cont: toContVecF :: ContVec (Wrap f xs) -> ContVecF xs f
- Data.Vector.HFixed.Cont: unfoldr :: forall xs c b. (ArityC c xs) => Proxy c -> (forall a. c a => b -> (a, b)) -> b -> ContVec xs
- Data.Vector.HFixed.Cont: unwrap :: Arity xs => (forall a. f a -> a) -> ContVecF xs f -> ContVec xs
- Data.Vector.HFixed.Cont: witConcat :: (Arity xs, Arity ys) => WitConcat xs ys
- Data.Vector.HFixed.Cont: witLenWrap :: Arity xs => WitLenWrap f xs
- Data.Vector.HFixed.Cont: witNestedFun :: Arity xs => WitNestedFun xs ys r
- Data.Vector.HFixed.Cont: witWrapped :: Arity xs => WitWrapped f xs
- Data.Vector.HFixed.Cont: wrap :: Arity xs => (forall a. a -> f a) -> ContVec xs -> ContVecF xs f
- Data.Vector.HFixed.Cont: zipFold :: forall xs c m. (ArityC c xs, Monoid m) => Proxy c -> (forall a. c a => a -> a -> m) -> ContVec xs -> ContVec xs -> m
- Data.Vector.HFixed.Cont: zipMono :: forall xs c. (ArityC c xs) => Proxy c -> (forall a. c a => a -> a -> a) -> ContVec xs -> ContVec xs -> ContVec xs
- Data.Vector.HFixed.Cont: zipMonoF :: forall xs f g h c. (ArityC c xs) => Proxy c -> (forall a. c a => f a -> g a -> h a) -> ContVecF xs f -> ContVecF xs g -> ContVecF xs h
- Data.Vector.HFixed.Functor.HVecF: HVecF :: HVec (Wrap f xs) -> HVecF xs f
- Data.Vector.HFixed.Functor.HVecF: [getHVecF] :: HVecF xs f -> HVec (Wrap f xs)
- Data.Vector.HFixed.Functor.HVecF: instance (Data.Vector.HFixed.Class.Arity (Data.Vector.HFixed.TypeFuns.Wrap f xs), Data.Vector.HFixed.Class.Arity xs) => Data.Vector.HFixed.Class.HVector (Data.Vector.HFixed.Functor.HVecF.HVecF xs f)
- Data.Vector.HFixed.Functor.HVecF: instance (Data.Vector.HFixed.Class.Arity xs, Data.Vector.HFixed.Class.ArityC Control.DeepSeq.NFData (Data.Vector.HFixed.TypeFuns.Wrap f xs)) => Control.DeepSeq.NFData (Data.Vector.HFixed.Functor.HVecF.HVecF xs f)
- Data.Vector.HFixed.Functor.HVecF: instance (Data.Vector.HFixed.Class.Arity xs, Data.Vector.HFixed.Class.ArityC GHC.Classes.Eq (Data.Vector.HFixed.TypeFuns.Wrap f xs)) => GHC.Classes.Eq (Data.Vector.HFixed.Functor.HVecF.HVecF xs f)
- Data.Vector.HFixed.Functor.HVecF: instance (Data.Vector.HFixed.Class.Arity xs, Data.Vector.HFixed.Class.ArityC GHC.Classes.Eq (Data.Vector.HFixed.TypeFuns.Wrap f xs), Data.Vector.HFixed.Class.ArityC GHC.Classes.Ord (Data.Vector.HFixed.TypeFuns.Wrap f xs)) => GHC.Classes.Ord (Data.Vector.HFixed.Functor.HVecF.HVecF xs f)
- Data.Vector.HFixed.Functor.HVecF: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.HVectorF (Data.Vector.HFixed.Functor.HVecF.HVecF xs)
- Data.Vector.HFixed.Functor.HVecF: newtype HVecF xs f
- Data.Vector.HFixed.HVec: data MutableHVec s (xs :: [*])
- Data.Vector.HFixed.HVec: instance (Data.Vector.HFixed.Class.ArityC GHC.Classes.Ord xs, GHC.Classes.Eq (Data.Vector.HFixed.HVec.HVec xs)) => GHC.Classes.Ord (Data.Vector.HFixed.HVec.HVec xs)
- Data.Vector.HFixed.HVec: modifyMutableHVec :: (PrimMonad m, Index n xs, Arity xs) => MutableHVec (PrimState m) xs -> n -> (ValueAt n xs -> ValueAt n xs) -> m ()
- Data.Vector.HFixed.HVec: modifyMutableHVec' :: (PrimMonad m, Index n xs, Arity xs) => MutableHVec (PrimState m) xs -> n -> (ValueAt n xs -> ValueAt n xs) -> m ()
- Data.Vector.HFixed.HVec: newMutableHVec :: forall m xs. (PrimMonad m, Arity xs) => m (MutableHVec (PrimState m) xs)
- Data.Vector.HFixed.HVec: readMutableHVec :: (PrimMonad m, Index n xs, Arity xs) => MutableHVec (PrimState m) xs -> n -> m (ValueAt n xs)
- Data.Vector.HFixed.HVec: unsafeFreezeHVec :: (PrimMonad m) => MutableHVec (PrimState m) xs -> m (HVec xs)
- Data.Vector.HFixed.HVec: writeMutableHVec :: (PrimMonad m, Index n xs, Arity xs) => MutableHVec (PrimState m) xs -> n -> ValueAt n xs -> m ()
- Data.Vector.HFixed.TypeFuns: unproxy :: Proxy t -> t
+ Data.Vector.HFixed: ContVecF :: (forall r. TFun f xs r -> r) -> ContVecF xs f
+ Data.Vector.HFixed: [runContVecF] :: ContVecF xs f -> forall r. TFun f xs r -> r
+ Data.Vector.HFixed: asCVecF :: ContVecF f xs -> ContVecF f xs
+ Data.Vector.HFixed: foldlF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => b -> f a -> b) -> b -> v f -> b
+ Data.Vector.HFixed: foldlNatF :: (HVectorF v) => (forall a. b -> f a -> b) -> b -> v f -> b
+ Data.Vector.HFixed: foldrF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a -> b -> b) -> b -> v f -> b
+ Data.Vector.HFixed: foldrNatF :: (HVectorF v) => (forall a. f a -> b -> b) -> b -> v f -> b
+ Data.Vector.HFixed: mapNat :: (HVectorF v) => (forall a. f a -> g a) -> v f -> v g
+ Data.Vector.HFixed: newtype ContVecF xs f
+ Data.Vector.HFixed: replicateNatF :: (HVectorF v, Arity (ElemsF v)) => (forall a. f a) -> v f
+ Data.Vector.HFixed: sequence_ :: (Applicative f, HVectorF v) => v f -> f ()
+ Data.Vector.HFixed: tupleSize :: forall v proxy. HVector v => proxy v -> Int
+ Data.Vector.HFixed: tupleSizeF :: forall v f proxy. HVectorF v => proxy (v f) -> Int
+ Data.Vector.HFixed: type ContVec xs = ContVecF xs Identity
+ Data.Vector.HFixed: unfoldrF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => b -> (f a, b)) -> b -> v f
+ Data.Vector.HFixed: zipFoldF :: (HVectorF v, ArityC c (ElemsF v), Monoid m) => Proxy c -> (forall a. c a => f a -> f a -> m) -> v f -> v f -> m
+ Data.Vector.HFixed: zipWith :: (HVector v, ArityC c (Elems v)) => Proxy c -> (forall a. c a => a -> a -> a) -> v -> v -> v
+ Data.Vector.HFixed: zipWithF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a -> g a -> h a) -> v f -> v g -> v h
+ Data.Vector.HFixed: zipWithNatF :: (HVectorF v) => (forall a. f a -> g a -> h a) -> v f -> v g -> v h
+ Data.Vector.HFixed.Class: [runContVecF] :: ContVecF xs f -> forall r. TFun f xs r -> r
+ Data.Vector.HFixed.Class: accumC :: ArityC c xs => proxy c -> (forall a as. (c a) => t (a : as) -> f a -> t as) -> (t '[] -> b) -> t xs -> TFun f xs b
+ Data.Vector.HFixed.Class: applyC :: ArityC c xs => proxy c -> (forall a as. (c a) => t (a : as) -> (f a, t as)) -> t xs -> ContVecF xs f
+ Data.Vector.HFixed.Class: constTFun :: TFun f xs r -> TFun f (x : xs) r
+ Data.Vector.HFixed.Class: instance (Data.Primitive.Types.Prim a, Data.Vector.HFixed.Class.HomArity (Data.Vector.Fixed.Cont.Peano n) a, GHC.TypeLits.KnownNat n, Data.Vector.Fixed.Cont.Peano (n GHC.TypeLits.+ 1) ~ 'Data.Vector.Fixed.Cont.S (Data.Vector.Fixed.Cont.Peano n)) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Primitive.Vec n a)
+ Data.Vector.HFixed.Class: instance (Data.Vector.Fixed.Unboxed.Unbox n a, Data.Vector.HFixed.Class.HomArity (Data.Vector.Fixed.Cont.Peano n) a, GHC.TypeLits.KnownNat n, Data.Vector.Fixed.Cont.Peano (n GHC.TypeLits.+ 1) ~ 'Data.Vector.Fixed.Cont.S (Data.Vector.Fixed.Cont.Peano n)) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Unboxed.Vec n a)
+ Data.Vector.HFixed.Class: instance (Data.Vector.HFixed.Class.HomArity (Data.Vector.Fixed.Cont.Peano n) a, GHC.TypeLits.KnownNat n, Data.Vector.Fixed.Cont.Peano (n GHC.TypeLits.+ 1) ~ 'Data.Vector.Fixed.Cont.S (Data.Vector.Fixed.Cont.Peano n)) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Boxed.Vec n a)
+ Data.Vector.HFixed.Class: instance (Foreign.Storable.Storable a, Data.Vector.HFixed.Class.HomArity (Data.Vector.Fixed.Cont.Peano n) a, GHC.TypeLits.KnownNat n, Data.Vector.Fixed.Cont.Peano (n GHC.TypeLits.+ 1) ~ 'Data.Vector.Fixed.Cont.S (Data.Vector.Fixed.Cont.Peano n)) => Data.Vector.HFixed.Class.HVector (Data.Vector.Fixed.Storable.Vec n a)
+ Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.HVector (Data.Vector.HFixed.Class.ContVecF xs Data.Functor.Identity.Identity)
+ Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.Index 'Data.Vector.Fixed.Cont.Z (x : xs)
+ Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.HomArity 'Data.Vector.Fixed.Cont.Z a
+ Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.HomArity n a => Data.Vector.HFixed.Class.HomArity ('Data.Vector.Fixed.Cont.S n) a
+ Data.Vector.HFixed.Class: instance Data.Vector.HFixed.Class.Index n xs => Data.Vector.HFixed.Class.Index ('Data.Vector.Fixed.Cont.S n) (x : xs)
+ Data.Vector.HFixed.Class: lensWorkerTF :: forall f g r x y xs. (Functor f, Arity xs) => (g x -> f (g y)) -> TFun g (y : xs) r -> TFun g (x : xs) (f r)
+ Data.Vector.HFixed.Class: stepTFun :: (TFun f xs a -> TFun f ys b) -> (TFun f (x : xs) a -> TFun f (x : ys) b)
+ Data.Vector.HFixed.Class: tupleSize :: forall v proxy. HVector v => proxy v -> Int
+ Data.Vector.HFixed.Class: tupleSizeF :: forall v f proxy. HVectorF v => proxy (v f) -> Int
+ Data.Vector.HFixed.Class: type ContVec xs = ContVecF xs Identity
+ Data.Vector.HFixed.Class: type Fun = TFun Identity
+ Data.Vector.HFixed.Class: uncurryMany :: forall xs ys r. Arity xs => Fun xs (Fun ys r) -> Fun (xs ++ ys) r
+ Data.Vector.HFixed.Cont: [runContVecF] :: ContVecF xs f -> forall r. TFun f xs r -> r
+ Data.Vector.HFixed.Cont: foldlF :: (ArityC c xs) => Proxy c -> (forall a. c a => b -> f a -> b) -> b -> ContVecF xs f -> b
+ Data.Vector.HFixed.Cont: foldlNatF :: (Arity xs) => (forall a. b -> f a -> b) -> b -> ContVecF xs f -> b
+ Data.Vector.HFixed.Cont: foldrF :: (ArityC c xs) => Proxy c -> (forall a. c a => f a -> b -> b) -> b -> ContVecF xs f -> b
+ Data.Vector.HFixed.Cont: foldrNatF :: (Arity xs) => (forall a. f a -> b -> b) -> b -> ContVecF xs f -> b
+ Data.Vector.HFixed.Cont: mapNat :: (Arity xs) => (forall a. f a -> g a) -> ContVecF xs f -> ContVecF xs g
+ Data.Vector.HFixed.Cont: replicateNatF :: forall f xs. Arity xs => (forall a. f a) -> ContVecF xs f
+ Data.Vector.HFixed.Cont: tupleSize :: forall v proxy. HVector v => proxy v -> Int
+ Data.Vector.HFixed.Cont: tupleSizeF :: forall v f proxy. HVectorF v => proxy (v f) -> Int
+ Data.Vector.HFixed.Cont: type ContVec xs = ContVecF xs Identity
+ Data.Vector.HFixed.Cont: type Fun = TFun Identity
+ Data.Vector.HFixed.Cont: unfoldrF :: (ArityC c xs) => Proxy c -> (forall a. c a => b -> (f a, b)) -> b -> ContVecF xs f
+ Data.Vector.HFixed.Cont: zipFoldF :: forall xs c m f. (ArityC c xs, Monoid m) => Proxy c -> (forall a. c a => f a -> f a -> m) -> ContVecF xs f -> ContVecF xs f -> m
+ Data.Vector.HFixed.Cont: zipWithF :: forall xs f g h c. (ArityC c xs) => Proxy c -> (forall a. c a => f a -> g a -> h a) -> ContVecF xs f -> ContVecF xs g -> ContVecF xs h
+ Data.Vector.HFixed.Cont: zipWithNatF :: forall xs f g h. (Arity xs) => (forall a. f a -> g a -> h a) -> ContVecF xs f -> ContVecF xs g -> ContVecF xs h
+ Data.Vector.HFixed.HVec: data HVecF (xs :: [*]) (f :: * -> *)
+ Data.Vector.HFixed.HVec: instance (Data.Functor.Classes.Eq1 f, Data.Vector.HFixed.Class.ArityC GHC.Classes.Eq xs) => GHC.Classes.Eq (Data.Vector.HFixed.HVec.HVecF xs f)
+ Data.Vector.HFixed.HVec: instance (Data.Functor.Classes.Ord1 f, Data.Vector.HFixed.Class.ArityC GHC.Classes.Eq xs, Data.Vector.HFixed.Class.ArityC GHC.Classes.Ord xs) => GHC.Classes.Ord (Data.Vector.HFixed.HVec.HVecF xs f)
+ Data.Vector.HFixed.HVec: instance (Data.Functor.Classes.Show1 f, Data.Vector.HFixed.Class.ArityC GHC.Show.Show xs) => GHC.Show.Show (Data.Vector.HFixed.HVec.HVecF xs f)
+ Data.Vector.HFixed.HVec: instance (Data.Vector.HFixed.Class.ArityC GHC.Classes.Ord xs, Data.Vector.HFixed.Class.ArityC GHC.Classes.Eq xs) => GHC.Classes.Ord (Data.Vector.HFixed.HVec.HVec xs)
+ Data.Vector.HFixed.HVec: instance Data.Vector.HFixed.Class.Arity xs => Data.Vector.HFixed.Class.HVectorF (Data.Vector.HFixed.HVec.HVecF xs)
- Data.Vector.HFixed: class Arity (Len xs) => Arity (xs :: [*])
+ Data.Vector.HFixed: class Arity (xs :: [*])
- Data.Vector.HFixed: class Arity xs => ArityC c xs
+ Data.Vector.HFixed: class (Arity xs) => ArityC c xs
- Data.Vector.HFixed: class Arity n => Index (n :: *) (xs :: [*]) where type ValueAt n xs :: * where {
+ Data.Vector.HFixed: class ArityPeano n => Index (n :: PeanoNum) (xs :: [*]) where type ValueAt n xs :: * where {
- Data.Vector.HFixed: element :: (Index n (Elems v), ValueAt n (Elems v) ~ a, HVector v, Functor f) => n -> (a -> f a) -> (v -> f v)
+ Data.Vector.HFixed: element :: forall n v a f proxy. (Index (Peano n) (Elems v), ValueAt (Peano n) (Elems v) ~ a, HVector v, Functor f) => proxy n -> (a -> f a) -> (v -> f v)
- Data.Vector.HFixed: elementCh :: (Index n (Elems v), a ~ ValueAt n (Elems v), HVector v, HVector w, Elems w ~ NewElems n (Elems v) b, Functor f) => n -> (a -> f b) -> (v -> f w)
+ Data.Vector.HFixed: elementCh :: forall n v w a b f proxy. (Index (Peano n) (Elems v), ValueAt (Peano n) (Elems v) ~ a, HVector v, HVector w, Elems w ~ NewElems (Peano n) (Elems v) b, Functor f) => proxy n -> (a -> f b) -> (v -> f w)
- Data.Vector.HFixed: fold :: HVector v => v -> Fn (Elems v) r -> r
+ Data.Vector.HFixed: fold :: HVector v => v -> Fn Identity (Elems v) r -> r
- Data.Vector.HFixed: index :: (Index n (Elems v), HVector v) => v -> n -> ValueAt n (Elems v)
+ Data.Vector.HFixed: index :: (Index n (Elems v), HVector v) => v -> proxy n -> ValueAt n (Elems v)
- Data.Vector.HFixed: mapM_ :: (HVector v, ArityC c (Elems v), Monad m) => Proxy c -> (forall a. c a => a -> m ()) -> v -> m ()
+ Data.Vector.HFixed: mapM_ :: (HVector v, ArityC c (Elems v), Applicative f) => Proxy c -> (forall a. c a => a -> f ()) -> v -> f ()
- Data.Vector.HFixed: mk0 :: (HVector v, Elems v ~ '[]) => v
+ Data.Vector.HFixed: mk0 :: forall v. (HVector v, Elems v ~ '[]) => v
- Data.Vector.HFixed: mk1 :: (HVector v, Elems v ~ '[a]) => a -> v
+ Data.Vector.HFixed: mk1 :: forall v a. (HVector v, Elems v ~ '[a]) => a -> v
- Data.Vector.HFixed: mk2 :: (HVector v, Elems v ~ '[a, b]) => a -> b -> v
+ Data.Vector.HFixed: mk2 :: forall v a b. (HVector v, Elems v ~ '[a, b]) => a -> b -> v
- Data.Vector.HFixed: mk3 :: (HVector v, Elems v ~ '[a, b, c]) => a -> b -> c -> v
+ Data.Vector.HFixed: mk3 :: forall v a b c. (HVector v, Elems v ~ '[a, b, c]) => a -> b -> c -> v
- Data.Vector.HFixed: mk4 :: (HVector v, Elems v ~ '[a, b, c, d]) => a -> b -> c -> d -> v
+ Data.Vector.HFixed: mk4 :: forall v a b c d. (HVector v, Elems v ~ '[a, b, c, d]) => a -> b -> c -> d -> v
- Data.Vector.HFixed: mk5 :: (HVector v, Elems v ~ '[a, b, c, d, e]) => a -> b -> c -> d -> e -> v
+ Data.Vector.HFixed: mk5 :: forall v a b c d e. (HVector v, Elems v ~ '[a, b, c, d, e]) => a -> b -> c -> d -> e -> v
- Data.Vector.HFixed: monomorphize :: (HVector v, ArityC c (Elems v)) => Proxy c -> (forall a. c a => a -> x) -> v -> ContVec (Len (Elems v)) x
+ Data.Vector.HFixed: monomorphize :: (HVector v, Peano n ~ Len (Elems v), ArityC c (Elems v)) => Proxy c -> (forall a. c a => a -> x) -> v -> ContVec n x
- Data.Vector.HFixed: monomorphizeF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a -> x) -> v f -> ContVec (Len (ElemsF v)) x
+ Data.Vector.HFixed: monomorphizeF :: (HVectorF v, Peano n ~ Len (ElemsF v), ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a -> x) -> v f -> ContVec n x
- Data.Vector.HFixed: replicateF :: (HVectorF v, Arity (ElemsF v)) => (forall a. f a) -> v f
+ Data.Vector.HFixed: replicateF :: (HVectorF v, ArityC c (ElemsF v)) => Proxy c -> (forall a. c a => f a) -> v f
- Data.Vector.HFixed: replicateM :: (HVector v, Monad m, ArityC c (Elems v)) => Proxy c -> (forall x. c x => m x) -> m v
+ Data.Vector.HFixed: replicateM :: (HVector v, Applicative f, ArityC c (Elems v)) => Proxy c -> (forall a. c a => f a) -> f v
- Data.Vector.HFixed: sequence :: (Monad m, HVectorF v, HVector w, ElemsF v ~ Elems w) => v m -> m w
+ Data.Vector.HFixed: sequence :: (Applicative f, HVectorF v, HVector w, ElemsF v ~ Elems w) => v f -> f w
- Data.Vector.HFixed: sequenceF :: (Monad m, HVectorF v) => v (m `Compose` f) -> m (v f)
+ Data.Vector.HFixed: sequenceF :: (Applicative f, HVectorF v) => v (f `Compose` g) -> f (v g)
- Data.Vector.HFixed: set :: (Index n (Elems v), HVector v) => n -> ValueAt n (Elems v) -> v -> v
+ Data.Vector.HFixed: set :: (Index n (Elems v), HVector v) => proxy n -> ValueAt n (Elems v) -> v -> v
- Data.Vector.HFixed.Class: TFun :: Fn (Wrap f as) b -> TFun f as b
+ Data.Vector.HFixed.Class: TFun :: Fn f as b -> TFun f as b
- Data.Vector.HFixed.Class: [unTFun] :: TFun f as b -> Fn (Wrap f as) b
+ Data.Vector.HFixed.Class: [unTFun] :: TFun f as b -> Fn f as b
- Data.Vector.HFixed.Class: accum :: Arity xs => (forall a as. t (a : as) -> a -> t as) -> (t '[] -> b) -> t xs -> Fn xs b
+ Data.Vector.HFixed.Class: accum :: Arity xs => (forall a as. t (a : as) -> f a -> t as) -> (t '[] -> b) -> t xs -> TFun f xs b
- Data.Vector.HFixed.Class: apply :: Arity xs => (forall a as. t (a : as) -> (a, t as)) -> t xs -> ContVec xs
+ Data.Vector.HFixed.Class: apply :: Arity xs => (forall a as. t (a : as) -> (f a, t as)) -> t xs -> ContVecF xs f
- Data.Vector.HFixed.Class: class Arity (Len xs) => Arity (xs :: [*])
+ Data.Vector.HFixed.Class: class Arity (xs :: [*])
- Data.Vector.HFixed.Class: class Arity xs => ArityC c xs
+ Data.Vector.HFixed.Class: class (Arity xs) => ArityC c xs
- Data.Vector.HFixed.Class: class (Arity n, Arity (HomList n a)) => HomArity n a
+ Data.Vector.HFixed.Class: class (ArityPeano n, Arity (HomList n a)) => HomArity n a
- Data.Vector.HFixed.Class: class Arity n => Index (n :: *) (xs :: [*]) where type ValueAt n xs :: * type NewElems n xs a :: [*] where {
+ Data.Vector.HFixed.Class: class ArityPeano n => Index (n :: PeanoNum) (xs :: [*]) where type ValueAt n xs :: * type NewElems n xs a :: [*] where {
- Data.Vector.HFixed.Class: getF :: Index n xs => n -> Fun xs (ValueAt n xs)
+ Data.Vector.HFixed.Class: getF :: Index n xs => proxy n -> Fun xs (ValueAt n xs)
- Data.Vector.HFixed.Class: homConstruct :: forall v a. (Vector v a, HomArity (Dim v) a) => Fun (HomList (Dim v) a) (v a)
+ Data.Vector.HFixed.Class: homConstruct :: forall v a. (Vector v a, HomArity (Peano (Dim v)) a) => Fun (HomList (Peano (Dim v)) a) (v a)
- Data.Vector.HFixed.Class: homInspect :: (Vector v a, HomArity (Dim v) a) => v a -> Fun (HomList (Dim v) a) r -> r
+ Data.Vector.HFixed.Class: homInspect :: (Vector v a, HomArity (Peano (Dim v)) a) => v a -> Fun (HomList (Peano (Dim v)) a) r -> r
- Data.Vector.HFixed.Class: lensChF :: (Index n xs, Functor f) => n -> (ValueAt n xs -> f a) -> Fun (NewElems n xs a) r -> Fun xs (f r)
+ Data.Vector.HFixed.Class: lensChF :: (Index n xs, Functor f) => proxy n -> (ValueAt n xs -> f a) -> Fun (NewElems n xs a) r -> Fun xs (f r)
- Data.Vector.HFixed.Class: lensF :: (Index n xs, Functor f, v ~ ValueAt n xs) => n -> (v -> f v) -> Fun xs r -> Fun xs (f r)
+ Data.Vector.HFixed.Class: lensF :: (Index n xs, Functor f, v ~ ValueAt n xs) => proxy n -> (v -> f v) -> Fun xs r -> Fun xs (f r)
- Data.Vector.HFixed.Class: putF :: Index n xs => n -> ValueAt n xs -> Fun xs r -> Fun xs r
+ Data.Vector.HFixed.Class: putF :: Index n xs => proxy n -> ValueAt n xs -> Fun xs r -> Fun xs r
- Data.Vector.HFixed.Cont: TFun :: Fn (Wrap f as) b -> TFun f as b
+ Data.Vector.HFixed.Cont: TFun :: Fn f as b -> TFun f as b
- Data.Vector.HFixed.Cont: [unTFun] :: TFun f as b -> Fn (Wrap f as) b
+ Data.Vector.HFixed.Cont: [unTFun] :: TFun f as b -> Fn f as b
- Data.Vector.HFixed.Cont: accum :: Arity xs => (forall a as. t (a : as) -> a -> t as) -> (t '[] -> b) -> t xs -> Fn xs b
+ Data.Vector.HFixed.Cont: accum :: Arity xs => (forall a as. t (a : as) -> f a -> t as) -> (t '[] -> b) -> t xs -> TFun f xs b
- Data.Vector.HFixed.Cont: apply :: Arity xs => (forall a as. t (a : as) -> (a, t as)) -> t xs -> ContVec xs
+ Data.Vector.HFixed.Cont: apply :: Arity xs => (forall a as. t (a : as) -> (f a, t as)) -> t xs -> ContVecF xs f
- Data.Vector.HFixed.Cont: class Arity (Len xs) => Arity (xs :: [*])
+ Data.Vector.HFixed.Cont: class Arity (xs :: [*])
- Data.Vector.HFixed.Cont: class Arity n => Index (n :: *) (xs :: [*]) where type ValueAt n xs :: * where {
+ Data.Vector.HFixed.Cont: class ArityPeano n => Index (n :: PeanoNum) (xs :: [*]) where type ValueAt n xs :: * where {
- Data.Vector.HFixed.Cont: head :: forall x xs. Arity xs => ContVec (x : xs) -> x
+ Data.Vector.HFixed.Cont: head :: Arity xs => ContVec (x : xs) -> x
- Data.Vector.HFixed.Cont: index :: Index n xs => ContVec xs -> n -> ValueAt n xs
+ Data.Vector.HFixed.Cont: index :: Index n xs => ContVec xs -> proxy n -> ValueAt n xs
- Data.Vector.HFixed.Cont: monomorphizeF :: forall c xs a f. (ArityC c xs) => Proxy c -> (forall x. c x => f x -> a) -> ContVecF xs f -> ContVec (Len xs) a
+ Data.Vector.HFixed.Cont: monomorphizeF :: forall c xs a f n. (ArityC c xs, Peano n ~ Len xs) => Proxy c -> (forall x. c x => f x -> a) -> ContVecF xs f -> ContVec n a
- Data.Vector.HFixed.Cont: replicateF :: forall f xs. Arity xs => (forall a. f a) -> ContVecF xs f
+ Data.Vector.HFixed.Cont: replicateF :: forall f c xs. ArityC c xs => Proxy c -> (forall a. c a => f a) -> ContVecF xs f
- Data.Vector.HFixed.Cont: sequenceF :: (Arity xs, Monad m) => ContVecF xs (m `Compose` f) -> m (ContVecF xs f)
+ Data.Vector.HFixed.Cont: sequenceF :: (Arity xs, Applicative f) => ContVecF xs (f `Compose` g) -> f (ContVecF xs g)
- Data.Vector.HFixed.Cont: set :: Index n xs => n -> ValueAt n xs -> ContVec xs -> ContVec xs
+ Data.Vector.HFixed.Cont: set :: Index n xs => proxy n -> ValueAt n xs -> ContVec xs -> ContVec xs

Files

− ChangeLog
@@ -1,33 +0,0 @@-Changes in 0.3.1.2--  * Fix build for GHC 8.2--Changes in 0.3.1.0--  * Fix build for GHC 8.0---Changes in 0.3.1.0--  * replicateF added--  * type signature of zipMonoF generalized---Changes in 0.3.0.0--  * HVector instances up to 32-element tuples--  * `asCVec` function added--  * `ContVec` reexported from Data.Vector.HFixed---Changes in 0.2.0.0--  * Type changing lenses added--  * zipMonoF added--  * types of monomorphize and monomorphizeF corrected-
+ ChangeLog.md view
@@ -0,0 +1,48 @@+Changes in 0.4.0.0++  * Major rework of API. `Fun` and `TFun` are unified. `Fun ~ TFun Identity`.+    Type class `ArityC` now contain special variants of `accum` and+    `arity` instead of building data structure containing all necessary dictionaries.++  * `Monad` constraints now relaxed to `Applicative` where appropriate++  * Most functions now have 3 variants: typeclass-based for `HVector`,+    typeclass-based for `HVectorF` and ones that use natural transformations for+    `HVectorF`. Some have been renamed to get consistent naming.++  * Support for GHC 7.10 is dropped++  * `HVecF` definition is moved to `Data.Vector.HFixed.HVec`++Changes in 0.3.1.2++  * Fix build for GHC 8.2++Changes in 0.3.1.0++  * Fix build for GHC 8.0+++Changes in 0.3.1.0++  * replicateF added++  * type signature of zipMonoF generalized+++Changes in 0.3.0.0++  * HVector instances up to 32-element tuples++  * `asCVec` function added++  * `ContVec` reexported from Data.Vector.HFixed+++Changes in 0.2.0.0++  * Type changing lenses added++  * zipMonoF added++  * types of monomorphize and monomorphizeF corrected
Data/Vector/HFixed.hs view
@@ -1,15 +1,15 @@-{-# LANGUAGE CPP                   #-}-{-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE ConstraintKinds       #-}+{-# LANGUAGE DataKinds             #-}+{-# LANGUAGE FlexibleContexts      #-} {-# LANGUAGE FlexibleInstances     #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE Rank2Types            #-} {-# LANGUAGE ScopedTypeVariables   #-}-{-# LANGUAGE TypeOperators         #-}+{-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE TypeApplications      #-} {-# LANGUAGE TypeFamilies          #-}-{-# LANGUAGE DataKinds             #-}+{-# LANGUAGE TypeOperators         #-} {-# LANGUAGE UndecidableInstances  #-}-{-# LANGUAGE Rank2Types            #-}-{-# LANGUAGE ConstraintKinds       #-} -- | -- Heterogeneous vectors. module Data.Vector.HFixed (@@ -17,11 +17,14 @@     Arity   , ArityC   , HVector(..)+  , tupleSize   , HVectorF(..)-  , Wrap+  , tupleSizeF   , Proxy(..)   , ContVec+  , ContVecF(..)   , asCVec+  , asCVecF     -- * Position based functions   , convert   , head@@ -35,10 +38,6 @@   , set   , element   , elementCh-#if __GLASGOW_HASKELL__ >= 708-  , elementTy-  , elementChTy-#endif     -- * Generic constructors   , mk0   , mk1@@ -50,23 +49,31 @@   , fold   , foldr   , foldl+  , foldrF+  , foldlF+  , foldrNatF+  , foldlNatF   , mapM_   , unfoldr-    -- * Polymorphic values+  , unfoldrF+    -- ** Replicate variants   , replicate   , replicateM   , replicateF-  , zipMono-  , zipMonoF+  , replicateNatF+    -- ** Zip variants+  , zipWith+  , zipWithF+  , zipWithNatF   , zipFold+  , zipFoldF   , monomorphize   , monomorphizeF-    -- * Vector parametrized with type constructor-  , mapFunctor+    -- ** Tuples parametrized with type constructor+  , mapNat   , sequence-  , sequenceA+  , sequence_   , sequenceF-  , sequenceAF   , wrap   , unwrap   , distribute@@ -77,17 +84,19 @@   , rnf   ) where -import Control.Monad        (liftM)-import Control.Applicative  (Applicative,(<$>))+import Control.Applicative  (Applicative(..),(<$>)) import qualified Control.DeepSeq as NF-                                       -import Data.Functor.Compose (Compose)-import Data.Monoid          (Monoid,All(..))-import Prelude (Functor(..),Monad(..),Eq(..),Ord,Bool,Ordering,-                id,(.),($),undefined,seq)++import Data.Coerce           (coerce)+import Data.Functor.Compose  (Compose(..))+import Data.Functor.Identity (Identity(..))+import Data.Monoid           (Monoid,All(..))+import Prelude ( Functor(..),Eq(..),Ord,Bool,Ordering+               , id,(.),($),seq) import qualified Prelude -import Data.Vector.HFixed.Class hiding (cons,consF)+import           Data.Vector.HFixed.Class hiding (cons,consF)+import           Data.Vector.Fixed.Cont       (Peano) import qualified Data.Vector.Fixed          as F import qualified Data.Vector.HFixed.Cont    as C @@ -111,6 +120,9 @@ asCVec :: ContVec xs -> ContVec xs asCVec = id +asCVecF :: ContVecF f xs -> ContVecF f xs+asCVecF = id+ -- | We can convert between any two vector which have same --   structure but different representations. convert :: (HVector v, HVector w, Elems v ~ Elems w)@@ -122,21 +134,21 @@ -- -- >>> case tail ('a',"aa",()) of x@(_,_) -> x -- ("aa",())-tail :: (HVector v, HVector w, (a ': Elems w) ~ Elems v)+tail :: (HVector v, HVector w, (a : Elems w) ~ Elems v)      => v -> w {-# INLINE tail #-} tail = C.vector . C.tail . C.cvec   -- | Head of the vector-head :: (HVector v, Elems v ~ (a ': as), Arity as)+head :: (HVector v, Elems v ~ (a : as), Arity as)      => v -> a {-# INLINE head #-} head = C.head . C.cvec  -- | Prepend element to the list. Note that it changes type of vector --   so it either must be known from context of specified explicitly-cons :: (HVector v, HVector w, Elems w ~ (a ': Elems v))+cons :: (HVector v, HVector w, Elems w ~ (a : Elems v))      => a -> v -> w {-# INLINE cons #-} cons a = C.vector . C.cons a . C.cvec@@ -156,63 +168,46 @@ ----------------------------------------------------------------  -- | Index heterogeneous vector-index :: (Index n (Elems v), HVector v) => v -> n -> ValueAt n (Elems v)+index :: (Index n (Elems v), HVector v) => v -> proxy n -> ValueAt n (Elems v) {-# INLINE index #-} index = C.index . C.cvec  -- | Set element in the vector set :: (Index n (Elems v), HVector v)-       => n -> ValueAt n (Elems v) -> v -> v+       => proxy n -> ValueAt n (Elems v) -> v -> v {-# INLINE set #-} set n x = C.vector         . C.set n x         . C.cvec  -- | Twan van Laarhoven's lens for i'th element.-element :: (Index n (Elems v), ValueAt n (Elems v) ~ a, HVector v, Functor f)-        => n -> (a -> f a) -> (v -> f v)+element :: forall n v a f proxy.+           ( Index   (Peano n) (Elems v)+           , ValueAt (Peano n) (Elems v) ~ a+           , HVector v+           , Functor f+           )+        => proxy n -> (a -> f a) -> (v -> f v) {-# INLINE element #-}-element n f v = inspect v-              $ lensF n f construct+element _ f v = inspect v+              $ lensF (Proxy @ (Peano n)) f construct  -- | Type changing Twan van Laarhoven's lens for i'th element.-elementCh :: ( Index n (Elems v)-             , a ~ ValueAt n (Elems v)+elementCh :: forall n v w a b f proxy.+             ( Index   (Peano n) (Elems v)+             , ValueAt (Peano n) (Elems v) ~ a              , HVector v              , HVector w-             , Elems w ~ NewElems n (Elems v) b-             , Functor f)-          => n -> (a -> f b) -> (v -> f w)+             , Elems w ~ NewElems (Peano n) (Elems v) b+             , Functor f+             )+          => proxy n -> (a -> f b) -> (v -> f w) {-# INLINE elementCh #-}-elementCh n f v = inspect v-                $ lensChF n f construct+elementCh _ f v = inspect v+                $ lensChF (Proxy @ (Peano n)) f construct -#if __GLASGOW_HASKELL__ >= 708--- | Twan van Laarhoven's lens for i'th element. GHC >= 7.8-elementTy :: forall n a f v proxy.-             ( Index   (ToPeano n) (Elems v)-             , ValueAt (ToPeano n) (Elems v) ~ a-             , NatIso  (ToPeano n) n-             , HVector v-             , Functor f)-          => proxy n -> (a -> f a) -> (v -> f v)-{-# INLINE elementTy #-}-elementTy _ = element (undefined :: ToPeano n) --- | Type changing Twan van Laarhoven's lens for i'th element.-elementChTy :: forall a b f n v w proxy.-               ( Index (ToPeano n) (Elems v)-               , a ~ ValueAt (ToPeano n) (Elems v)-               , HVector v-               , HVector w-               , Elems w ~ NewElems (ToPeano n) (Elems v) b-               , Functor f)-            => proxy n -> (a -> f b) -> (v -> f w)-{-# INLINE elementChTy #-}-elementChTy _ = elementCh (undefined :: ToPeano n)-#endif - ---------------------------------------------------------------- -- Folds over vector ----------------------------------------------------------------@@ -222,112 +217,155 @@ -- -- >>> fold (12::Int,"Str") (\a s -> show a ++ s) -- "12Str"-fold :: HVector v => v -> Fn (Elems v) r -> r-fold v f = inspect v (Fun f)+fold :: HVector v => v -> Fn Identity (Elems v) r -> r+-- FIXME: Not really useable+fold v f = inspect v (TFun f) {-# INLINE fold #-}  -- | Right fold over heterogeneous vector foldr :: (HVector v, ArityC c (Elems v))       => Proxy c -> (forall a. c a => a -> b -> b) -> b -> v -> b {-# INLINE foldr #-}-foldr c f b0 = C.foldr c f b0 . C.cvec+foldr c f b0 = C.foldrF c (\(Identity a) b -> f a b) b0 . C.cvec  -- | Left fold over heterogeneous vector foldl :: (HVector v, ArityC c (Elems v))       => Proxy c -> (forall a. c a => b -> a -> b) -> b -> v -> b {-# INLINE foldl #-}-foldl c f b0 = C.foldl c f b0 . C.cvec+foldl c f b0 = C.foldlF c (\b (Identity a) -> f b a) b0 . C.cvec +-- | Right fold over heterogeneous vector+foldrF :: (HVectorF v, ArityC c (ElemsF v))+       => Proxy c -> (forall a. c a => f a -> b -> b) -> b -> v f -> b+{-# INLINE foldrF #-}+foldrF c f b0 = C.foldrF c f b0 . C.cvecF++-- | Left fold over heterogeneous vector+foldlF :: (HVectorF v, ArityC c (ElemsF v))+       => Proxy c -> (forall a. c a => b -> f a -> b) -> b -> v f -> b+{-# INLINE foldlF #-}+foldlF c f b0 = C.foldlF c f b0 . C.cvecF++-- | Right fold over heterogeneous vector+foldrNatF :: (HVectorF v)+          => (forall a. f a -> b -> b) -> b -> v f -> b+{-# INLINE foldrNatF #-}+foldrNatF f b0 = C.foldrNatF f b0 . C.cvecF++-- | Left fold over heterogeneous vector+foldlNatF :: (HVectorF v)+          => (forall a. b -> f a -> b) -> b -> v f -> b+{-# INLINE foldlNatF #-}+foldlNatF f b0 = C.foldlNatF f b0 . C.cvecF+ -- | Apply monadic action to every element in the vector-mapM_ :: (HVector v, ArityC c (Elems v), Monad m)-      => Proxy c -> (forall a. c a => a -> m ()) -> v -> m ()+mapM_ :: (HVector v, ArityC c (Elems v), Applicative f)+      => Proxy c -> (forall a. c a => a -> f ()) -> v -> f () {-# INLINE mapM_ #-}-mapM_ c f = foldl c (\m a -> m >> f a) (return ())+mapM_ c f = foldl c (\m a -> m *> f a) (pure ()) +-- | Unfold vector.+unfoldr :: (HVector v, ArityC c (Elems v))+        => Proxy c -> (forall a. c a => b -> (a,b)) -> b -> v+{-# INLINE unfoldr #-}+unfoldr c f = C.vector . C.unfoldrF c (\b -> let (a,b') = f b in (Identity a, b')) +-- | Unfold vector.+unfoldrF :: (HVectorF v, ArityC c (ElemsF v))+        => Proxy c -> (forall a. c a => b -> (f a,b)) -> b -> v f+{-# INLINE unfoldrF #-}+unfoldrF c f = C.vectorF . C.unfoldrF c f ++ ---------------------------------------------------------------- -- Constructors ---------------------------------------------------------------- -mk0 :: (HVector v, Elems v ~ '[]) => v-mk0 = C.vector C.mk0+mk0 :: forall v. (HVector v, Elems v ~ '[]) => v+mk0 = coerce (construct :: Fun '[] v) {-# INLINE mk0 #-} -mk1 :: (HVector v, Elems v ~ '[a]) => a -> v-mk1 a = C.vector $ C.mk1 a+mk1 :: forall v a. (HVector v, Elems v ~ '[a])+    => a -> v+mk1 = coerce (construct :: Fun '[a] v) {-# INLINE mk1 #-} -mk2 :: (HVector v, Elems v ~ '[a,b]) => a -> b -> v-mk2 a b = C.vector $ C.mk2 a b+mk2 :: forall v a b. (HVector v, Elems v ~ '[a,b])+    => a -> b -> v+mk2 = coerce (construct :: Fun '[a,b] v) {-# INLINE mk2 #-} -mk3 :: (HVector v, Elems v ~ '[a,b,c]) => a -> b -> c -> v-mk3 a b c = C.vector $ C.mk3 a b c+mk3 :: forall v a b c. (HVector v, Elems v ~ '[a,b,c])+    => a -> b -> c -> v+mk3 = coerce (construct :: Fun '[a,b,c] v) {-# INLINE mk3 #-} -mk4 :: (HVector v, Elems v ~ '[a,b,c,d]) => a -> b -> c -> d -> v-mk4 a b c d = C.vector $ C.mk4 a b c d+mk4 :: forall v a b c d. (HVector v, Elems v ~ '[a,b,c,d])+    => a -> b -> c -> d -> v+mk4 = coerce (construct :: Fun '[a,b,c,d] v) {-# INLINE mk4 #-} -mk5 :: (HVector v, Elems v ~ '[a,b,c,d,e]) => a -> b -> c -> d -> e -> v-mk5 a b c d e = C.vector $ C.mk5 a b c d e+mk5 :: forall v a b c d e. (HVector v, Elems v ~ '[a,b,c,d,e])+    => a -> b -> c -> d -> e -> v+mk5 = coerce (construct :: Fun '[a,b,c,d,e] v) {-# INLINE mk5 #-}  + ---------------------------------------------------------------- -- Collective operations ---------------------------------------------------------------- -mapFunctor :: (HVectorF v)+-- | Apply natural transformation to every element of the tuple.+mapNat :: (HVectorF v)            => (forall a. f a -> g a) -> v f -> v g-{-# INLINE mapFunctor #-}-mapFunctor f = C.vectorF . C.mapFunctor f . C.cvecF+{-# INLINE mapNat #-}+mapNat f = C.vectorF . C.mapNat f . C.cvecF  -- | Sequence effects for every element in the vector sequence-  :: ( Monad m, HVectorF v, HVector w, ElemsF v ~ Elems w )-  => v m -> m w-{-# INLINE sequence #-}-sequence v = do w <- C.sequence $ C.cvecF v-                return $ C.vector w---- | Sequence effects for every element in the vector-sequenceA   :: ( Applicative f, HVectorF v, HVector w, ElemsF v ~ Elems w )   => v f -> f w-{-# INLINE sequenceA #-}-sequenceA v = C.vector <$> C.sequenceA (C.cvecF v)+{-# INLINE sequence #-}+sequence+  = fmap C.vector+  . C.sequenceF+  . C.mapNat (Compose . fmap Identity)+  . C.cvecF  -- | Sequence effects for every element in the vector-sequenceF :: ( Monad m, HVectorF v) => v (m `Compose` f) -> m (v f)-{-# INLINE sequenceF #-}-sequenceF v = do w <- C.sequenceF $ C.cvecF v-                 return $ C.vectorF w+sequence_ :: (Applicative f, HVectorF v) => v f -> f ()+{-# INLINE sequence_ #-}+sequence_ = foldlNatF (\m a -> m <* a) (pure ())  -- | Sequence effects for every element in the vector-sequenceAF :: ( Applicative f, HVectorF v) => v (f `Compose` g) -> f (v g)-{-# INLINE sequenceAF #-}-sequenceAF v = C.vectorF <$> C.sequenceAF (C.cvecF v)+sequenceF :: ( Applicative f, HVectorF v) => v (f `Compose` g) -> f (v g)+{-# INLINE sequenceF #-}+sequenceF v = C.vectorF <$> C.sequenceF (C.cvecF v)  -- | Wrap every value in the vector into type constructor. wrap :: ( HVector v, HVectorF w, Elems v ~ ElemsF w )      => (forall a. a -> f a) -> v -> w f {-# INLINE wrap #-}-wrap f = C.vectorF . C.wrap f . C.cvec+wrap f = C.vectorF . C.mapNat (f . runIdentity) . C.cvec  -- | Unwrap every value in the vector from the type constructor. unwrap :: ( HVectorF v, HVector w, ElemsF v ~ Elems w )        => (forall a. f a -> a) -> v f -> w {-# INLINE unwrap #-}-unwrap  f = C.vector . C.unwrap f . C.cvecF+unwrap  f = C.vector . C.mapNat (Identity . f) . C.cvecF  -- | Analog of /distribute/ from /Distributive/ type class. distribute   :: ( Functor f, HVector v, HVectorF w,  Elems v ~ ElemsF w )   => f v -> w f {-# INLINE distribute #-}-distribute = C.vectorF . C.distribute . fmap C.cvec+distribute+  = C.vectorF+  . mapNat (fmap runIdentity . getCompose)+  . C.distributeF+  . fmap C.cvec  -- | Analog of /distribute/ from /Distributive/ type class. distributeF@@ -351,7 +389,7 @@ replicate :: (HVector v, ArityC c (Elems v))           => Proxy c -> (forall x. c x => x) -> v {-# INLINE replicate #-}-replicate c x = C.vector $ C.replicate c x+replicate c x = C.vector $ C.replicateF c (Identity x)  -- | Replicate monadic action n times. --@@ -360,54 +398,80 @@ -- > 12 -- > 'a' -- (12,'a')-replicateM :: (HVector v, Monad m, ArityC c (Elems v))-           => Proxy c -> (forall x. c x => m x) -> m v+replicateM :: (HVector v, Applicative f, ArityC c (Elems v))+           => Proxy c -> (forall a. c a => f a) -> f v {-# INLINE replicateM #-}-replicateM c x = liftM C.vector $ C.replicateM c x+replicateM c x+  = fmap C.vector+  $ C.sequenceF+  $ C.replicateF c (Compose $ fmap Identity x) -replicateF :: (HVectorF v, Arity (ElemsF v))+replicateNatF :: (HVectorF v, Arity (ElemsF v))            => (forall a. f a) -> v f+{-# INLINE replicateNatF #-}+replicateNatF x = C.vectorF $ C.replicateNatF x++replicateF :: (HVectorF v, ArityC c (ElemsF v))+            => Proxy c -> (forall a. c a => f a) -> v f {-# INLINE replicateF #-}-replicateF x = C.vectorF $ C.replicateF x+replicateF c x = C.vectorF $ C.replicateF c x  --- | Unfold vector.-unfoldr :: (HVector v, ArityC c (Elems v))-        => Proxy c -> (forall a. c a => b -> (a,b)) -> b -> v-{-# INLINE unfoldr #-}-unfoldr c f b0 = C.vector $ C.unfoldr c f b0 +----------------------------------------------------------------+-- Zipping of vectors+----------------------------------------------------------------+ -- | Zip two heterogeneous vectors-zipMono :: (HVector v, ArityC c (Elems v))+zipWith :: (HVector v, ArityC c (Elems v))         => Proxy c -> (forall a. c a => a -> a -> a) -> v -> v -> v-{-# INLINE zipMono #-}-zipMono c f v u-  = C.vector $ C.zipMono c f (C.cvec v) (C.cvec u)+{-# INLINE zipWith #-}+zipWith c f v u+  = C.vector+  $ C.zipWithF c (\(Identity a) (Identity b) -> Identity (f a b)) (C.cvec v) (C.cvec u)  -- | Zip two heterogeneous vectors-zipMonoF :: (HVectorF v, ArityC c (ElemsF v))+zipWithF :: (HVectorF v, ArityC c (ElemsF v))          => Proxy c -> (forall a. c a => f a -> g a -> h a) -> v f -> v g -> v h-{-# INLINE zipMonoF #-}-zipMonoF c f v u-  = C.vectorF $ C.zipMonoF c f (C.cvecF v) (C.cvecF u)+{-# INLINE zipWithF #-}+zipWithF c f v u+  = C.vectorF $ C.zipWithF c f (C.cvecF v) (C.cvecF u) +-- | Zip two heterogeneous vectors+zipWithNatF :: (HVectorF v)+        => (forall a. f a -> g a -> h a) -> v f -> v g -> v h+{-# INLINE zipWithNatF #-}+zipWithNatF f v u+  = C.vectorF $ C.zipWithNatF f (C.cvecF v) (C.cvecF u)+ zipFold :: (HVector v, ArityC c (Elems v), Monoid m)         => Proxy c -> (forall a. c a => a -> a -> m) -> v -> v -> m {-# INLINE zipFold #-} zipFold c f v u-  = C.zipFold c f (C.cvec v) (C.cvec u)+  = C.zipFoldF c (\(Identity a) (Identity b) -> f a b) (C.cvec v) (C.cvec u) +zipFoldF :: (HVectorF v, ArityC c (ElemsF v), Monoid m)+        => Proxy c -> (forall a. c a => f a -> f a -> m) -> v f -> v f -> m+{-# INLINE zipFoldF #-}+zipFoldF c f v u+  = C.zipFoldF c f (C.cvecF v) (C.cvecF u)+ -- | Convert heterogeneous vector to homogeneous-monomorphize :: (HVector v, ArityC c (Elems v))+monomorphize :: ( HVector v+                , Peano n ~ Len (Elems v)+                , ArityC c (Elems v))              => Proxy c -> (forall a. c a => a -> x)-             -> v -> F.ContVec (Len (Elems v)) x+             -> v -> F.ContVec n x {-# INLINE monomorphize #-}-monomorphize c f = C.monomorphize c f . C.cvec+monomorphize c f = C.monomorphizeF c (f . runIdentity) . C.cvec  -- | Convert heterogeneous vector to homogeneous-monomorphizeF :: (HVectorF v, ArityC c (ElemsF v))+monomorphizeF :: ( HVectorF v+                 , Peano n ~ Len (ElemsF v)+                 , ArityC c (ElemsF v)+                 )              => Proxy c -> (forall a. c a => f a -> x)-             -> v f -> F.ContVec (Len (ElemsF v)) x+             -> v f -> F.ContVec n x {-# INLINE monomorphizeF #-} monomorphizeF c f = C.monomorphizeF c f . C.cvecF 
Data/Vector/HFixed/Class.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP                   #-} {-# LANGUAGE ConstraintKinds       #-} {-# LANGUAGE DataKinds             #-} {-# LANGUAGE DefaultSignatures     #-}@@ -12,49 +11,31 @@ {-# LANGUAGE PolyKinds             #-} {-# LANGUAGE RankNTypes            #-} {-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE TypeApplications      #-} {-# LANGUAGE TypeFamilies          #-} {-# LANGUAGE TypeOperators         #-} {-# LANGUAGE UndecidableInstances  #-} module Data.Vector.HFixed.Class (     -- * Types and type classes-    -- ** Peano numbers-    S-  , Z-#if __GLASGOW_HASKELL__ >= 708-    -- * Isomorphism between Peano numbers and Nats-  , NatIso-  , ToPeano-  , ToNat-#endif     -- ** N-ary functions-  , Fn-  , Fun(..)+    Fn+  , Fun   , TFun(..)-  , funToTFun-  , tfunToFun     -- ** Type functions   , Proxy(..)-  , type (++)()+  , type (++)   , Len-  , Wrap   , HomList     -- ** Type classes   , Arity(..)   , ArityC(..)   , HVector(..)+  , tupleSize   , HVectorF(..)-    -- *** Witnesses-  , WitWrapped(..)-  , WitConcat(..)-  , WitNestedFun(..)-  , WitLenWrap(..)-  , WitWrapIndex(..)-  , WitAllInstances(..)+  , tupleSizeF     -- ** CPS-encoded vector-  , ContVec(..)+  , ContVec   , ContVecF(..)-  , toContVec-  , toContVecF   , cons   , consF     -- ** Interop with homogeneous vectors@@ -65,29 +46,29 @@     -- ** Primitives for Fun   , curryFun   , uncurryFun-  , uncurryFun2+  , uncurryMany   , curryMany   , constFun-  , stepFun     -- ** Primitives for TFun+  , constTFun   , curryTFun   , uncurryTFun-  , uncurryTFun2   , shuffleTF+  , stepTFun     -- ** More complicated functions   , concatF-  , shuffleF   , lensWorkerF+  , lensWorkerTF   , Index(..)   ) where -import Control.Applicative (Applicative(..),(<$>))-import Data.Complex        (Complex(..))+import Control.Applicative   (Applicative(..),(<$>))+import Data.Coerce+import Data.Complex          (Complex(..))+import Data.Typeable         (Proxy(..))+import Data.Functor.Identity (Identity(..)) -import           Data.Vector.Fixed.Cont   (S,Z)-#if __GLASGOW_HASKELL__ >= 708-import           Data.Vector.Fixed.Cont   (ToPeano,ToNat,NatIso)-#endif+import           Data.Vector.Fixed.Cont   (Peano,PeanoNum(..),ArityPeano) import qualified Data.Vector.Fixed                as F import qualified Data.Vector.Fixed.Cont           as F (curryFirst) import qualified Data.Vector.Fixed.Unboxed        as U@@ -95,7 +76,9 @@ import qualified Data.Vector.Fixed.Storable       as S import qualified Data.Vector.Fixed.Boxed          as B -import GHC.Generics hiding (Arity(..),S)+import Unsafe.Coerce (unsafeCoerce)+import GHC.TypeLits+import GHC.Generics hiding (S)  import Data.Vector.HFixed.TypeFuns @@ -107,28 +90,18 @@  -- | Type family for N-ary function. Types of function parameters are --   encoded as the list of types.-type family   Fn (as :: [*]) b-type instance Fn '[]       b = b-type instance Fn (a ': as) b = a -> Fn as b---- | Newtype wrapper to work around of type families' lack of---   injectivity.-newtype Fun (as :: [*]) b = Fun { unFun :: Fn as b }+type family Fn (f :: * -> *) (as :: [*]) b where+  Fn f '[]      b = b+  Fn f (a : as) b = f a -> Fn f as b  -- | Newtype wrapper for function where all type parameters have same --   type constructor. This type is required for writing function --   which works with monads, appicatives etc.-newtype TFun f as b = TFun { unTFun :: Fn (Wrap f as) b }---- | Cast /Fun/ to equivalent /TFun/-funToTFun  :: Fun (Wrap f xs) b -> TFun f xs b-funToTFun = TFun . unFun-{-# INLINE funToTFun #-}+newtype TFun f as b = TFun { unTFun :: Fn f as b } --- | Cast /TFun/ to equivalent /Fun/-tfunToFun :: TFun f xs b -> Fun (Wrap f xs) b-tfunToFun = Fun . unTFun-{-# INLINE tfunToFun #-}+-- | Newtype wrapper to work around of type families' lack of+--   injectivity.+type Fun = TFun Identity   @@ -146,143 +119,78 @@ --   This is also somewhat a kitchen sink module. It contains --   witnesses which could be used to prove type equalities or to --   bring instance in scope.-class F.Arity (Len xs) => Arity (xs :: [*]) where+class Arity (xs :: [*]) where   -- | Fold over /N/ elements exposed as N-ary function.-  accum :: (forall a as. t (a ': as) -> a -> t as)-           -- ^ Step function. Applies element to accumulator.+  accum :: (forall a as. t (a : as) -> f a -> t as)+        -- ^ Step function. Applies element to accumulator.         -> (t '[] -> b)-           -- ^ Extract value from accumulator.+        -- ^ Extract value from accumulator.         -> t xs-           -- ^ Initial state.-        -> Fn xs b+        -- ^ Initial state.+        -> TFun f xs b    -- | Apply values to N-ary function-  apply :: (forall a as. t (a ': as) -> (a, t as))-           -- ^ Extract value to be applied to function.+  apply :: (forall a as. t (a : as) -> (f a, t as))+        -- ^ Extract value to be applied to function.         -> t xs-           -- ^ Initial state.-        -> ContVec xs-  -- | Apply value to N-ary function using monadic actions-  applyM :: Monad m-         => (forall a as. t (a ': as) -> m (a, t as))-            -- ^ Extract value to be applied to function-         -> t xs-            -- ^ Initial state-         -> m (ContVec xs)--  -- | Analog of accum-  accumTy :: (forall a as. t (a ': as) -> f a -> t as)-          -> (t '[] -> b)-          -> t xs-          -> Fn (Wrap f xs) b--  -- | Analog of 'apply' which allows to works with vectors which-  --   elements are wrapped in the newtype constructor.-  applyTy :: (forall a as. t (a ': as) -> (f a, t as))-          -> t xs-          -> ContVecF xs f+        -- ^ Initial state.+        -> ContVecF xs f    -- | Size of type list as integer.   arity :: p xs -> Int -  witWrapped   :: WitWrapped f xs-  witConcat    :: Arity ys => WitConcat xs ys-  witNestedFun :: WitNestedFun xs ys r-  witLenWrap   :: WitLenWrap f xs ---- | Declares that every type in list satisfy constraint @c@-class Arity xs => ArityC c xs where-  witAllInstances :: WitAllInstances c xs--instance ArityC c '[] where-  witAllInstances = WitAllInstancesNil-  {-# INLINE witAllInstances #-}-instance (c x, ArityC c xs) => ArityC c (x ': xs) where-  witAllInstances = WitAllInstancesCons (witAllInstances :: WitAllInstances c xs)-  {-# INLINE witAllInstances #-}----- | Witness that observe fact that if we have instance @Arity xs@---   than we have instance @Arity (Wrap f xs)@.-data WitWrapped f xs where-  WitWrapped :: Arity (Wrap f xs) => WitWrapped f xs---- | Witness that observe fact that @(Arity xs, Arity ys)@ implies---   @Arity (xs++ys)@-data WitConcat xs ys where-  WitConcat :: (Arity (xs++ys)) => WitConcat xs ys---- | Observes fact that @Fn (xs++ys) r ~ Fn xs (Fn ys r)@-data WitNestedFun xs ys r where-  WitNestedFun :: (Fn (xs++ys) r ~ Fn xs (Fn ys r)) => WitNestedFun xs ys r---- | Observe fact than @Len xs ~ Len (Wrap f xs)@-data WitLenWrap :: (* -> *) -> [*] -> * where-  WitLenWrap :: Len xs ~ Len (Wrap f xs) => WitLenWrap f xs+class (Arity xs) => ArityC c xs where+  accumC :: proxy c+         -- ^+         -> (forall a as. (c a) => t (a : as) -> f a -> t as)+         -- ^ Step function. Applies element to accumulator.+         -> (t '[] -> b)+         -- ^ Extract value from accumulator.+         -> t xs+         -- ^ Initial state.+         -> TFun f xs b --- | Witness that all elements of type list satisfy predicate @c@.-data WitAllInstances c xs where-  WitAllInstancesNil  :: WitAllInstances c '[]-  WitAllInstancesCons :: c x => WitAllInstances c xs -> WitAllInstances c (x ': xs)+  -- | Apply values to N-ary function+  applyC :: proxy c+         --+         -> (forall a as. (c a) => t (a : as) -> (f a, t as))+         -- ^ Extract value to be applied to function.+         -> t xs+         -- ^ Initial state.+         -> ContVecF xs f   instance Arity '[] where-  accum   _ f t = f t-  apply   _ _   = ContVec unFun-  applyM  _ _   = return (ContVec unFun)-  accumTy _ f t = f t-  applyTy _ _   = ContVecF unTFun-  {-# INLINE accum   #-}-  {-# INLINE apply   #-}-  {-# INLINE applyM  #-}-  {-# INLINE accumTy #-}-  {-# INLINE applyTy #-}+  accum _ f t = TFun (f t)+  apply _ _   = ContVecF unTFun+  {-# INLINE accum #-}+  {-# INLINE apply #-}   arity _     = 0   {-# INLINE arity #-} -  witWrapped   = WitWrapped-  witConcat    = WitConcat-  witNestedFun = WitNestedFun-  witLenWrap   = WitLenWrap-  {-# INLINE witWrapped #-}-  {-# INLINE witConcat #-}-  {-# INLINE witNestedFun #-}-  {-# INLINE witLenWrap #-}--instance Arity xs => Arity (x ': xs) where-  accum   f g t = \a -> accum f g (f t a)-  apply   f t   = case f t of (a,u) -> cons a (apply f u)-  applyM  f t   = do (a,t') <- f t-                     vec    <- applyM f t'-                     return $ cons a vec-  accumTy f g t = \a -> accumTy f g (f t a)-  applyTy f t   = case f t of (a,u) -> consF a (applyTy f u)-  {-# INLINE accum   #-}-  {-# INLINE apply   #-}-  {-# INLINE applyM  #-}-  {-# INLINE accumTy #-}-  {-# INLINE applyTy #-}+instance Arity xs => Arity (x : xs) where+  accum f g t = uncurryTFun (\a -> accum f g (f t a))+  apply f t   = case f t of (a,u) -> consF a (apply f u)+  {-# INLINE accum #-}+  {-# INLINE apply #-}   arity _     = 1 + arity (Proxy :: Proxy xs)   {-# INLINE arity        #-} -  witWrapped :: forall f. WitWrapped f (x ': xs)-  witWrapped = case witWrapped :: WitWrapped f xs of-                 WitWrapped -> WitWrapped-  {-# INLINE witWrapped #-}-  witConcat :: forall ys. Arity ys => WitConcat (x ': xs) ys-  witConcat = case witConcat :: WitConcat xs ys of-                WitConcat -> WitConcat-  {-# INLINE witConcat  #-}-  witNestedFun :: forall ys r. WitNestedFun (x ': xs) ys r-  witNestedFun = case witNestedFun :: WitNestedFun xs ys r of-                   WitNestedFun -> WitNestedFun-  {-# INLINE witNestedFun #-}-  witLenWrap :: forall f. WitLenWrap f (x ': xs)-  witLenWrap = case witLenWrap :: WitLenWrap f xs of-                 WitLenWrap -> WitLenWrap+instance ArityC c '[] where+  accumC _ _ f t = TFun (f t)+  applyC _ _ _   = ContVecF unTFun+  {-# INLINE accumC #-}+  {-# INLINE applyC #-} +instance (c x, ArityC c xs) => ArityC c (x : xs) where+  accumC w f g t = uncurryTFun (\a -> accumC w f g (f t a))+  applyC w f t   = case f t of (a,u) -> consF a (applyC w f u)+  {-# INLINE accumC #-}+  {-# INLINE applyC #-} ++ -- | Type class for heterogeneous vectors. Instance should specify way -- to construct and deconstruct itself --@@ -311,6 +219,9 @@   {-# INLINE construct #-}   {-# INLINE inspect   #-} +-- | Number of elements in tuple+tupleSize :: forall v proxy. HVector v => proxy v -> Int+tupleSize _ = arity (Proxy :: Proxy (Elems v))  -- | Type class for partially homogeneous vector where every element --   in the vector have same type constructor. Vector itself is@@ -321,6 +232,9 @@   inspectF   :: v f -> TFun f (ElemsF v) a -> a   constructF :: TFun f (ElemsF v) (v f) +-- | Number of elements in tuple+tupleSizeF :: forall v f proxy. HVectorF v => proxy (v f) -> Int+tupleSizeF _a = arity (Proxy :: Proxy (ElemsF v))   ----------------------------------------------------------------@@ -328,93 +242,111 @@ ----------------------------------------------------------------  -- | Conversion between homogeneous and heterogeneous N-ary functions.-class (F.Arity n, Arity (HomList n a)) => HomArity n a where+class (ArityPeano n, Arity (HomList n a)) => HomArity n a where   -- | Convert n-ary homogeneous function to heterogeneous.   toHeterogeneous :: F.Fun n a r -> Fun (HomList n a) r   -- | Convert heterogeneous n-ary function to homogeneous.   toHomogeneous   :: Fun (HomList n a) r -> F.Fun n a r  -instance HomArity Z a where-  toHeterogeneous = Fun   . F.unFun-  toHomogeneous   = F.Fun . unFun+instance HomArity 'Z a where+  toHeterogeneous = coerce+  toHomogeneous   = coerce   {-# INLINE toHeterogeneous #-}   {-# INLINE toHomogeneous   #-} -instance HomArity n a => HomArity (S n) a where+instance HomArity n a => HomArity ('S n) a where   toHeterogeneous f-    = Fun $ \a -> unFun $ toHeterogeneous (F.curryFirst f a)-  toHomogeneous (f :: Fun (a ': HomList n a) r)-    = F.Fun $ \a -> F.unFun (toHomogeneous $ curryFun f a :: F.Fun n a r)+    = coerce $ \a -> unTFun $ toHeterogeneous (F.curryFirst f a)+  toHomogeneous (f :: Fun (a : HomList n a) r)+    = coerce $ \a -> (toHomogeneous $ curryFun f a :: F.Fun n a r)   {-# INLINE toHeterogeneous #-}   {-# INLINE toHomogeneous   #-}  -- | Default implementation of 'inspect' for homogeneous vector.-homInspect :: (F.Vector v a, HomArity (F.Dim v) a)-           => v a -> Fun (HomList (F.Dim v) a) r -> r+homInspect :: (F.Vector v a, HomArity (Peano (F.Dim v)) a)+           => v a -> Fun (HomList (Peano (F.Dim v)) a) r -> r homInspect v f = F.inspect v (toHomogeneous f) {-# INLINE homInspect #-}  -- | Default implementation of 'construct' for homogeneous vector. homConstruct :: forall v a.-                (F.Vector v a, HomArity (F.Dim v) a)-             => Fun (HomList (F.Dim v) a) (v a)-homConstruct = toHeterogeneous (F.construct :: F.Fun (F.Dim v) a (v a))+                (F.Vector v a, HomArity (Peano (F.Dim v)) a)+             => Fun (HomList (Peano (F.Dim v)) a) (v a)+homConstruct = toHeterogeneous (F.construct :: F.Fun (Peano (F.Dim v)) a (v a)) {-# INLINE homConstruct #-}   -instance HomArity n a => HVector (B.Vec n a) where-  type Elems (B.Vec n a) = HomList n a+instance ( HomArity (Peano n) a+         , KnownNat n+         , Peano (n + 1) ~ 'S (Peano n)+         ) => HVector (B.Vec n a) where+  type Elems (B.Vec n a) = HomList (Peano n) a   inspect   = homInspect   construct = homConstruct   {-# INLINE inspect   #-}   {-# INLINE construct #-} -instance (U.Unbox n a, HomArity n a) => HVector (U.Vec n a) where-  type Elems (U.Vec n a) = HomList n a+instance ( U.Unbox n a+         , HomArity (Peano n) a+         , KnownNat n+         , Peano (n + 1) ~ 'S (Peano n)+         ) => HVector (U.Vec n a) where+  type Elems (U.Vec n a) = HomList (Peano n) a   inspect   = homInspect   construct = homConstruct   {-# INLINE inspect   #-}   {-# INLINE construct #-} -instance (S.Storable a, HomArity n a) => HVector (S.Vec n a) where-  type Elems (S.Vec n a) = HomList n a+instance ( S.Storable a+         , HomArity (Peano n) a+         , KnownNat n+         , Peano (n + 1) ~ 'S (Peano n)+         ) => HVector (S.Vec n a) where+  type Elems (S.Vec n a) = HomList (Peano n) a   inspect   = homInspect   construct = homConstruct   {-# INLINE inspect   #-}   {-# INLINE construct #-} -instance (P.Prim a, HomArity n a) => HVector (P.Vec n a) where-  type Elems (P.Vec n a) = HomList n a+instance ( P.Prim a+         , HomArity (Peano n) a+         , KnownNat n+         , Peano (n + 1) ~ 'S (Peano n)+         ) => HVector (P.Vec n a) where+  type Elems (P.Vec n a) = HomList (Peano n) a   inspect   = homInspect   construct = homConstruct   {-# INLINE inspect   #-}   {-# INLINE construct #-}  + ---------------------------------------------------------------- -- CPS-encoded vectors ---------------------------------------------------------------- --- | CPS-encoded heterogeneous vector.-newtype ContVec xs = ContVec { runContVec :: forall r. Fun xs r -> r }+--+-- newtype ContVec xs = ContVec { runContVec :: forall r. Fun xs r -> r } -instance Arity xs => HVector (ContVec xs) where-  type Elems (ContVec xs) = xs-  construct = Fun $-    accum (\(T_mkN f) x -> T_mkN (f . cons x))-          (\(T_mkN f)   -> f (ContVec unFun))-          (T_mkN id :: T_mkN xs xs)-  inspect (ContVec cont) f = cont f+instance Arity xs => HVector (ContVecF xs Identity) where+  type Elems (ContVecF xs Identity) = xs+  construct = accum+    (\(T_mkN f) (Identity x) -> T_mkN (f . cons x))+    (\(T_mkN f)              -> f (ContVecF unTFun))+    (T_mkN id)+  inspect (ContVecF cont) f = cont f   {-# INLINE construct #-}   {-# INLINE inspect   #-}  newtype T_mkN all xs = T_mkN (ContVec xs -> ContVec all) +-- | CPS-encoded heterogeneous vector.+type ContVec xs = ContVecF xs Identity  -- | CPS-encoded partially heterogeneous vector.-newtype ContVecF xs f = ContVecF (forall r. TFun f xs r -> r)+newtype ContVecF xs f = ContVecF { runContVecF :: forall r. TFun f xs r -> r }  instance Arity xs => HVectorF (ContVecF xs) where   type ElemsF (ContVecF xs) = xs@@ -425,29 +357,20 @@  constructFF :: forall f xs. (Arity xs) => TFun f xs (ContVecF xs f) {-# INLINE constructFF #-}-constructFF = TFun $ accumTy (\(TF_mkN f) x -> TF_mkN (f . consF x))-                             (\(TF_mkN f)   -> f $ ContVecF unTFun)-                             (TF_mkN id :: TF_mkN f xs xs)+constructFF = accum (\(TF_mkN f) x -> TF_mkN (f . consF x))+                    (\(TF_mkN f)   -> f $ ContVecF unTFun)+                    (TF_mkN id)  newtype TF_mkN f all xs = TF_mkN (ContVecF xs f -> ContVecF all f)  --toContVec :: ContVecF xs f -> ContVec (Wrap f xs)-toContVec (ContVecF cont) = ContVec $ cont . TFun . unFun-{-# INLINE toContVec #-}--toContVecF :: ContVec (Wrap f xs) -> ContVecF xs f-toContVecF (ContVec cont) = ContVecF $ cont . Fun . unTFun-{-# INLINE toContVecF #-}- -- | Cons element to the vector-cons :: x -> ContVec xs -> ContVec (x ': xs)-cons x (ContVec cont) = ContVec $ \f -> cont $ curryFun f x+cons :: x -> ContVec xs -> ContVec (x : xs)+cons x (ContVecF cont) = ContVecF $ \f -> cont $ curryFun f x {-# INLINE cons #-}  -- | Cons element to the vector-consF :: f x -> ContVecF xs f -> ContVecF (x ': xs) f+consF :: f x -> ContVecF xs f -> ContVecF (x : xs) f consF x (ContVecF cont) = ContVecF $ \f -> cont $ curryTFun f x {-# INLINE consF #-} @@ -457,54 +380,22 @@ -- Instances of Fun ---------------------------------------------------------------- -instance (Arity xs) => Functor (Fun xs) where-  fmap (f :: a -> b) (Fun g0 :: Fun xs a)-    = Fun $ accum (\(T_fmap g) a -> T_fmap (g a))-                  (\(T_fmap r)   -> f r)-                  (T_fmap g0 :: T_fmap a xs)-  {-# INLINE fmap #-}--instance Arity xs => Applicative (Fun xs) where-  pure r = Fun $ accum (\T_pure _ -> T_pure)-                       (\T_pure   -> r)-                       (T_pure :: T_pure xs)-  (Fun f0 :: Fun xs (a -> b)) <*> (Fun g0 :: Fun xs a)-    = Fun $ accum (\(T_ap f g) a -> T_ap (f a) (g a))-                  (\(T_ap f g)   -> f g)-                  ( T_ap f0 g0 :: T_ap (a -> b) a xs)-  {-# INLINE pure  #-}-  {-# INLINE (<*>) #-}--instance Arity xs => Monad (Fun xs) where-  return  = pure-  f >>= g = shuffleF g <*> f-  {-# INLINE return #-}-  {-# INLINE (>>=)  #-}--newtype T_fmap a   xs = T_fmap (Fn xs a)-data    T_pure     xs = T_pure-data    T_ap   a b xs = T_ap (Fn xs a) (Fn xs b)-- instance (Arity xs) => Functor (TFun f xs) where-  fmap (f :: a -> b) (TFun g0 :: TFun f xs a)-    = TFun $ accumTy (\(TF_fmap g) a -> TF_fmap (g a))-                     (\(TF_fmap r)   -> f r)-                     (TF_fmap g0 :: TF_fmap f a xs)+  fmap f (TFun g0)+    = accum (\(TF_fmap g) a -> TF_fmap (g a))+            (\(TF_fmap r)   -> f r)+            (TF_fmap g0)   {-# INLINE fmap #-}  instance (Arity xs) => Applicative (TFun f xs) where-  pure r = TFun $ accumTy step-                          (\TF_pure   -> r)-                          (TF_pure :: TF_pure f xs)-    where-      step :: forall a as. TF_pure f (a ': as) -> f a -> TF_pure f as-      step _ _ = TF_pure+  pure r = accum (\Proxy _ -> Proxy)+                 (\Proxy   -> r)+                 (Proxy)   {-# INLINE pure  #-}   (TFun f0 :: TFun f xs (a -> b)) <*> (TFun g0 :: TFun f xs a)-    = TFun $ accumTy (\(TF_ap f g) a -> TF_ap (f a) (g a))-                  (\(TF_ap f g)   -> f g)-                  ( TF_ap f0 g0 :: TF_ap f (a -> b) a xs)+    = accum (\(TF_ap f g) a -> TF_ap (f a) (g a))+            (\(TF_ap f g)   -> f g)+            ( TF_ap f0 g0 :: TF_ap f (a -> b) a xs)   {-# INLINE (<*>) #-}  instance Arity xs => Monad (TFun f xs) where@@ -513,9 +404,8 @@   {-# INLINE return #-}   {-# INLINE (>>=)  #-} -newtype TF_fmap f a   xs = TF_fmap (Fn (Wrap f xs) a)-data    TF_pure f     xs = TF_pure-data    TF_ap   f a b xs = TF_ap (Fn (Wrap f xs) a) (Fn (Wrap f xs) b)+newtype TF_fmap f a   xs = TF_fmap (Fn f xs a)+data    TF_ap   f a b xs = TF_ap   (Fn f xs a) (Fn f xs b)   @@ -524,50 +414,49 @@ ----------------------------------------------------------------  -- | Apply single parameter to function-curryFun :: Fun (x ': xs) r -> x -> Fun xs r-curryFun (Fun f) x = Fun (f x)+curryFun :: Fun (x : xs) r -> x -> Fun xs r+curryFun = coerce {-# INLINE curryFun #-}  -- | Uncurry N-ary function.-uncurryFun :: (x -> Fun xs r) -> Fun (x ': xs) r-uncurryFun = Fun . fmap unFun+uncurryFun :: (x -> Fun xs r) -> Fun (x : xs) r+uncurryFun = coerce {-# INLINE uncurryFun #-} -uncurryFun2 :: (Arity xs)-            => (x -> y -> Fun xs (Fun ys r))-            -> Fun (x ': xs) (Fun (y ': ys) r)-uncurryFun2 = uncurryFun . fmap (fmap uncurryFun . shuffleF)-{-# INLINE uncurryFun2 #-}- -- | Conversion function uncurryMany :: forall xs ys r. Arity xs => Fun xs (Fun ys r) -> Fun (xs ++ ys) r+-- NOTE: GHC is not smart enough to figure out that:+--+--       > Fn xs (Fn ys) r ~ Fn (xs ++ ys) r+--+--       It's possible to construct type safe definition but it's+--       quite complicated and increase compile time and may hurrt+--       performance {-# INLINE uncurryMany #-}-uncurryMany f =-  case witNestedFun :: WitNestedFun xs ys r of-    WitNestedFun ->-      case fmap unFun f :: Fun xs (Fn ys r) of-        Fun g -> Fun g+uncurryMany = unsafeCoerce  -- | Curry first /n/ arguments of N-ary function. curryMany :: forall xs ys r. Arity xs => Fun (xs ++ ys) r -> Fun xs (Fun ys r)+-- NOTE: See uncurryMany {-# INLINE curryMany #-}-curryMany (Fun f0)-  = Fun $ accum (\(T_curry f) a -> T_curry (f a))-                (\(T_curry f)   -> Fun f :: Fun ys r)-                (T_curry f0 :: T_curry r ys xs)--newtype T_curry r ys xs = T_curry (Fn (xs ++ ys) r)+curryMany = unsafeCoerce   -- | Add one parameter to function which is ignored.-constFun :: Fun xs r -> Fun (x ': xs) r+constFun :: Fun xs r -> Fun (x : xs) r constFun = uncurryFun . const {-# INLINE constFun #-} +-- | Add one parameter to function which is ignored.+constTFun :: TFun f xs r -> TFun f (x : xs) r+constTFun = uncurryTFun . const+{-# INLINE constTFun #-}+ -- | Transform function but leave outermost parameter untouched.-stepFun :: (Fun xs a -> Fun ys b) -> Fun (x ': xs) a -> Fun (x ': ys) b-stepFun g = uncurryFun . fmap g . curryFun-{-# INLINE stepFun #-}+stepTFun :: (TFun f xs a       -> TFun f ys b)+         -> (TFun f (x : xs) a -> TFun f (x : ys) b)+stepTFun g = uncurryTFun . fmap g . curryTFun+{-# INLINE stepTFun #-}  -- | Concatenate n-ary functions. This function combine results of --   both N-ary functions and merge their parameters into single list.@@ -578,25 +467,23 @@   where     go a = fmap (\b -> f a b) funB --- | Move first argument of function to its result. This function is---   useful for implementation of lens.-shuffleF :: forall x xs r. Arity xs => (x -> Fun xs r) -> Fun xs (x -> r)-{-# INLINE shuffleF #-}-shuffleF fun = Fun $ accum-  (\(T_shuffle f) a -> T_shuffle (\x -> f x a))-  (\(T_shuffle f)   -> f)-  (T_shuffle (fmap unFun fun) :: T_shuffle x r xs)--data T_shuffle x r xs = T_shuffle (Fn (x ': xs) r)- -- | Helper for lens implementation. lensWorkerF :: forall f r x y xs. (Functor f, Arity xs)-            => (x -> f y) -> Fun (y ': xs) r -> Fun (x ': xs) (f r)+            => (x -> f y) -> Fun (y : xs) r -> Fun (x : xs) (f r) {-# INLINE lensWorkerF #-} lensWorkerF g f   = uncurryFun-  $ \x -> (\r -> fmap (r $) (g x)) <$> shuffleF (curryFun f)+  $ \x -> (\r -> fmap (r $) (g x)) <$> shuffleTF (curryFun f) +-- | Helper for lens implementation.+lensWorkerTF :: forall f g r x y xs. (Functor f, Arity xs)+             => (g x -> f (g y))+             -> TFun g (y : xs) r+             -> TFun g (x : xs) (f r)+{-# INLINE lensWorkerTF #-}+lensWorkerTF g f+  = uncurryTFun+  $ \x -> (\r -> fmap (r $) (g x)) <$> shuffleTF (curryTFun f)   ----------------------------------------------------------------@@ -604,34 +491,26 @@ ----------------------------------------------------------------  -- | Apply single parameter to function-curryTFun :: TFun f (x ': xs) r -> f x -> TFun f xs r-curryTFun (TFun f) = TFun . f+curryTFun :: TFun f (x : xs) r -> f x -> TFun f xs r+curryTFun = coerce {-# INLINE curryTFun #-}  -- | Uncurry single parameter-uncurryTFun :: (f x -> TFun f xs r) -> TFun f (x ': xs) r-uncurryTFun = TFun . fmap unTFun+uncurryTFun :: (f x -> TFun f xs r) -> TFun f (x : xs) r+uncurryTFun = coerce {-# INLINE uncurryTFun #-} --- | Uncurry two parameters for nested TFun.-uncurryTFun2 :: (Arity xs, Arity ys)-             => (f x -> f y -> TFun f xs (TFun f ys r))-             -> TFun f (x ': xs) (TFun f (y ': ys) r)-uncurryTFun2 = uncurryTFun . fmap (fmap uncurryTFun . shuffleTF)-{-# INLINE uncurryTFun2 #-}-- -- | Move first argument of function to its result. This function is --   useful for implementation of lens. shuffleTF :: forall f x xs r. Arity xs           => (x -> TFun f xs r) -> TFun f xs (x -> r) {-# INLINE shuffleTF #-}-shuffleTF fun0 = TFun $ accumTy+shuffleTF fun0 = accum   (\(TF_shuffle f) a -> TF_shuffle (\x -> f x a))   (\(TF_shuffle f)   -> f)-  (TF_shuffle (fmap unTFun fun0) :: TF_shuffle f x r xs)+  (TF_shuffle (fmap unTFun fun0)) -data TF_shuffle f x r xs = TF_shuffle (x -> (Fn (Wrap f xs) r))+data TF_shuffle f x r xs = TF_shuffle (x -> Fn f xs r)   @@ -640,37 +519,27 @@ ----------------------------------------------------------------  -- | Indexing of vectors-class F.Arity n => Index (n :: *) (xs :: [*]) where+class ArityPeano n => Index (n :: PeanoNum) (xs :: [*]) where   -- | Type at position n   type ValueAt n xs :: *   -- | List of types with n'th element replaced by /a/.   type NewElems n xs a :: [*]   -- | Getter function for vectors-  getF :: n -> Fun xs (ValueAt n xs)+  getF :: proxy n -> Fun xs (ValueAt n xs)   -- | Putter function. It applies value @x@ to @n@th parameter of   --   function.-  putF :: n -> ValueAt n xs -> Fun xs r -> Fun xs r+  putF :: proxy n -> ValueAt n xs -> Fun xs r -> Fun xs r   -- | Helper for implementation of lens-  lensF :: (Functor f, v ~ ValueAt n xs)-        => n -> (v -> f v) -> Fun xs r -> Fun xs (f r)+  lensF   :: (Functor f, v ~ ValueAt n xs)+          => proxy n -> (v -> f v) -> Fun xs r -> Fun xs (f r)   -- | Helper for type-changing lens   lensChF :: (Functor f)-          => n -> (ValueAt n xs -> f a) -> Fun (NewElems n xs a) r -> Fun xs (f r)-  witWrapIndex :: WitWrapIndex f n xs----- | Proofs for the indexing of wrapped type lists.-data WitWrapIndex f n xs where-  WitWrapIndex :: ( ValueAt n (Wrap f xs) ~ f (ValueAt n xs)-                  , Index n (Wrap f xs)-                  , Arity (Wrap f xs)-                  ) => WitWrapIndex f n xs-+          => proxy n -> (ValueAt n xs -> f a) -> Fun (NewElems n xs a) r -> Fun xs (f r) -instance Arity xs => Index Z (x ': xs) where-  type ValueAt  Z (x ': xs)   = x-  type NewElems Z (x ': xs) a = a ': xs-  getF  _     = Fun $ \x -> unFun (pure x :: Fun xs x)+instance Arity xs => Index 'Z (x : xs) where+  type ValueAt  'Z (x : xs)   = x+  type NewElems 'Z (x : xs) a = a : xs+  getF  _     = TFun $ \(Identity x) -> unTFun (pure x :: Fun xs x)   putF  _ x f = constFun $ curryFun f x   lensF   _     = lensWorkerF   lensChF _     = lensWorkerF@@ -678,26 +547,18 @@   {-# INLINE putF    #-}   {-# INLINE lensF   #-}   {-# INLINE lensChF #-}-  witWrapIndex :: forall f. WitWrapIndex f Z (x ': xs)-  witWrapIndex = case witWrapped :: WitWrapped f xs of-                   WitWrapped -> WitWrapIndex-  {-# INLINE witWrapIndex #-} -instance Index n xs => Index (S n) (x ': xs) where-  type ValueAt  (S n) (x ': xs)   = ValueAt n xs-  type NewElems (S n) (x ': xs) a = x ': NewElems n xs a-  getF    _   = constFun $ getF    (undefined :: n)-  putF    _ x = stepFun  $ putF    (undefined :: n) x-  lensF   _ f = stepFun  $ lensF   (undefined :: n) f-  lensChF _ f = stepFun  $ lensChF (undefined :: n) f+instance Index n xs => Index ('S n) (x : xs) where+  type ValueAt  ('S n) (x : xs)   = ValueAt n xs+  type NewElems ('S n) (x : xs) a = x : NewElems n xs a+  getF    _   = constFun $ getF    (Proxy @ n)+  putF    _ x = stepTFun $ putF    (Proxy @ n) x+  lensF   _ f = stepTFun $ lensF   (Proxy @ n) f+  lensChF _ f = stepTFun $ lensChF (Proxy @ n) f   {-# INLINE getF    #-}   {-# INLINE putF    #-}   {-# INLINE lensF   #-}   {-# INLINE lensChF #-}-  witWrapIndex :: forall f. WitWrapIndex f (S n) (x ': xs)-  witWrapIndex = case witWrapIndex :: WitWrapIndex f n xs of-                   WitWrapIndex -> WitWrapIndex-  {-# INLINE witWrapIndex #-}   @@ -708,266 +569,297 @@ -- | Unit is empty heterogeneous vector instance HVector () where   type Elems () = '[]-  construct = Fun ()-  inspect () (Fun f) = f+  construct = TFun ()+  inspect () (TFun f) = f  instance HVector (Complex a) where   type Elems (Complex a) = '[a,a]-  construct = Fun (:+)-  inspect (r :+ i) (Fun f) = f r i+  construct = TFun $ \(Identity r) (Identity i) -> (:+) r i+  inspect (r :+ i) f = coerce f r i   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b) where   type Elems (a,b) = '[a,b]-  construct = Fun (,)-  inspect (a,b) (Fun f) = f a b+  construct = coerce ((,) :: a->b -> (a,b))+  inspect (a,b) f = coerce f a b   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c) where   type Elems (a,b,c) = '[a,b,c]-  construct = Fun (,,)-  inspect (a,b,c) (Fun f) = f a b c+  construct = coerce ((,,) :: a->b->c -> (a,b,c))+  inspect (a,b,c) f = coerce f a b c   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d) where   type Elems (a,b,c,d) = '[a,b,c,d]-  construct = Fun (,,,)-  inspect (a,b,c,d) (Fun f) = f a b c d+  construct = coerce ((,,,) :: a->b->c->d -> (a,b,c,d))+  inspect (a,b,c,d) f = coerce f a b c d   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e) where   type Elems (a,b,c,d,e) = '[a,b,c,d,e]-  construct = Fun (,,,,)-  inspect (a,b,c,d,e) (Fun f) = f a b c d e+  construct = coerce ((,,,,) :: a->b->c->d->e -> (a,b,c,d,e))+  inspect (a,b,c,d,e) f = coerce f a b c d e   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f) where   type Elems (a,b,c,d,e,f) = '[a,b,c,d,e,f]-  construct = Fun (,,,,,)-  inspect (a,b,c,d,e,f) (Fun fun) = fun a b c d e f+  construct = coerce ((,,,,,) :: a->b->c->d->e->f+                              -> (a,b,c,d,e,f))+  inspect (a,b,c,d,e,f) fun = coerce fun a b c d e f   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g) where   type Elems (a,b,c,d,e,f,g) = '[a,b,c,d,e,f,g]-  construct = Fun (,,,,,,)-  inspect (a,b,c,d,e,f,g) (Fun fun) = fun a b c d e f g+  construct = coerce ((,,,,,,) :: a->b->c->d->e->f->g+                               -> (a,b,c,d,e,f,g))+  inspect (a,b,c,d,e,f,g) fun = coerce fun a b c d e f g   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h) where   type Elems (a,b,c,d,e,f,g,h) = '[a,b,c,d,e,f,g,h]-  construct = Fun (,,,,,,,)-  inspect (a,b,c,d,e,f,g,h) (Fun fun) = fun a b c d e f g h+  construct = coerce ((,,,,,,,) :: a->b->c->d->e->f->g->h+                                -> (a,b,c,d,e,f,g,h))+  inspect (a,b,c,d,e,f,g,h) fun = coerce fun a b c d e f g h   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i) where   type Elems (a,b,c,d,e,f,g,h,i) = '[a,b,c,d,e,f,g,h,i]-  construct = Fun (,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i) (Fun fun) = fun a b c d e f g h i+  construct = coerce ((,,,,,,,,) :: a->b->c->d->e->f->g->h->i+                                 -> (a,b,c,d,e,f,g,h,i))+  inspect (a,b,c,d,e,f,g,h,i) fun = coerce fun a b c d e f g h i   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j) where   type Elems (a,b,c,d,e,f,g,h,i,j) = '[a,b,c,d,e,f,g,h,i,j]-  construct = Fun (,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j) (Fun fun) = fun a b c d e f g h i j+  construct = coerce ((,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j+                                  -> (a,b,c,d,e,f,g,h,i,j))+  inspect (a,b,c,d,e,f,g,h,i,j) fun = coerce fun a b c d e f g h i j   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k) where   type Elems (a,b,c,d,e,f,g,h,i,j,k) = '[a,b,c,d,e,f,g,h,i,j,k]-  construct = Fun (,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k) (Fun fun) = fun a b c d e f g h i j k+  construct = coerce ((,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k+                                   -> (a,b,c,d,e,f,g,h,i,j,k))+  inspect (a,b,c,d,e,f,g,h,i,j,k) fun = coerce fun a b c d e f g h i j k   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l) = '[a,b,c,d,e,f,g,h,i,j,k,l]-  construct = Fun (,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l) (Fun fun) = fun a b c d e f g h i j k l+  construct = coerce ((,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l+                                    -> (a,b,c,d,e,f,g,h,i,j,k,l))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l) fun = coerce fun a b c d e f g h i j k l   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m) = '[a,b,c,d,e,f,g,h,i,j,k,l,m]-  construct = Fun (,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m) (Fun fun) = fun a b c d e f g h i j k l m+  construct = coerce ((,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m+                                     -> (a,b,c,d,e,f,g,h,i,j,k,l,m))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m) fun = coerce fun a b c d e f g h i j k l m   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n]-  construct = Fun (,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n) (Fun fun) =-    fun a b c d e f g h i j k l m n+  construct = coerce ((,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n+                                      -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n) fun+    = coerce fun a b c d e f g h i j k l m n   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o]-  construct = Fun (,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) (Fun fun) =-    fun a b c d e f g h i j k l m n o+  construct = coerce ((,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o+                                       -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) fun+    = coerce fun a b c d e f g h i j k l m n o   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p]-  construct = Fun (,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) (Fun fun) =-    fun a b c d e f g h i j k l m n o p+  construct = coerce ((,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p+                                        -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) fun+    = coerce fun a b c d e f g h i j k l m n o p   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q]-  construct = Fun (,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q+  construct = coerce ((,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q+                                         -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) fun+    = coerce fun a b c d e f g h i j k l m n o p q   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r]-  construct = Fun (,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r+  construct = coerce ((,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r+                                          -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) fun+    = coerce fun a b c d e f g h i j k l m n o p q r   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]-  construct = Fun (,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s+  construct = coerce ((,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s+                                           -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]-  construct = Fun (,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t+  construct = coerce ((,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t+                                            -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u+                                             -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v+                                              -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w+                                               -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x+                                                -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x y+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y+                                                 -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y   {-# INLINE construct #-}   {-# INLINE inspect   #-} - instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x y z+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z+                                                  -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z   {-# INLINE construct #-}   {-# INLINE inspect   #-} - instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a') where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a') =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a') (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x y z a'+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'+                                                   -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a'   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b') where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b') =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b') (Fun fun) = fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b'+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'->b'+                                                    -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b'   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c') where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c') =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c') (Fun fun) = fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c'+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'->b'->c'+                                                     -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c'   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d') where   type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d') =     '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d') (Fun fun) = fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d'+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'->b'->c'->d'+                                                      -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d'   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e') where-  type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e') = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e') (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d' e'+  type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e')+    = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e']+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'->b'->c'->d'->e'+                                                       -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d' e'   {-# INLINE construct #-}   {-# INLINE inspect   #-}  instance HVector (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f') where-  type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f') = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f']-  construct = Fun (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)-  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f') (Fun fun) =-    fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d' e' f'+  type Elems (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f')+    = '[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f']+  construct = coerce ((,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a->b->c->d->e->f->g->h->i->j->k->l->m->n->o->p->q->r->s->t->u->v->w->x->y->z->a'->b'->c'->d'->e'->f'+                                                        -> (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f'))+  inspect (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a',b',c',d',e',f') fun+    = coerce fun a b c d e f g h i j k l m n o p q r s t u v w x y z a' b' c' d' e' f'   {-# INLINE construct #-}   {-# INLINE inspect   #-} + ---------------------------------------------------------------- -- Generics ----------------------------------------------------------------@@ -1001,16 +893,16 @@ -- Recursion is terminated by simple field instance GHVector (K1 R x) where   type GElems (K1 R x) = '[x]-  gconstruct = Fun K1-  ginspect (K1 x) (Fun f) = f x+  gconstruct               = TFun (K1 . runIdentity)+  ginspect (K1 x) (TFun f) = f (Identity x) -- f (Identity x)   {-# INLINE gconstruct #-}   {-# INLINE ginspect   #-}   -- Unit types are empty vectors instance GHVector U1 where-  type GElems U1 = '[]-  gconstruct         = Fun U1-  ginspect _ (Fun f) = f+  type GElems U1      = '[]+  gconstruct          = coerce U1+  ginspect _ (TFun f) = f   {-# INLINE gconstruct #-}   {-# INLINE ginspect   #-}
Data/Vector/HFixed/Cont.hs view
@@ -1,13 +1,14 @@-{-# LANGUAGE GADTs                 #-}-{-# LANGUAGE ScopedTypeVariables   #-}-{-# LANGUAGE TypeOperators         #-}+{-# LANGUAGE ConstraintKinds       #-} {-# LANGUAGE DataKinds             #-} {-# LANGUAGE FlexibleContexts      #-} {-# LANGUAGE FlexibleInstances     #-}+{-# LANGUAGE GADTs                 #-} {-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TypeFamilies          #-}+{-# LANGUAGE PolyKinds             #-} {-# LANGUAGE Rank2Types            #-}-{-# LANGUAGE ConstraintKinds       #-}+{-# LANGUAGE ScopedTypeVariables   #-}+{-# LANGUAGE TypeFamilies          #-}+{-# LANGUAGE TypeOperators         #-} {-# LANGUAGE UndecidableInstances  #-} -- | -- CPS encoded heterogeneous vectors.@@ -15,19 +16,18 @@     -- * CPS-encoded vector     -- ** Type classes     Fn-  , Fun(..)+  , Fun   , TFun(..)   , Arity(..)   , HVector(..)+  , tupleSize   , HVectorF(..)+  , tupleSizeF   , ValueAt   , Index-  , Wrap     -- ** CPS-encoded vector-  , ContVec(..)+  , ContVec   , ContVecF(..)-  , toContVec-  , toContVecF     -- ** Other data types   , VecList(..)   , VecListF(..)@@ -36,53 +36,44 @@   , vector   , cvecF   , vectorF-    -- * Position based functions+    -- * Generic API for tuples+    -- ** Position based functions   , head   , tail   , cons   , consF   , concat-    -- * Indexing+    -- ** Indexing   , index   , set-    -- * Constructors-  , mk0-  , mk1-  , mk2-  , mk3-  , mk4-  , mk5-    -- * Folds and unfolds-  , foldl-  , foldr-  , unfoldr-    -- * Polymorphic values-  , replicate-  , replicateM+    -- ** Folds and unfolds+  , foldlF+  , foldrF+  , foldlNatF+  , foldrNatF+  , unfoldrF+    -- ** Replicate variants   , replicateF-  , zipMono-  , zipMonoF-  , zipFold-  , monomorphize+  , replicateNatF+    -- ** Zip variants+  , zipWithF+  , zipWithNatF+  , zipFoldF+    -- ** Monomorphization of vectors   , monomorphizeF-    -- * Vector parametrized with type constructor-  , mapFunctor-  , sequence-  , sequenceA+    -- ** Manipulation with type constructor+  , mapNat   , sequenceF-  , sequenceAF-  , distribute   , distributeF-  , wrap-  , unwrap   ) where -import Control.Applicative   (Applicative(..))-import Control.Monad         (ap)+import Control.Applicative   (Applicative(..),Const(..)) import Data.Monoid           (Monoid(..),(<>)) import Data.Functor.Compose  (Compose(..))+import Data.Functor.Identity (Identity(..))+import Data.Typeable         (Proxy(..)) import qualified Data.Vector.Fixed.Cont as F-import Prelude (Functor(..),Monad(..),id,(.),($),flip)+import Prelude               (Functor(..),id,(.),($))  import Data.Vector.HFixed.Class @@ -94,12 +85,12 @@  -- | Convert heterogeneous vector to CPS form cvec :: (HVector v, Elems v ~ xs) => v -> ContVec xs-cvec v = ContVec (inspect v)+cvec v = ContVecF (inspect v) {-# INLINE cvec #-}  -- | Convert CPS-vector to heterogeneous vector vector :: (HVector v, Elems v ~ xs) => ContVec xs -> v-vector (ContVec cont) = cont construct+vector (ContVecF cont) = cont construct {-# INLINE vector #-}  cvecF :: HVectorF v => v f -> ContVecF (ElemsF v) f@@ -113,62 +104,32 @@   ------------------------------------------------------------------- Constructors-------------------------------------------------------------------mk0 :: ContVec '[]-mk0 = ContVec $ \(Fun r) -> r-{-# INLINE mk0 #-}--mk1 :: a -> ContVec '[a]-mk1 a1 = ContVec $ \(Fun f) -> f a1-{-# INLINE mk1 #-}--mk2 :: a -> b -> ContVec '[a,b]-mk2 a1 a2 = ContVec $ \(Fun f) -> f a1 a2-{-# INLINE mk2 #-}--mk3 :: a -> b -> c -> ContVec '[a,b,c]-mk3 a1 a2 a3 = ContVec $ \(Fun f) -> f a1 a2 a3-{-# INLINE mk3 #-}--mk4 :: a -> b -> c -> d -> ContVec '[a,b,c,d]-mk4 a1 a2 a3 a4 = ContVec $ \(Fun f) -> f a1 a2 a3 a4-{-# INLINE mk4 #-}--mk5 :: a -> b -> c -> d -> e -> ContVec '[a,b,c,d,e]-mk5 a1 a2 a3 a4 a5 = ContVec $ \(Fun f) -> f a1 a2 a3 a4 a5-{-# INLINE mk5 #-}----------------------------------------------------------------------- Transformation+-- Position based functions ----------------------------------------------------------------  -- | Head of vector-head :: forall x xs. Arity xs => ContVec (x ': xs) -> x-head = flip inspect $ Fun $ \x -> unFun (pure x :: Fun xs x)+head :: Arity xs => ContVec (x : xs) -> x+head v = inspect v (uncurryFun pure) {-# INLINE head #-}  -- | Tail of CPS-encoded vector-tail :: ContVec (x ': xs) -> ContVec xs-tail (ContVec cont) = ContVec $ cont . constFun+tail :: ContVec (x : xs) -> ContVec xs+tail (ContVecF cont) = ContVecF $ cont . constFun {-# INLINE tail #-}  -- | Concatenate two vectors concat :: Arity xs => ContVec xs -> ContVec ys -> ContVec (xs ++ ys)-concat (ContVec contX) (ContVec contY) = ContVec $ contY . contX . curryMany+concat (ContVecF contX) (ContVecF contY) = ContVecF $ contY . contX . curryMany {-# INLINE concat #-}  -- | Get value at @n@th position.-index :: Index n xs => ContVec xs -> n -> ValueAt n xs-index (ContVec cont) = cont . getF+index :: Index n xs => ContVec xs -> proxy n -> ValueAt n xs+index (ContVecF cont) = cont . getF {-# INLINE index #-}  -- | Set value on nth position.-set :: Index n xs => n -> ValueAt n xs -> ContVec xs -> ContVec xs-set n x (ContVec cont) = ContVec $ cont . putF n x+set :: Index n xs => proxy n -> ValueAt n xs -> ContVec xs -> ContVec xs+set n x (ContVecF cont) = ContVecF $ cont . putF n x {-# INLINE set #-}  @@ -176,156 +137,62 @@ -- Monadic/applicative API ---------------------------------------------------------------- --- | Map functor.-mapFunctor :: (Arity xs)-     => (forall a. f a -> g a) -> ContVecF xs f -> ContVecF xs g-mapFunctor f (ContVecF cont) = ContVecF $ cont . mapFF f-{-# INLINE mapFunctor #-}+-- | Apply natural transformation to every element of the tuple.+mapNat :: (Arity xs)+       => (forall a. f a -> g a)+       -> ContVecF xs f+       -> ContVecF xs g+mapNat f (ContVecF cont) = ContVecF $ cont . mapFF f+{-# INLINE mapNat #-}  mapFF :: forall r f g xs. (Arity xs)       => (forall a. f a -> g a) -> TFun g xs r -> TFun f xs r {-# INLINE mapFF #-}-mapFF g (TFun f0) = TFun $ accumTy+mapFF g (TFun f0) = accum   (\(TF_map f) a -> TF_map $ f (g a))   (\(TF_map r)   -> r)-  (TF_map f0 :: TF_map r g xs)--newtype TF_map r g xs = TF_map (Fn (Wrap g xs) r)+  (TF_map f0) +newtype TF_map r g xs = TF_map (Fn g xs r)  --- | Sequence vector's elements-sequence :: (Arity xs, Monad m)-          => ContVecF xs m -> m (ContVec xs)-sequence (ContVecF cont)-  = cont $ sequence_F construct-{-# INLINE sequence #-}---- | Sequence vector's elements-sequenceA :: (Arity xs, Applicative f)-          => ContVecF xs f -> f (ContVec xs)-sequenceA (ContVecF cont)-  = cont $ sequenceA_F construct-{-# INLINE sequenceA #-}---- | Sequence vector's elements-sequenceF :: (Arity xs, Monad m)-          => ContVecF xs (m `Compose` f) -> m (ContVecF xs f)+-- | Apply sequence to outer level of parametrized tuple elements.+sequenceF :: (Arity xs, Applicative f)+          => ContVecF xs (f `Compose` g) -> f (ContVecF xs g) sequenceF (ContVecF cont)   = cont $ sequenceF_F constructF {-# INLINE sequenceF #-} --- | Sequence vector's elements-sequenceAF :: (Arity xs, Applicative f)-           => ContVecF xs (f `Compose` g) -> f (ContVecF xs g)-sequenceAF (ContVecF cont)-  = cont $ sequenceAF_F constructF-{-# INLINE sequenceAF #-}---sequence_F :: forall m xs r. (Monad m, Arity xs)-          => Fun xs r -> TFun m xs (m r)-{-# INLINE sequence_F #-}-sequence_F (Fun f) = TFun $-  accumTy (\(T_seq m) a -> T_seq $ m `ap` a)-          (\(T_seq m)             -> m)-          (T_seq (return f) :: T_seq m r xs)--sequenceA_F :: forall f xs r. (Applicative f, Arity xs)-          => Fun xs r -> TFun f xs (f r)-{-# INLINE sequenceA_F #-}-sequenceA_F (Fun f) = TFun $-  accumTy (\(T_seq m) a -> T_seq $ m <*> a)-          (\(T_seq m)             -> m)-          (T_seq (pure f) :: T_seq f r xs)--sequenceAF_F :: forall f g xs r. (Applicative f, Arity xs)-          => TFun g xs r -> TFun (f `Compose` g) xs (f r)-{-# INLINE sequenceAF_F #-}-sequenceAF_F (TFun f) = TFun $-  accumTy (\(T_seq2 m) (Compose a) -> T_seq2 $ m <*> a)-          (\(T_seq2 m)             -> m)-           (T_seq2 (pure f) :: T_seq2 f g r xs)--sequenceF_F :: forall m f xs r. (Monad m, Arity xs)-          => TFun f xs r -> TFun (m `Compose` f) xs (m r)+sequenceF_F :: forall f g xs r. (Applicative f, Arity xs)+            => TFun g xs r -> TFun (f `Compose` g) xs (f r) {-# INLINE sequenceF_F #-}-sequenceF_F (TFun f) = TFun $-  accumTy (\(T_seq2 m) (Compose a) -> T_seq2 $ m `ap` a)-          (\(T_seq2 m)             -> m)-          (T_seq2 (return f) :: T_seq2 m f r xs)-+sequenceF_F (TFun f) =+  accum (\(T_seq2 m) (Compose a) -> T_seq2 $ m <*> a)+        (\(T_seq2 m)             -> m)+        (T_seq2 (pure f)) -newtype T_seq    f r xs = T_seq  (f (Fn xs r))-newtype T_seq2 f g r xs = T_seq2 (f (Fn (Wrap g xs) r))+newtype T_seq2 f g r xs = T_seq2 (f (Fn g xs r))   -distribute :: forall f xs. (Arity xs, Functor f)-            => f (ContVec xs) -> ContVecF xs f-{-# INLINE distribute #-}-distribute f0-  = applyTy step start-  where-    step :: forall a as. T_distribute f (a ': as) -> (f a, T_distribute f as)-    step (T_distribute v) = ( fmap (\(Cons x _) -> x) v-                            , T_distribute $ fmap (\(Cons _ x) -> x) v-                            )-    start :: T_distribute f xs-    start = T_distribute $ fmap vector f0- distributeF :: forall f g xs. (Arity xs, Functor f)-            => f (ContVecF xs g) -> ContVecF xs (f `Compose` g)+            => f (ContVecF xs g)+            -> ContVecF xs (f `Compose` g) {-# INLINE distributeF #-} distributeF f0-  = applyTy step start+  = apply step start   where-    step :: forall a as. T_distributeF f g (a ': as) -> ((Compose f g) a, T_distributeF f g as)+    step :: forall a as. T_distributeF f g (a : as) -> ((Compose f g) a, T_distributeF f g as)     step (T_distributeF v) = ( Compose $ fmap (\(ConsF x _) -> x) v                              , T_distributeF $ fmap (\(ConsF _ x) -> x) v                              )     start :: T_distributeF f g xs     start = T_distributeF $ fmap vectorF f0 -newtype T_distribute    f xs = T_distribute  (f (VecList  xs)) newtype T_distributeF f g xs = T_distributeF (f (VecListF xs g))   --- | Wrap every value in the vector into type constructor.-wrap :: Arity xs => (forall a. a -> f a) -> ContVec xs -> ContVecF xs f-{-# INLINE wrap #-}-wrap f (ContVec cont)-  = ContVecF $ \fun -> cont $ wrapF f fun--wrapF :: forall f xs r. (Arity xs)-       => (forall a. a -> f a) -> TFun f xs r -> Fun xs r-{-# INLINE wrapF #-}-wrapF g (TFun f0) = Fun $ accum (\(T_wrap f) x -> T_wrap $ f (g x))-                                (\(T_wrap r)   -> r)-                                (T_wrap f0 :: T_wrap f r xs)--newtype T_wrap f r xs = T_wrap (Fn (Wrap f xs) r)------ | Unwrap every value in the vector from the type constructor.-unwrap :: Arity xs => (forall a. f a -> a) -> ContVecF xs f -> ContVec xs-{-# INLINE unwrap #-}-unwrap f (ContVecF cont)-  = ContVec $ \fun -> cont $ unwrapF f fun--unwrapF :: forall f xs r. (Arity xs)-         => (forall a. f a -> a) -> Fun xs r -> TFun f xs r-{-# INLINE unwrapF #-}-unwrapF g (Fun f0) = TFun $ accumTy (\(T_unwrap f) x -> T_unwrap $ f (g x))-                                    (\(T_unwrap r)   -> r)-                                    (T_unwrap f0 :: T_unwrap r xs)--newtype T_unwrap r xs = T_unwrap (Fn xs r)--- ---------------------------------------------------------------- -- Other vectors ----------------------------------------------------------------@@ -333,18 +200,18 @@ -- | List like heterogeneous vector. data VecList :: [*] -> * where   Nil  :: VecList '[]-  Cons :: x -> VecList xs -> VecList (x ': xs)+  Cons :: x -> VecList xs -> VecList (x : xs)  instance Arity xs => HVector (VecList xs) where   type Elems (VecList xs) = xs-  construct = Fun $ accum-    (\(T_List f) a -> T_List (f . Cons a))-    (\(T_List f)   -> f Nil)-    (T_List id :: T_List xs xs)-  inspect = runContVec . apply step+  construct = accum+    (\(T_List f) (Identity a) -> T_List (f . Cons a))+    (\(T_List f)              -> f Nil)+    (T_List id)+  inspect = runContVecF . apply step     where-      step :: VecList (a ': as) -> (a, VecList as)-      step (Cons a xs) = (a, xs)+      step :: VecList (a : as) -> (Identity a, VecList as)+      step (Cons a xs) = (Identity a, xs)   {-# INLINE construct #-}   {-# INLINE inspect   #-} @@ -354,22 +221,23 @@ -- | List-like vector data VecListF xs f where   NilF  :: VecListF '[] f-  ConsF :: f x -> VecListF xs f -> VecListF (x ': xs) f+  ConsF :: f x -> VecListF xs f -> VecListF (x : xs) f  instance Arity xs => HVectorF (VecListF xs) where   type ElemsF (VecListF xs) = xs   constructF   = conVecF-  inspectF   v = inspectF (applyTy step (TF_insp v))+  inspectF   v = inspectF (apply step (TF_insp v))     where-      step :: TF_insp f (a ': as) -> (f a, TF_insp f as)+      step :: TF_insp f (a : as) -> (f a, TF_insp f as)       step (TF_insp (ConsF a xs)) = (a, TF_insp xs)   {-# INLINE constructF #-}   {-# INLINE inspectF   #-}  conVecF :: forall f xs. (Arity xs) => TFun f xs (VecListF xs f)-conVecF = TFun $ accumTy (\(TF_List f) a -> TF_List (f . ConsF a))-                         (\(TF_List f)   -> f NilF)-                         (TF_List id :: TF_List f xs xs)+{-# INLINE conVecF #-}+conVecF = accum (\(TF_List f) a -> TF_List (f . ConsF a))+                (\(TF_List f)   -> f NilF)+                (TF_List id)  newtype TF_insp f     xs = TF_insp (VecListF xs f) newtype TF_List f all xs = TF_List (VecListF xs f -> VecListF all f)@@ -380,142 +248,136 @@ -- More combinators ---------------------------------------------------------------- --- | Replicate polymorphic value n times. Concrete instance for every---   element is determined by their respective types.-replicate :: forall xs c. (ArityC c xs)-          => Proxy c -> (forall x. c x => x) -> ContVec xs-{-# INLINE replicate #-}-replicate _ x-  = apply step (witAllInstances :: WitAllInstances c xs)-  where-    step :: forall a as. WitAllInstances c (a ': as) -> (a, WitAllInstances c as)-    step (WitAllInstancesCons d) = (x,d)+replicateNatF :: forall f xs. Arity xs => (forall a. f a) -> ContVecF xs f+{-# INLINE replicateNatF #-}+replicateNatF f = apply (\Proxy -> (f, Proxy)) (Proxy) +replicateF :: forall f c xs. ArityC c xs => Proxy c -> (forall a. c a => f a) -> ContVecF xs f+{-# INLINE replicateF #-}+replicateF cls f = applyC cls (\Proxy -> (f,Proxy)) Proxy --- | Replicate monadic action n times.-replicateM :: forall xs c m. (ArityC c xs, Monad m)-           => Proxy c -> (forall x. c x => m x) -> m (ContVec xs)-{-# INLINE replicateM #-}-replicateM _ act-  = applyM step (witAllInstances :: WitAllInstances c xs)-  where-    step :: forall a as. WitAllInstances c (a ': as) -> m (a, WitAllInstances c as)-    step (WitAllInstancesCons d) = do { x <- act; return (x,d) } -replicateF :: forall f xs. Arity xs => (forall a. f a) -> ContVecF xs f-replicateF f = applyTy-  (\T_replicateF -> (f, T_replicateF))-  (T_replicateF :: T_replicateF xs) -data T_replicateF (xs :: [*]) = T_replicateF-+----------------------------------------------------------------+-- Folds+----------------------------------------------------------------  -- | Right fold over vector-foldr :: forall xs c b. (ArityC c xs)-      => Proxy c -> (forall a. c a => a -> b -> b) -> b -> ContVec xs -> b-{-# INLINE foldr #-}-foldr _ f b0 v-  = inspect v $ Fun-  $ accum (\(T_foldr b (WitAllInstancesCons d)) a -> T_foldr (b . f a) d)-          (\(T_foldr b  _                     )   -> b b0)-          (T_foldr id witAllInstances :: T_foldr c b xs)+foldrF :: (ArityC c xs)+       => Proxy c -> (forall a. c a => f a -> b -> b) -> b -> ContVecF xs f -> b+{-# INLINE foldrF #-}+foldrF cls f b0 v+  = inspectF v+  $ accumC cls (\(Const b) a -> Const (b . f a))+               (\(Const b)   -> b b0)+               (Const id)  -- | Left fold over vector-foldl :: forall xs c b. (ArityC c xs)-      => Proxy c -> (forall a. c a => b -> a -> b) -> b -> ContVec xs -> b-{-# INLINE foldl #-}-foldl _ f b0 v-  = inspect v $ Fun-  $ accum (\(T_foldl b (WitAllInstancesCons d)) a -> T_foldl (f b a) d)-          (\(T_foldl b  _                     )   -> b)-          (T_foldl b0 witAllInstances :: T_foldl c b xs)--data T_foldr c b xs = T_foldr (b -> b) (WitAllInstances c xs)-data T_foldl c b xs = T_foldl  b       (WitAllInstances c xs)+foldlF :: (ArityC c xs)+       => Proxy c -> (forall a. c a => b -> f a -> b) -> b -> ContVecF xs f -> b+{-# INLINE foldlF #-}+foldlF cls f b0 v+  = inspectF v+  $ accumC cls (\(Const b) a -> Const (f b a))+               (\(Const b)   -> b)+               (Const b0) +-- | Right fold over vector+foldrNatF :: (Arity xs)+       => (forall a. f a -> b -> b) -> b -> ContVecF xs f -> b+{-# INLINE foldrNatF #-}+foldrNatF f b0 v+  = inspectF v+  $ accum (\(Const b) a -> Const (b . f a))+          (\(Const b)   -> b b0)+          (Const id) --- | Convert heterogeneous vector to homogeneous-monomorphize :: forall c xs a. (ArityC c xs)-             => Proxy c -> (forall x. c x => x -> a)-             -> ContVec xs -> F.ContVec (Len xs) a-{-# INLINE monomorphize #-}-monomorphize _ f v-  = inspect v $ Fun $ accum-      (\(T_mono cont (WitAllInstancesCons d)) a -> T_mono (cont . F.cons (f a)) d)-      (\(T_mono cont _)                         -> cont F.empty)-      (T_mono id witAllInstances :: T_mono c a xs xs)+-- | Left fold over vector+foldlNatF :: (Arity xs)+          => (forall a. b -> f a -> b) -> b -> ContVecF xs f -> b+{-# INLINE foldlNatF #-}+foldlNatF f b0 v+  = inspectF v+  $ accum (\(Const b) a -> Const (f b a))+          (\(Const b)   -> b)+          (Const b0)  -- | Convert heterogeneous vector to homogeneous-monomorphizeF :: forall c xs a f. (ArityC c xs)+monomorphizeF :: forall c xs a f n. ( ArityC c xs+                                    , F.Peano n ~ Len xs+                                    )               => Proxy c -> (forall x. c x => f x -> a)-              -> ContVecF xs f -> F.ContVec (Len xs) a+              -> ContVecF xs f -> F.ContVec n a {-# INLINE monomorphizeF #-}-monomorphizeF _ f v-  -- = undefined-  = inspectF v $ TFun $ accumTy step fini start+monomorphizeF cls f v+  = inspectF v+  $ accumC cls (\(T_mono cont) a -> T_mono (cont . F.consPeano (f a)))+               (\(T_mono cont)   -> fini (cont (F.CVecPeano F.unFun)))+               (T_mono id :: T_mono a xs xs)   where-    step :: forall z zs. T_mono c a xs (z ': zs) -> f z -> T_mono c a xs zs-    step (T_mono cont (WitAllInstancesCons d)) a = T_mono (cont . F.cons (f a)) d-    ---    fini (T_mono cont _) = cont F.empty-    start = (T_mono id witAllInstances :: T_mono c a xs xs)+    fini (F.CVecPeano cont) = F.ContVec cont -data T_mono c a all xs = T_mono (F.ContVec (Len xs) a -> F.ContVec (Len all) a) (WitAllInstances c xs)+data T_mono a all xs = T_mono (F.CVecPeano (Len xs) a -> F.CVecPeano (Len all) a)   -- | Unfold vector.-unfoldr :: forall xs c b. (ArityC c xs)-        => Proxy c -> (forall a. c a => b -> (a,b)) -> b -> ContVec xs-{-# INLINE unfoldr #-}-unfoldr _ f b0 = apply-  (\(T_unfoldr b (WitAllInstancesCons d)) -> let (a,b') = f b-                                             in  (a,T_unfoldr b' d))-  (T_unfoldr b0 witAllInstances :: T_unfoldr c b xs)+unfoldrF :: (ArityC c xs)+         => Proxy c+         -> (forall a. c a => b -> (f a, b))+         -> b+         -> ContVecF xs f+{-# INLINE unfoldrF #-}+unfoldrF cls f b0 = applyC cls+  (\(Const b) -> let (a,b') = f b in (a, Const b'))+  (Const b0)  -data T_unfoldr c b xs = T_unfoldr b (WitAllInstances c xs) ---- | Zip two heterogeneous vectors-zipMono :: forall xs c. (ArityC c xs)-        => Proxy c -> (forall a. c a => a -> a -> a) -> ContVec xs -> ContVec xs -> ContVec xs-{-# INLINE zipMono #-}-zipMono _ f cvecA cvecB-  = apply (\(T_zipMono (Cons a va) (Cons b vb) (WitAllInstancesCons w)) ->-              (f a b, T_zipMono va vb w))-          (T_zipMono (vector cvecA) (vector cvecB) witAllInstances :: T_zipMono c xs)--data T_zipMono c xs = T_zipMono (VecList xs) (VecList xs) (WitAllInstances c xs)+----------------------------------------------------------------+-- Zip variants+----------------------------------------------------------------  -- | Zip two heterogeneous vectors-zipMonoF :: forall xs f g h c. (ArityC c xs)+zipWithF :: forall xs f g h c. (ArityC c xs)          => Proxy c          -> (forall a. c a => f a -> g a -> h a)          -> ContVecF xs f          -> ContVecF xs g          -> ContVecF xs h-{-# INLINE zipMonoF #-}-zipMonoF _ f cvecA cvecB-  = applyTy (\(T_zipMonoF (ConsF a va) (ConsF b vb) (WitAllInstancesCons w)) ->-                  (f a b, T_zipMonoF va vb w))-              (T_zipMonoF (vectorF cvecA) (vectorF cvecB) witAllInstances :: T_zipMonoF c f g xs)+{-# INLINE zipWithF #-}+zipWithF cls f cvecA cvecB = applyC cls+  (\(T_zipWithF (ConsF a va) (ConsF b vb)) ->+      (f a b, T_zipWithF va vb))+  (T_zipWithF (vectorF cvecA) (vectorF cvecB) :: T_zipWithF f g xs) -data T_zipMonoF c f g xs = T_zipMonoF (VecListF xs f) (VecListF xs g) (WitAllInstances c xs)+data T_zipWithF f g xs = T_zipWithF (VecListF xs f) (VecListF xs g)   -- | Zip vector and fold result using monoid-zipFold :: forall xs c m. (ArityC c xs, Monoid m)-        => Proxy c -> (forall a. c a => a -> a -> m) -> ContVec xs -> ContVec xs -> m-{-# INLINE zipFold #-}-zipFold _ f cvecA cvecB-  = inspect cvecB zipF+zipFoldF :: forall xs c m f. (ArityC c xs, Monoid m)+        => Proxy c -> (forall a. c a => f a -> f a -> m) -> ContVecF xs f -> ContVecF xs f -> m+{-# INLINE zipFoldF #-}+zipFoldF cls f cvecA cvecB+  = inspectF cvecB zipF   where-    zipF :: Fun xs m-    zipF = Fun $ accum (\(T_zipFold (Cons a va) m (WitAllInstancesCons w)) b ->-                           T_zipFold va (m <> f a b) w)-                       (\(T_zipFold _ m _) -> m)-                       (T_zipFold (vector cvecA) mempty witAllInstances :: T_zipFold c m xs)+    zipF :: TFun f xs m+    zipF = accumC cls+      (\(T_zipFoldF (ConsF a va) m) b -> T_zipFoldF va (m <> f a b))+      (\(T_zipFoldF _            m)   -> m)+      (T_zipFoldF (vectorF cvecA) mempty :: T_zipFoldF m f xs) -data T_zipFold c m xs = T_zipFold (VecList xs) m (WitAllInstances c xs)+data T_zipFoldF m f xs = T_zipFoldF (VecListF xs f) m  +-- | Zip two heterogeneous vectors+zipWithNatF :: forall xs f g h. (Arity xs)+            => (forall a. f a -> g a -> h a)+            -> ContVecF xs f+            -> ContVecF xs g+            -> ContVecF xs h+{-# INLINE zipWithNatF #-}+zipWithNatF f cvecA cvecB+  = apply (\(T_zipNatF (ConsF a va) (ConsF b vb)) -> (f a b, T_zipNatF va vb))+          (T_zipNatF (vectorF cvecA) (vectorF cvecB) :: T_zipNatF f g xs)++data T_zipNatF f g xs = T_zipNatF (VecListF xs f) (VecListF xs g)
− Data/Vector/HFixed/Functor/HVecF.hs
@@ -1,53 +0,0 @@-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE FlexibleContexts     #-}-{-# LANGUAGE TypeFamilies         #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{-# LANGUAGE InstanceSigs         #-}--- |-module Data.Vector.HFixed.Functor.HVecF (-    HVecF(..)-  ) where--import Control.DeepSeq-import Data.Vector.HFixed.Cont-import Data.Vector.HFixed.Class-import Data.Vector.HFixed.HVec (HVec)-import qualified Data.Vector.HFixed as H---- | Partially heterogeneous vector which can hold elements of any---   type.-newtype HVecF xs f = HVecF { getHVecF :: HVec (Wrap f xs) }---- | It's not possible to remove constrain @Arity (Wrap f xs)@ because---   it's required by superclass and we cannot prove it for all---   /f/. 'witWrapped' allow to generate proofs for terms-instance (Arity (Wrap f xs), Arity xs) => HVector (HVecF xs f) where-  type Elems (HVecF xs f) = Wrap f xs-  inspect v f = inspectF v (funToTFun f)-  construct   = tfunToFun constructF-  {-# INLINE inspect   #-}-  {-# INLINE construct #-}--instance Arity xs => HVectorF (HVecF xs) where-  type ElemsF (HVecF xs) = xs-  inspectF (HVecF v) (f :: TFun f xs a) =-    case witWrapped :: WitWrapped f xs of-      WitWrapped -> inspect v (tfunToFun f)-  {-# INLINE inspectF   #-}-  constructF :: forall f. TFun f (ElemsF (HVecF xs)) (HVecF xs f)-  constructF =-    case witWrapped :: WitWrapped f xs of-      WitWrapped -> funToTFun $ fmap HVecF construct-  {-# INLINE constructF #-}--instance (Arity xs, ArityC Eq (Wrap f xs)) => Eq (HVecF xs f) where-  (==) = H.eq-  {-# INLINE (==) #-}--instance (Arity xs, ArityC Eq (Wrap f xs), ArityC Ord (Wrap f xs)) => Ord (HVecF xs f) where-  compare = H.compare-  {-# INLINE compare #-}--instance (Arity xs, ArityC NFData (Wrap f xs)) => NFData (HVecF xs f) where-  rnf = H.rnf-  {-# INLINE rnf #-}
Data/Vector/HFixed/HVec.hs view
@@ -1,185 +1,126 @@-{-# LANGUAGE GADTs                #-} {-# LANGUAGE DataKinds            #-}+{-# LANGUAGE FlexibleContexts     #-}+{-# LANGUAGE GADTs                #-} {-# LANGUAGE Rank2Types           #-}-{-# LANGUAGE TypeFamilies         #-} {-# LANGUAGE ScopedTypeVariables  #-}-{-# LANGUAGE FlexibleContexts     #-}+{-# LANGUAGE TypeApplications     #-}+{-# LANGUAGE TypeFamilies         #-} {-# LANGUAGE UndecidableInstances #-} -- | -- Heterogeneous vector parametric in its elements module Data.Vector.HFixed.HVec (     -- * Generic heterogeneous vector     HVec-    -- * Mutable heterogeneous vector-  , MutableHVec-  , newMutableHVec-  , unsafeFreezeHVec-    -- ** Indices-  , readMutableHVec-  , writeMutableHVec-  , modifyMutableHVec-  , modifyMutableHVec'+  , HVecF   ) where  import Control.Monad.ST        (ST,runST)-import Control.Monad.Primitive (PrimMonad(..))+import Data.Functor.Identity   (Identity(..))+import Data.Functor.Classes import Control.DeepSeq         (NFData(..))-import Data.Monoid             (Monoid(..))-import Data.List               (intercalate)-import Data.Primitive.Array    (Array,MutableArray,newArray,writeArray,readArray,-                                indexArray, unsafeFreezeArray)+import Data.Monoid             (Monoid(..),All(..))+import Data.List               (intersperse,intercalate)+import Data.Primitive.SmallArray ( SmallArray, SmallMutableArray, newSmallArray+                                 , writeSmallArray, indexSmallArray+                                 , unsafeFreezeSmallArray)+import Text.Show               (showChar) import GHC.Exts                (Any) import Unsafe.Coerce           (unsafeCoerce) -import qualified Data.Vector.Fixed.Cont as F (Arity(..)) import qualified Data.Vector.HFixed     as H import Data.Vector.HFixed.Class    ------------------------------------------------------------------- Generic HVec+-- HVecF ---------------------------------------------------------------- --- | Generic heterogeneous vector-newtype HVec (xs :: [*]) = HVec (Array Any)--instance (ArityC Show xs) => Show (HVec xs) where-  show v-    = "[" ++ intercalate ", " (H.foldr (Proxy :: Proxy Show) (\x xs -> show x : xs) [] v) ++ "]"--instance (ArityC Eq xs) => Eq (HVec xs) where-  (==) = H.eq-  {-# INLINE (==) #-}---- NOTE: We need to add `Eq (HVec xs)' since GHC cannot deduce that---       `ArityC Ord xs => ArityC Eq xs' for all xs-instance (ArityC Ord xs, Eq (HVec xs)) => Ord (HVec xs) where-  compare = H.compare-  {-# INLINE compare #-}--instance (ArityC Monoid xs) => Monoid (HVec xs) where-  mempty  = H.replicate (Proxy :: Proxy Monoid) mempty-  mappend = H.zipMono (Proxy :: Proxy Monoid) mappend-  {-# INLINE mempty  #-}-  {-# INLINE mappend #-}--instance (ArityC NFData xs) => NFData (HVec xs) where-  rnf = H.rnf-  {-# INLINE rnf #-}--instance Arity xs => HVector (HVec xs) where-  type Elems (HVec xs) = xs-  inspect   (HVec arr) = inspectFF arr-  construct = constructFF-  {-# INLINE inspect #-}-  {-# INLINE construct #-}---inspectFF :: forall xs r. Arity xs => Array Any -> Fun xs r -> r-{-# INLINE inspectFF #-}-inspectFF arr-  = runContVec-  $ apply (\(T_insp i a) -> ( unsafeCoerce $ indexArray a i-                            , T_insp (i+1) a))-          (T_insp 0 arr :: T_insp xs)-+-- | Heterogeneous vector parametrized by common type constructor.+newtype HVecF (xs :: [*]) (f :: * -> *) = HVecF (SmallArray Any) -constructFF :: forall xs. Arity xs => Fun xs (HVec xs)-{-# INLINE constructFF #-}-constructFF-  = Fun $ accum (\(T_con i box) a -> T_con (i+1) (writeToBox (unsafeCoerce a) i box))-                (\(T_con _ box)   -> HVec $ runBox len box :: HVec xs)-                (T_con 0 (Box $ \_ -> return ()) :: T_con xs)-  where-    len = arity (Proxy :: Proxy xs)+instance Arity xs => HVectorF (HVecF xs) where+  type ElemsF (HVecF xs) = xs+  inspectF (HVecF arr)+    = runContVecF+    $ apply (\(T_insp i a) -> ( unsafeCoerce $ indexSmallArray a i+                              , T_insp (i+1) a))+            (T_insp 0 arr)+  {-# INLINE inspectF #-}+  constructF = accum+    (\(T_con i box) a -> T_con (i+1) (writeToBox (unsafeCoerce a) i box))+    (\(T_con _ box)   -> HVecF $ runBox len box)+    (T_con 0 (Box $ \_ -> return ()))+    where+    len = arity (Proxy @ xs)+  {-# INLINE constructF #-} -data T_insp (xs :: [*]) = T_insp Int (Array Any)+data T_insp (xs :: [*]) = T_insp Int (SmallArray Any) data T_con  (xs :: [*]) = T_con  Int (Box Any) ----- Helper data type-newtype Box a = Box (forall s. MutableArray s a -> ST s ())+-- Helper data type for creating of array+newtype Box a = Box (forall s. SmallMutableArray s a -> ST s ())  writeToBox :: a -> Int -> Box a -> Box a-writeToBox a i (Box f) = Box $ \arr -> f arr >> (writeArray arr i $! a) {-# INLINE writeToBox #-}+writeToBox a i (Box f) = Box $ \arr -> f arr >> (writeSmallArray arr i $! a) -runBox :: Int -> Box a -> Array a+runBox :: Int -> Box a -> SmallArray a {-# INLINE runBox #-}-runBox size (Box f) = runST $ do arr <- newArray size uninitialised+runBox size (Box f) = runST $ do arr <- newSmallArray size uninitialised                                  f arr-                                 unsafeFreezeArray arr+                                 unsafeFreezeSmallArray arr  uninitialised :: a uninitialised = error "Data.Vector.HFixed: uninitialised element"  +instance (Show1 f, ArityC Show xs) => Show (HVecF xs f) where+  showsPrec _ v = showChar '['+                . ( foldr (.) id+                  $ intersperse (showChar ',')+                  $ H.foldrF (Proxy @ Show) (\x xs -> showsPrec1 0 x : xs) [] v+                  )+                . showChar ']'+instance (Eq1 f, ArityC Eq xs) => Eq (HVecF xs f) where+  v == u = getAll $ H.zipFoldF (Proxy @ Eq) (\x y -> All (eq1 x y)) v u+instance (Ord1 f, ArityC Eq xs, ArityC Ord xs) => Ord (HVecF xs f) where+  compare = H.zipFoldF (Proxy :: Proxy Ord) compare1  ------------------------------------------------------------------- Mutable tuples+-- HVec ---------------------------------------------------------------- --- | Generic mutable heterogeneous vector.-newtype MutableHVec s (xs :: [*]) = MutableHVec (MutableArray s Any)+-- | Generic heterogeneous vector+newtype HVec (xs :: [*]) = HVec (HVecF xs Identity) --- | Create new uninitialized heterogeneous vector.-newMutableHVec :: forall m xs. (PrimMonad m, Arity xs)-               => m (MutableHVec (PrimState m) xs)-{-# INLINE newMutableHVec #-}-newMutableHVec = do-  arr <- newArray n uninitialised-  return $ MutableHVec arr-  where-    n = arity (Proxy :: Proxy xs)+instance Arity xs => HVector (HVec xs) where+  type Elems (HVec xs) = xs+  inspect (HVec v) = inspectF v+  construct = HVec <$> constructF+  {-# INLINE inspect   #-}+  {-# INLINE construct #-} --- | Convert mutable vector to immutable one. Mutable vector must not---   be modified after that.-unsafeFreezeHVec :: (PrimMonad m) => MutableHVec (PrimState m) xs -> m (HVec xs)-{-# INLINE unsafeFreezeHVec #-}-unsafeFreezeHVec (MutableHVec marr) = do-  arr <- unsafeFreezeArray marr-  return $ HVec arr+instance (ArityC Show xs) => Show (HVec xs) where+  show v+    = "[" ++ intercalate ", " (H.foldr (Proxy :: Proxy Show) (\x xs -> show x : xs) [] v) ++ "]" --- | Read value at statically known index.-readMutableHVec :: (PrimMonad m, Index n xs, Arity xs)-                => MutableHVec (PrimState m) xs-                -> n-                -> m (ValueAt n xs)-{-# INLINE readMutableHVec #-}-readMutableHVec (MutableHVec arr) n = do-  a <- readArray arr $ F.arity n-  return $ unsafeCoerce a+instance (ArityC Eq xs) => Eq (HVec xs) where+  (==) = H.eq+  {-# INLINE (==) #-} --- | Write value at statically known index-writeMutableHVec :: (PrimMonad m, Index n xs, Arity xs)-                 => MutableHVec (PrimState m) xs-                 -> n-                 -> ValueAt n xs-                 -> m ()-{-# INLINE writeMutableHVec #-}-writeMutableHVec (MutableHVec arr) n a = do-  writeArray arr (F.arity n) (unsafeCoerce a)+-- NOTE: We need to add `Eq (HVec xs)' since GHC cannot deduce that+--       `ArityC Ord xs => ArityC Eq xs' for all xs+instance (ArityC Ord xs, ArityC Eq xs) => Ord (HVec xs) where+  compare = H.compare+  {-# INLINE compare #-} --- | Apply function to value at statically known index.-modifyMutableHVec :: (PrimMonad m, Index n xs, Arity xs)-                  => MutableHVec (PrimState m) xs-                  -> n-                  -> (ValueAt n xs -> ValueAt n xs)-                  -> m ()-{-# INLINE modifyMutableHVec #-}-modifyMutableHVec hvec n f = do-  a <- readMutableHVec hvec n-  writeMutableHVec hvec n (f a)+instance (ArityC Monoid xs) => Monoid (HVec xs) where+  mempty  = H.replicate (Proxy @ Monoid) mempty+  mappend = H.zipWith   (Proxy @ Monoid) mappend+  {-# INLINE mempty  #-}+  {-# INLINE mappend #-} --- | Strictly apply function to value at statically known index.-modifyMutableHVec' :: (PrimMonad m, Index n xs, Arity xs)-                   => MutableHVec (PrimState m) xs-                   -> n-                   -> (ValueAt n xs -> ValueAt n xs)-                   -> m ()-{-# INLINE modifyMutableHVec' #-}-modifyMutableHVec' hvec n f = do-  a <- readMutableHVec hvec n-  writeMutableHVec hvec n $! f a+instance (ArityC NFData xs) => NFData (HVec xs) where+  rnf = H.rnf+  {-# INLINE rnf #-}
Data/Vector/HFixed/TypeFuns.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP                #-} {-# LANGUAGE DataKinds          #-} {-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE PolyKinds          #-}@@ -7,66 +6,35 @@ -- | Type functions module Data.Vector.HFixed.TypeFuns (     -- * Type proxy-    -- $ghc78     Proxy(..)   , proxy-  , unproxy     -- * Type functions-  , type (++)()+  , type (++)   , Len-  , Head   , HomList-  , Wrap   ) where -#if __GLASGOW_HASKELL__ >= 708 import Data.Typeable          (Proxy(..))-#endif-import Data.Vector.Fixed.Cont (S,Z)---- $ghc78------ Starting from version 7.8 GHC provides kind-polymorphic proxy data--- type. In those versions /Data.Typeable.Proxy/ is reexported. For--- GHC 7.6 we have to define our own Proxy data type.-#if __GLASGOW_HASKELL__ < 708-data Proxy a = Proxy-#endif+import Data.Vector.Fixed.Cont (PeanoNum(..))  proxy :: t -> Proxy t proxy _ = Proxy -unproxy :: Proxy t -> t-unproxy _ = error "Data.Vector.HFixed.Class: unproxied value" - -- | Concaternation of type level lists.-type family   (++) (xs :: [α]) (ys :: [α]) :: [α]-type instance (++) '[]       ys = ys-type instance (++) (x ': xs) ys = x ': xs ++ ys+type family   (++) (xs :: [α]) (ys :: [α]) :: [α] where+  (++) '[]      ys = ys+  (++) (x : xs) ys = x : xs ++ ys   -- | Length of type list expressed as type level naturals from --   @fixed-vector@.-type family   Len (xs :: [α]) :: *-type instance Len '[]       = Z-type instance Len (x ': xs) = S (Len xs)---- | Head of type list-type family   Head (xs :: [α]) :: α-type instance Head (x ': xs) = x-+type family Len (xs :: [α]) :: PeanoNum where+  Len '[]      = 'Z+  Len (x : xs) = 'S (Len xs)  -- | Homogeneous type list with length /n/ and element of type /a/. It --   uses type level natural defined in @fixed-vector@.-type family   HomList n (a :: α) :: [α]-type instance HomList  Z    a = '[]-type instance HomList (S n) a = a ': HomList n a---- | Wrap every element of list into type constructor-type family   Wrap (f :: α -> β) (a :: [α]) :: [β]-type instance Wrap f  '[]      = '[]-type instance Wrap f (x ': xs) = (f x) ': (Wrap f xs)---+type family HomList (n :: PeanoNum) (a :: α) :: [α] where+  HomList  'Z    a = '[]+  HomList ('S n) a = a : HomList n a
fixed-vector-hetero.cabal view
@@ -1,5 +1,5 @@ Name:           fixed-vector-hetero-Version:        0.3.1.2+Version:        0.4.0.0 Synopsis:       Generic heterogeneous vectors Description:   Generic heterogeneous vectors@@ -13,30 +13,23 @@ Category:       Data Build-Type:     Simple extra-source-files:-  ChangeLog+  ChangeLog.md  source-repository head-  type:     git-  location: http://github.com/Shimuuar/fixed-vector-source-repository head   type:     hg   location: http://bitbucket.org/Shimuuar/fixed-vector-hetero  Library   -- Bigger context stack needed for HVector instances for large   -- tuples-  Ghc-options:          -Wall -fcontext-stack=50-  Build-Depends:-    base          >=4.7 && <5,-    deepseq,-    transformers,-    ghc-prim,-    fixed-vector  >= 0.7.0.3,-    primitive+  Ghc-options:          -Wall -freduction-depth=50+  Build-Depends: base          >=4.9 && <5+               , deepseq+               , fixed-vector  >= 1.0.0.0+               , primitive     >= 0.6.2   Exposed-modules:           Data.Vector.HFixed     Data.Vector.HFixed.Class     Data.Vector.HFixed.Cont     Data.Vector.HFixed.HVec-    Data.Vector.HFixed.Functor.HVecF     Data.Vector.HFixed.TypeFuns