{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE NoImplicitPrelude #-}

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

{-# LANGUAGE BangPatterns, FlexibleContexts #-}

module Phladiprelio.Basis where

import GHC.Base

data Result t a b c = R {forall (t :: * -> *) a b c. Result t a b c -> t a
line :: !(t a), forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF :: !b,  forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF :: !c} deriving Result t a b c -> Result t a b c -> Bool
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 forall a. Ord a => a -> a -> Ordering
compare (forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF Result t a b c
x) (forall (t :: * -> *) a b c. Result t a b c -> c
transPropertiesF Result t a b c
y) of
       !Ordering
EQ -> case forall a. Ord a => a -> a -> Ordering
compare (forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF Result t a b c
x) (forall (t :: * -> *) a b c. Result t a b c -> b
propertiesF Result t a b c
y) of
              !Ordering
EQ -> forall a. Ord a => a -> a -> Ordering
compare (forall (t :: * -> *) a b c. Result t a b c -> t a
line Result t a b c
x) (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 { forall a b c. FuncRep2 a b c -> a -> b
getAB :: (a -> b), forall a b c. FuncRep2 a b c -> b -> c
getBC :: (b -> c) }

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

data Result2 a b c = R2 {forall a b c. Result2 a b c -> a
line2 :: !a, forall a b c. Result2 a b c -> b
propertiesF2 :: !b,  forall a b c. Result2 a b c -> c
transPropertiesF2 :: !c} deriving Result2 a b c -> Result2 a b c -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c.
(Eq a, Eq b, Eq c) =>
Result2 a b c -> Result2 a b c -> Bool
/= :: Result2 a b c -> Result2 a b c -> Bool
$c/= :: forall a b c.
(Eq a, Eq b, Eq c) =>
Result2 a b c -> Result2 a b c -> Bool
== :: Result2 a b c -> Result2 a b c -> Bool
$c== :: forall a b c.
(Eq a, Eq b, Eq c) =>
Result2 a b c -> Result2 a b c -> Bool
Eq

instance (Ord a, Ord b, Ord c) => Ord (Result2 a b c) where
  compare :: Result2 a b c -> Result2 a b c -> Ordering
compare Result2 a b c
x Result2 a b c
y
    = case forall a. Ord a => a -> a -> Ordering
compare (forall a b c. Result2 a b c -> c
transPropertiesF2 Result2 a b c
x) (forall a b c. Result2 a b c -> c
transPropertiesF2 Result2 a b c
y) of
       !Ordering
EQ -> case forall a. Ord a => a -> a -> Ordering
compare (forall a b c. Result2 a b c -> b
propertiesF2 Result2 a b c
x) (forall a b c. Result2 a b c -> b
propertiesF2 Result2 a b c
y) of
              !Ordering
EQ -> forall a. Ord a => a -> a -> Ordering
compare (forall a b c. Result2 a b c -> a
line2 Result2 a b c
x) (forall a b c. Result2 a b c -> a
line2 Result2 a b c
y)
              !Ordering
z -> Ordering
z
       !Ordering
z0 -> Ordering
z0
  {-# INLINE compare #-}