Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Módulo general para hojas de cálculo de la herramienta haskcell
.
Synopsis
- data SpreadSheet a
- type Pos = (Natural, Natural)
- data Range = Range Pos Pos
- empty :: SpreadSheet a
- singleton :: a -> SpreadSheet a
- singletonPos :: Pos -> a -> SpreadSheet a
- fromList :: [(Pos, a)] -> SpreadSheet a
- toListValues :: SpreadSheet a -> [a]
- toListPosValues :: SpreadSheet a -> [(Pos, a)]
- fromDict :: Map Pos a -> SpreadSheet a
- get :: Pos -> SpreadSheet a -> Maybe a
- selectRange :: Range -> SpreadSheet a -> SpreadSheet a
- row :: Natural -> SpreadSheet a -> SpreadSheet a
- column :: Natural -> SpreadSheet a -> SpreadSheet a
- select :: (Pos -> Bool) -> SpreadSheet a -> SpreadSheet a
- put :: Pos -> (SpreadSheet a -> a) -> SpreadSheet a -> SpreadSheet a
- union :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a
- intersection :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a
- (</>) :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a
- mapMaybe :: (a -> Maybe b) -> SpreadSheet a -> SpreadSheet b
- width :: SpreadSheet a -> Maybe Natural
- height :: SpreadSheet a -> Maybe Natural
- limits :: SpreadSheet a -> Maybe Range
- columns :: SpreadSheet a -> [Natural]
- rows :: SpreadSheet a -> [Natural]
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.
Instances
Functor SpreadSheet Source # | |
Defined in Data.SpreadSheet fmap :: (a -> b) -> SpreadSheet a -> SpreadSheet b # (<$) :: a -> SpreadSheet b -> SpreadSheet a # | |
Foldable SpreadSheet Source # | |
Defined in Data.SpreadSheet 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. |
Defined in Data.SpreadSheet (==) :: SpreadSheet a -> SpreadSheet a -> Bool # (/=) :: SpreadSheet a -> SpreadSheet a -> Bool # | |
Show a => Show (SpreadSheet a) Source # | Consultar
|
Defined in Data.SpreadSheet showsPrec :: Int -> SpreadSheet a -> ShowS # show :: SpreadSheet a -> String # showList :: [SpreadSheet a] -> ShowS # | |
Show (SpreadSheet Cell) # |
|
Defined in Data.SpreadSheet.Cell | |
Semigroup (SpreadSheet a) Source # | Operación binaria asociativa implementada con |
Defined in Data.SpreadSheet (<>) :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a # sconcat :: NonEmpty (SpreadSheet a) -> SpreadSheet a # stimes :: Integral b => b -> SpreadSheet a -> SpreadSheet a # | |
Monoid (SpreadSheet a) Source # | |
Defined in Data.SpreadSheet mempty :: SpreadSheet a # mappend :: SpreadSheet a -> SpreadSheet a -> SpreadSheet a # mconcat :: [SpreadSheet a] -> SpreadSheet a # | |
Arbitrary a => Arbitrary (SpreadSheet a) | Se deriva la instancia de |
Defined in Data.SpreadSheet.Internal.Gen arbitrary :: Gen (SpreadSheet a) shrink :: SpreadSheet a -> [SpreadSheet a] | |
CoArbitrary a => CoArbitrary (SpreadSheet a) | Tomada a partir de la lista de valores. |
Defined in Data.SpreadSheet.Internal.Gen coarbitrary :: SpreadSheet a -> Gen b -> Gen b | |
Function a => Function (SpreadSheet a) | Tomada a partir de las listas de valores con posiciones. |
Defined in Data.SpreadSheet.Internal.Gen 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) |
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
.
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
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]