{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Phonetic.Languages.Basis
-- Copyright   :  (c) OleksandrZhabenko 2020-2022
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Simplified version of the @phonetic-languages-common@ and @phonetic-languages-general@ packages.
-- Uses less dependencies.

{-# LANGUAGE BangPatterns, FlexibleContexts #-}

module Phonetic.Languages.Basis where

data Result t a b c = R {Result t a b c -> t a
line :: !(t a), Result t a b c -> b
propertiesF :: !b,  Result t a b c -> c
transPropertiesF :: !c} deriving Result t a b c -> Result t a b c -> Bool
(Result t a b c -> Result t a b c -> Bool)
-> (Result t a b c -> Result t a b c -> Bool)
-> Eq (Result t a b c)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (t :: * -> *) a b c.
(Eq b, Eq c, Eq (t a)) =>
Result t a b c -> Result t a b c -> Bool
/= :: Result t a b c -> Result t a b c -> Bool
$c/= :: forall (t :: * -> *) a b c.
(Eq b, Eq c, Eq (t a)) =>
Result t a b c -> Result t a b c -> Bool
== :: Result t a b c -> Result t a b c -> Bool
$c== :: forall (t :: * -> *) a b c.
(Eq b, Eq c, Eq (t a)) =>
Result t a b c -> Result t a b c -> Bool
Eq

instance (Ord (t a), Ord b, Ord c) => Ord (Result t a b c) where
  compare :: Result t a b c -> Result t a b c -> Ordering
compare Result t a b c
x Result t a b c
y
    = case c -> c -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Result t a b c -> c
forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF Result t a b c
x) (Result t a b c -> c
forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF Result t a b c
y) of
       !Ordering
EQ -> case b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Result t a b c -> b
forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF Result t a b c
x) (Result t a b c -> b
forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF Result t a b c
y) of
              !Ordering
EQ -> t a -> t a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Result t a b c -> t a
forall (t :: * -> *) a b c. Result t a b c -> t a
line Result t a b c
x) (Result t a b c -> t a
forall (t :: * -> *) a b c. Result t a b c -> t a
line Result t a b c
y)
              !Ordering
z -> Ordering
z
       !Ordering
z0 -> Ordering
z0
  {-# INLINE compare #-}

data FuncRep2 a b c = D { FuncRep2 a b c -> a -> b
getAB :: (a -> b), FuncRep2 a b c -> b -> c
getBC :: (b -> c) }

getAC :: FuncRep2 a b c -> (a -> c)
getAC :: FuncRep2 a b c -> a -> c
getAC (D a -> b
f b -> c
g) = b -> c
g (b -> c) -> (a -> b) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f
{-# INLINE getAC #-}