module Data.Clustering.Hierarchical.Internal.Types
( Dendrogram(..)
, Linkage(..)
, Distance
) where
import Control.Applicative ((<$>), (<*>))
import Data.Foldable (Foldable (..))
import Data.Monoid (mappend)
import Data.Traversable (Traversable(..))
data Dendrogram a =
Leaf a
| Branch {-# UNPACK #-} !Distance (Dendrogram a) (Dendrogram a)
deriving (Dendrogram a -> Dendrogram a -> Bool
(Dendrogram a -> Dendrogram a -> Bool)
-> (Dendrogram a -> Dendrogram a -> Bool) -> Eq (Dendrogram a)
forall a. Eq a => Dendrogram a -> Dendrogram a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Dendrogram a -> Dendrogram a -> Bool
$c/= :: forall a. Eq a => Dendrogram a -> Dendrogram a -> Bool
== :: Dendrogram a -> Dendrogram a -> Bool
$c== :: forall a. Eq a => Dendrogram a -> Dendrogram a -> Bool
Eq, Eq (Dendrogram a)
Eq (Dendrogram a)
-> (Dendrogram a -> Dendrogram a -> Ordering)
-> (Dendrogram a -> Dendrogram a -> Bool)
-> (Dendrogram a -> Dendrogram a -> Bool)
-> (Dendrogram a -> Dendrogram a -> Bool)
-> (Dendrogram a -> Dendrogram a -> Bool)
-> (Dendrogram a -> Dendrogram a -> Dendrogram a)
-> (Dendrogram a -> Dendrogram a -> Dendrogram a)
-> Ord (Dendrogram a)
Dendrogram a -> Dendrogram a -> Bool
Dendrogram a -> Dendrogram a -> Ordering
Dendrogram a -> Dendrogram a -> Dendrogram a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Dendrogram a)
forall a. Ord a => Dendrogram a -> Dendrogram a -> Bool
forall a. Ord a => Dendrogram a -> Dendrogram a -> Ordering
forall a. Ord a => Dendrogram a -> Dendrogram a -> Dendrogram a
min :: Dendrogram a -> Dendrogram a -> Dendrogram a
$cmin :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Dendrogram a
max :: Dendrogram a -> Dendrogram a -> Dendrogram a
$cmax :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Dendrogram a
>= :: Dendrogram a -> Dendrogram a -> Bool
$c>= :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Bool
> :: Dendrogram a -> Dendrogram a -> Bool
$c> :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Bool
<= :: Dendrogram a -> Dendrogram a -> Bool
$c<= :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Bool
< :: Dendrogram a -> Dendrogram a -> Bool
$c< :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Bool
compare :: Dendrogram a -> Dendrogram a -> Ordering
$ccompare :: forall a. Ord a => Dendrogram a -> Dendrogram a -> Ordering
Ord, Int -> Dendrogram a -> ShowS
[Dendrogram a] -> ShowS
Dendrogram a -> String
(Int -> Dendrogram a -> ShowS)
-> (Dendrogram a -> String)
-> ([Dendrogram a] -> ShowS)
-> Show (Dendrogram a)
forall a. Show a => Int -> Dendrogram a -> ShowS
forall a. Show a => [Dendrogram a] -> ShowS
forall a. Show a => Dendrogram a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Dendrogram a] -> ShowS
$cshowList :: forall a. Show a => [Dendrogram a] -> ShowS
show :: Dendrogram a -> String
$cshow :: forall a. Show a => Dendrogram a -> String
showsPrec :: Int -> Dendrogram a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Dendrogram a -> ShowS
Show)
type Distance = Double
instance Functor Dendrogram where
fmap :: forall a b. (a -> b) -> Dendrogram a -> Dendrogram b
fmap a -> b
f (Leaf a
d) = b -> Dendrogram b
forall a. a -> Dendrogram a
Leaf (a -> b
f a
d)
fmap a -> b
f (Branch Distance
s Dendrogram a
c1 Dendrogram a
c2) = Distance -> Dendrogram b -> Dendrogram b -> Dendrogram b
forall a. Distance -> Dendrogram a -> Dendrogram a -> Dendrogram a
Branch Distance
s ((a -> b) -> Dendrogram a -> Dendrogram b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Dendrogram a
c1) ((a -> b) -> Dendrogram a -> Dendrogram b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Dendrogram a
c2)
instance Foldable Dendrogram where
foldMap :: forall m a. Monoid m => (a -> m) -> Dendrogram a -> m
foldMap a -> m
f (Leaf a
d) = a -> m
f a
d
foldMap a -> m
f (Branch Distance
_ Dendrogram a
c1 Dendrogram a
c2) = (a -> m) -> Dendrogram a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
f Dendrogram a
c1 m -> m -> m
forall a. Monoid a => a -> a -> a
`mappend` (a -> m) -> Dendrogram a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
f Dendrogram a
c2
instance Traversable Dendrogram where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Dendrogram a -> f (Dendrogram b)
traverse a -> f b
f (Leaf a
d) = b -> Dendrogram b
forall a. a -> Dendrogram a
Leaf (b -> Dendrogram b) -> f b -> f (Dendrogram b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
d
traverse a -> f b
f (Branch Distance
s Dendrogram a
c1 Dendrogram a
c2) = Distance -> Dendrogram b -> Dendrogram b -> Dendrogram b
forall a. Distance -> Dendrogram a -> Dendrogram a -> Dendrogram a
Branch Distance
s (Dendrogram b -> Dendrogram b -> Dendrogram b)
-> f (Dendrogram b) -> f (Dendrogram b -> Dendrogram b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f b) -> Dendrogram a -> f (Dendrogram b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f Dendrogram a
c1 f (Dendrogram b -> Dendrogram b)
-> f (Dendrogram b) -> f (Dendrogram b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (a -> f b) -> Dendrogram a -> f (Dendrogram b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f Dendrogram a
c2
data Linkage =
SingleLinkage
| CompleteLinkage
| CLINK
| UPGMA
| FakeAverageLinkage
deriving (Linkage -> Linkage -> Bool
(Linkage -> Linkage -> Bool)
-> (Linkage -> Linkage -> Bool) -> Eq Linkage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Linkage -> Linkage -> Bool
$c/= :: Linkage -> Linkage -> Bool
== :: Linkage -> Linkage -> Bool
$c== :: Linkage -> Linkage -> Bool
Eq, Eq Linkage
Eq Linkage
-> (Linkage -> Linkage -> Ordering)
-> (Linkage -> Linkage -> Bool)
-> (Linkage -> Linkage -> Bool)
-> (Linkage -> Linkage -> Bool)
-> (Linkage -> Linkage -> Bool)
-> (Linkage -> Linkage -> Linkage)
-> (Linkage -> Linkage -> Linkage)
-> Ord Linkage
Linkage -> Linkage -> Bool
Linkage -> Linkage -> Ordering
Linkage -> Linkage -> Linkage
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Linkage -> Linkage -> Linkage
$cmin :: Linkage -> Linkage -> Linkage
max :: Linkage -> Linkage -> Linkage
$cmax :: Linkage -> Linkage -> Linkage
>= :: Linkage -> Linkage -> Bool
$c>= :: Linkage -> Linkage -> Bool
> :: Linkage -> Linkage -> Bool
$c> :: Linkage -> Linkage -> Bool
<= :: Linkage -> Linkage -> Bool
$c<= :: Linkage -> Linkage -> Bool
< :: Linkage -> Linkage -> Bool
$c< :: Linkage -> Linkage -> Bool
compare :: Linkage -> Linkage -> Ordering
$ccompare :: Linkage -> Linkage -> Ordering
Ord, Int -> Linkage -> ShowS
[Linkage] -> ShowS
Linkage -> String
(Int -> Linkage -> ShowS)
-> (Linkage -> String) -> ([Linkage] -> ShowS) -> Show Linkage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Linkage] -> ShowS
$cshowList :: [Linkage] -> ShowS
show :: Linkage -> String
$cshow :: Linkage -> String
showsPrec :: Int -> Linkage -> ShowS
$cshowsPrec :: Int -> Linkage -> ShowS
Show, Int -> Linkage
Linkage -> Int
Linkage -> [Linkage]
Linkage -> Linkage
Linkage -> Linkage -> [Linkage]
Linkage -> Linkage -> Linkage -> [Linkage]
(Linkage -> Linkage)
-> (Linkage -> Linkage)
-> (Int -> Linkage)
-> (Linkage -> Int)
-> (Linkage -> [Linkage])
-> (Linkage -> Linkage -> [Linkage])
-> (Linkage -> Linkage -> [Linkage])
-> (Linkage -> Linkage -> Linkage -> [Linkage])
-> Enum Linkage
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Linkage -> Linkage -> Linkage -> [Linkage]
$cenumFromThenTo :: Linkage -> Linkage -> Linkage -> [Linkage]
enumFromTo :: Linkage -> Linkage -> [Linkage]
$cenumFromTo :: Linkage -> Linkage -> [Linkage]
enumFromThen :: Linkage -> Linkage -> [Linkage]
$cenumFromThen :: Linkage -> Linkage -> [Linkage]
enumFrom :: Linkage -> [Linkage]
$cenumFrom :: Linkage -> [Linkage]
fromEnum :: Linkage -> Int
$cfromEnum :: Linkage -> Int
toEnum :: Int -> Linkage
$ctoEnum :: Int -> Linkage
pred :: Linkage -> Linkage
$cpred :: Linkage -> Linkage
succ :: Linkage -> Linkage
$csucc :: Linkage -> Linkage
Enum)