haskcell-lib-0.2.1.1

Safe HaskellSafe
LanguageHaskell2010

Data.SpreadSheet

Contents

Description

Módulo general para hojas de cálculo de la herramienta haskcell.

Synopsis

Documentation

data SpreadSheet a Source #

SpreadSheet representa la estructura de datos de una hoja de cálculo.

Las hojas cálculo pueden contener cualquier tipo de dato, pero solo valores de dicho tipo. Es decir, no se podrán tener hojas de cálculo heterogéneas que contengan valores Double o Bool a la vez. Para una representación más cercana al uso ordinario de las hojas de cálculo se recomienda mirar el módulo Cell.

La implementación interna de esta estructura de datos es mediante un diccionario (Map Strict) donde las claves son posiciones (Pos).

En este módulo se definen un conjunto de operaciones para la creación, consulta y modificación de hojas de cálculo.

Constructors

Mk 

Fields

Empty 
Instances
Functor SpreadSheet Source # 
Instance details

Defined in Data.SpreadSheet

Methods

fmap :: (a -> b) -> SpreadSheet a -> SpreadSheet b #

(<$) :: a -> SpreadSheet b -> SpreadSheet a #

Foldable SpreadSheet Source # 
Instance details

Defined in Data.SpreadSheet

Methods

fold :: Monoid m => SpreadSheet m -> m #

foldMap :: Monoid m => (a -> m) -> SpreadSheet a -> m #

foldr :: (a -> b -> b) -> b -> SpreadSheet a -> b #

foldr' :: (a -> b -> b) -> b -> SpreadSheet a -> b #

foldl :: (b -> a -> b) -> b -> SpreadSheet a -> b #

foldl' :: (b -> a -> b) -> b -> SpreadSheet a -> b #

foldr1 :: (a -> a -> a) -> SpreadSheet a -> a #

foldl1 :: (a -> a -> a) -> SpreadSheet a -> a #

toList :: SpreadSheet a -> [a] #

null :: SpreadSheet a -> Bool #

length :: SpreadSheet a -> Int #

elem :: Eq a => a -> SpreadSheet a -> Bool #

maximum :: Ord a => SpreadSheet a -> a #

minimum :: Ord a => SpreadSheet a -> a #

sum :: Num a => SpreadSheet a -> a #

product :: Num a => SpreadSheet a -> a #

Eq a => Eq (SpreadSheet a) Source #

La igualdad entre dos hojas de cálculo se produce cuando el valor de todas sus celdas son iguales y cuando hacen referencia al mismo rango de posiciones.

Instance details

Defined in Data.SpreadSheet

Show a => Show (SpreadSheet a) Source #

Consultar prettyShowSpreadSheet para una visualización más avanzada.

Instance details

Defined in Data.SpreadSheet

Show (SpreadSheet Cell) #

Cell instancia la clase Celldable y utiliza la función 'Data.SpreadSheet.Internal.Pretty.prettyShowSpreadSheet para hacer su representación.

Instance details

Defined in Data.SpreadSheet.Cell

Semigroup (SpreadSheet a) Source #

Operación binaria asociativa implementada con union.

Instance details

Defined in Data.SpreadSheet

Monoid (SpreadSheet a) Source # 
Instance details

Defined in Data.SpreadSheet

Arbitrary a => Arbitrary (SpreadSheet a)

Se deriva la instancia de [(Pos, a)]

Instance details

Defined in Data.SpreadSheet.Internal.Gen

Methods

arbitrary :: Gen (SpreadSheet a)

shrink :: SpreadSheet a -> [SpreadSheet a]

CoArbitrary a => CoArbitrary (SpreadSheet a)

Tomada a partir de la lista de valores. [a]

Instance details

Defined in Data.SpreadSheet.Internal.Gen

Methods

coarbitrary :: SpreadSheet a -> Gen b -> Gen b

Function a => Function (SpreadSheet a)

Tomada a partir de las listas de valores con posiciones.

Instance details

Defined in Data.SpreadSheet.Internal.Gen

Methods

function :: (SpreadSheet a -> b) -> SpreadSheet a :-> b

type Pos = (Natural, Natural) Source #

Posición de una celda en la hoja de cálculo. Comienzan en (1,1).

Punto bidimensional en el que la primera coordenada corresponde a la columna y la segunda a la fila.

Ejemplo para localizar una celda:

A3 (1,3)
J9 (10,9)

data Range Source #

Un rango está definido por dos posiciones, la superior izquierda y la inferior derecha.

Es utilizado en la generación de rangos con la función range.

Constructors

Range Pos Pos 
Instances
Eq Range Source # 
Instance details

Defined in Data.SpreadSheet

Methods

(==) :: Range -> Range -> Bool #

(/=) :: Range -> Range -> Bool #

Ord Range Source # 
Instance details

Defined in Data.SpreadSheet

Methods

compare :: Range -> Range -> Ordering #

(<) :: Range -> Range -> Bool #

(<=) :: Range -> Range -> Bool #

(>) :: Range -> Range -> Bool #

(>=) :: Range -> Range -> Bool #

max :: Range -> Range -> Range #

min :: Range -> Range -> Range #

Show Range Source # 
Instance details

Defined in Data.SpreadSheet

Methods

showsPrec :: Int -> Range -> ShowS #

show :: Range -> String #

showList :: [Range] -> ShowS #

Ix Range Source # 
Instance details

Defined in Data.SpreadSheet

Arbitrary Range

Se deriva la instancia de Natural

Instance details

Defined in Data.SpreadSheet.Internal.Gen

Methods

arbitrary :: Gen Range

shrink :: Range -> [Range]

Constructores

empty :: SpreadSheet a Source #

Hoja de cálculo vacía.

>>> empty == fromList []
True

singleton :: a -> SpreadSheet a Source #

A partir de un solo valor, se genera la hoja que en la posición (1,1) tiene dicho valor.

>>> singleton True
Range (1,1) (1,1)
fromList [((1,1), True)]

singletonPos :: Pos -> a -> SpreadSheet a Source #

Generar una hoja con un valor en una posición.

>>> singletonPos (1,5) True
Range (1,5) (1,5)
fromList [((1,5),True)]

fromList :: [(Pos, a)] -> SpreadSheet a Source #

De una lista de pares posición-valor se genera la hoja correspondiente. En el caso de tener posiciones repetidas, permanecerá la que tenga un índice mayor.

>>> fromList [((1,1), 0), ((1,2), 1), ((1,1), 5)]
Range (1,1) (1,2)
fromList [((1,1),5),((1,2),3)]

toListValues :: SpreadSheet a -> [a] Source #

Transforma una hoja de cálculo a una lista que contiene sus valores.

>>> toListValues empty == []
True

La función toList aplicada a esta esctructura de datos utiliza esta función.

toListPosValues :: SpreadSheet a -> [(Pos, a)] Source #

Transforma una hoja de cálculo a una lista que contiene sus valores junto a las posiciones en las que están.

fromDict :: Map Pos a -> SpreadSheet a Source #

Construcción de forma equivalente a fromList, salvo que se usa un diccionario de la librearía Map.

Destinado a construir la hoja de cálculo aprovechando las funciones optimizadas para diccionarios. Las precondiciones de las funciones de construcción de diccionarios no se comprueban, ya que forman parte de otro módulo.

>>> let cells = zipWith (,) [(x,y) | x <- [1..9], y <- [1..9]] [1..]
>>> Map.valid $ Map.fromAscList cells
True
>>> Map.valid $ Map.fromAscList (reverse cells)
False
>>> fromDict $ Map.fromAscList cells
Range (1,1) (9,9)
fromList [((1,1),1),((1,2),2),((1,3),3),((1,4),...

Selección y referencias

get :: Pos -> SpreadSheet a -> Maybe a Source #

Obtiene el valor de una posición (Pos) de una hoja de cálculo.

Si la celda contiene un dato, devuelve el valor como (Just valor). Si no existe, devuelve Nothing.

>>> get (1,1) $ fromList [((1,1), "valor")]
Just "valor"
>>> get (2,2) $ fromList [((1,1), "valor")]
Nothing

selectRange :: Range -> SpreadSheet a -> SpreadSheet a Source #

Dando un rango y una hoja de cálculo, genera una hoja de cálculo con las celdas en dicho rango.

>>> let cells = zipWith (,) [(x,y) | x <- [1..9], y <- [1..9]] [1..]
>>> range (Range (8,7) (9,9)) $ fromList cells
Range (8,7) (9,9)
fromList [((8,7),70),((8,8),71),((8,9),72),((9,7),79),((9,8),80),((9,9),81)]

row :: Natural -> SpreadSheet a -> SpreadSheet a Source #

Selecciona las celdas con datos de una hoja de cálculo para una fila dada.

>>> let cells = zipWith (,) [(x,y) | x <- [1..5], y <- [1..5]] [1..]
>>> row 3 $ fromList cells
Range (1,3) (5,3)
fromList [((1,3),3),((2,3),8),((3,3),13),((4,3),18),((5,3),23)]

column :: Natural -> SpreadSheet a -> SpreadSheet a Source #

Selecciona las celdas con datos de una hoja de cálculo para una columna dada.

>>> let cells = zipWith (,) [(x,y) | x <- [1..5], y <- [1..5]] [1..]
>>> column 2 $ fromList cells
Range (2,1) (2,5)
fromList [((2,1),6),((2,2),7),((2,3),8),((2,4),9),((2,5),10)]

select :: (Pos -> Bool) -> SpreadSheet a -> SpreadSheet a Source #

Genera una hoja de cálculo a partir de una dada según una función discriminante sobre las posiciónes.

En el siguiente ejemplo se eligen por ejemplo las celdas presentes en la diagonal.

>>> select (\(col,row) -> col == row) $ fromList [((1,1), "a"), ((2,1), "b"), ((1,2), "c"), ((2,2), "d")]
Range (1,1) (2,2)
fromList [((1,1),"a"),((2,2),"d")]

Modificación

put :: Pos -> (SpreadSheet a -> a) -> SpreadSheet a -> SpreadSheet a Source #

Inserta en una posición un valor. Este valor se puede generar según una función sobre una hoja de cálculo.

Esta función permite la composición de sucesivas inserciones.

>>> empty & put (1,1) (const True) & put (1,2) (const False)
Range (1,1) (1,2)
fromList [((1,1),True),((1,2),False)]

union :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a Source #

Combina dos hojas de cálculo. En el caso de que dos celdas contengan datos en cada una de las dos hojas, dejará el dato de la segunda.

También se puede usar el operador (<>) de la clase Semigroup.

intersection :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a Source #

Genera una hoja de cálculo nueva con la intersección de las celdas, dejando los valores de la primera hoja.

(</>) :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a Source #

Operador para la intersección. Ver intersection.

mapMaybe :: (a -> Maybe b) -> SpreadSheet a -> SpreadSheet b Source #

La función mapMaybe está orientada a la selección de valores de un tipo que puedan ser transformados a otro. Tomando una hoja de cálculo se obtiene una nueva, con un tipo distinto, con solo aquellos valores que han podido ser extraidos.

Esta función tiene su ejemplo en el conjunto de funciónes extractDouble, extractString o extractDay del módulo Cell.

>>> let days = fromList [((1,1), "2018-12-23"), ((1,2),"-"), ((1,3),"2018-12-25")] :: SpreadSheet String
>>> let parseDay = (\x -> parseTimeM True defaultTimeLocale "%Y-%-m-%-d" x) :: String -> Maybe Day
>>> :t mapMaybe parseDay days
extract p days :: SpreadSheet Day
>>> mapMaybe parseDay days
Range (1,1) (1,3)
fromList [((1,1),2018-12-23),((1,3),2018-12-25)]

Propiedades derivadas

width :: SpreadSheet a -> Maybe Natural Source #

Indica el número de columnas que tiene una hoja de cálculo.

height :: SpreadSheet a -> Maybe Natural Source #

Indica el número de filas que tiene una hoja de cálculo.

limits :: SpreadSheet a -> Maybe Range Source #

Indica el rango en el que están contenidos los valores de la hoja de cálculo.

columns :: SpreadSheet a -> [Natural] Source #

Enumera las columnas de la hoja de cálculo.

>>> columns empty
[]
>>> columns $ fromList [((5,3), True), ((10,6), True)]
[5,6,7,8,9,10]

rows :: SpreadSheet a -> [Natural] Source #

Enumera las filas de la hoja de cálculo.

>>> rows empty
[]
>>> rows $ fromList [((5,3), True), ((10,6), True)]
[3,4,5,6]