-- |
-- Module      :  Data.Statistics.RulesIntervalsPlus
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Additional statistic rules to choose the number of the intervals.

{-# LANGUAGE BangPatterns #-}

module Data.Statistics.RulesIntervalsPlus where

import  Data.Statistics.RulesIntervals
import Data.Maybe (fromMaybe)
import Text.Read (readMaybe)

getIntervalsNS :: Bool -> String -> [String] -> Int
getIntervalsNS :: Bool -> String -> [String] -> Int
getIntervalsNS Bool
lstW String
xs [String]
yss
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"s" = Int -> Int
sturgesH Int
z
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"l" = Int -> Int
levynskyiMod Int
z
  | Bool
otherwise = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
9 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::(Maybe Int))
     where k :: Int
k = if Bool
lstW then Int
2 else Int
1
           z :: Int
z = [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> ([String] -> [String]) -> [String] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
k) (Int -> Bool) -> (String -> Int) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words) ([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ [String]
yss
{-# INLINE getIntervalsNS #-}

getIntervalsN :: String -> [a] -> Int
getIntervalsN :: String -> [a] -> Int
getIntervalsN String
xs [a]
yss
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"s" = Int -> Int
sturgesH ([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
yss)
  | String
xs String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"l" = Int -> Int
levynskyiMod ([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
yss)
  | Bool
otherwise = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
9 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
xs::(Maybe Int))
{-# INLINE getIntervalsN #-}