{-# LANGUAGE AllowAmbiguousTypes #-}

module Pandora.Paradigm.Structure.Ability.Measurable where

import Pandora.Pattern.Category ((.))
import Pandora.Paradigm.Primary.Functor.Tagged (Tagged (Tag))

class Measurable f t where
	type Measural (f :: k) (t :: * -> *) a
	measurement :: Tagged f (t a) -> Measural f t a

measure :: forall f t a . Measurable f t => t a -> Measural f t a
measure :: t a -> Measural f t a
measure = Tagged f (t a) -> Measural f t a
forall k (f :: k) (t :: * -> *) a.
Measurable f t =>
Tagged f (t a) -> Measural f t a
measurement (Tagged f (t a) -> Measural f t a)
-> (t a -> Tagged f (t a)) -> t a -> Measural f t a
forall (m :: * -> * -> *) b c a.
Category m =>
m b c -> m a b -> m a c
. forall a. a -> Tagged f a
forall k (tag :: k) a. a -> Tagged tag a
Tag @f

data Scale = Length | Heighth | Depth