------------------------------------------------------------------------------
--                                                                          --
--                            Matreshka Project                             --
--                                                                          --
--         Localization, Internationalization, Globalization for Ada        --
--                                                                          --
--                        Runtime Library Component                         --
--                                                                          --
------------------------------------------------------------------------------
--                                                                          --
-- Copyright © 2011, Vadim Godunko <vgodunko@gmail.com>                     --
-- All rights reserved.                                                     --
--                                                                          --
-- Redistribution and use in source and binary forms, with or without       --
-- modification, are permitted provided that the following conditions       --
-- are met:                                                                 --
--                                                                          --
--  * Redistributions of source code must retain the above copyright        --
--    notice, this list of conditions and the following disclaimer.         --
--                                                                          --
--  * Redistributions in binary form must reproduce the above copyright     --
--    notice, this list of conditions and the following disclaimer in the   --
--    documentation and/or other materials provided with the distribution.  --
--                                                                          --
--  * Neither the name of the Vadim Godunko, IE nor the names of its        --
--    contributors may be used to endorse or promote products derived from  --
--    this software without specific prior written permission.              --
--                                                                          --
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS      --
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT        --
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR    --
-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT     --
-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   --
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED --
-- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR   --
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF   --
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     --
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS       --
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.             --
--                                                                          --
------------------------------------------------------------------------------
--  $Revision: 2890 $ $Date: 2012-04-22 21:47:49 +0400 (Sun, 22 Apr 2012) $
------------------------------------------------------------------------------
with Matreshka.Internals.Calendars.Clocks;

package body League.Calendars is

   use Matreshka.Internals.Calendars;

   ---------
   -- "+" --
   ---------

   overriding function "+" (Right : Time) return Time is
   begin
      return Right;
   end "+";

   ---------
   -- "+" --
   ---------

   overriding function "+" (Left : Time; Right : Time) return Time is
   begin
      return Time (Relative_Time (Left) + Relative_Time (Right));
   end "+";

   ---------
   -- "+" --
   ---------

   function "+" (Left : Date_Time; Right : Time) return Date_Time is
   begin
      return Date_Time (Absolute_Time (Left) + Absolute_Time (Right));
   end "+";

   ---------
   -- "-" --
   ---------

   overriding function "-" (Right : Time) return Time is
   begin
      return Time (-Relative_Time (Right));
   end "-";

   ---------
   -- "-" --
   ---------

   overriding function "-" (Left : Time; Right : Time) return Time is
   begin
      return Time (Relative_Time (Left) - Relative_Time (Right));
   end "-";

   ---------
   -- "-" --
   ---------

   function "-" (Left : Date_Time; Right : Time) return Date_Time is
   begin
      return Date_Time (Absolute_Time (Left) - Absolute_Time (Right));
   end "-";

   ---------
   -- "-" --
   ---------

   function "-" (Left : Date_Time; Right : Date_Time) return Time is
   begin
      return Time (Absolute_Time (Left) - Absolute_Time (Right));
   end "-";

   ---------
   -- "<" --
   ---------

   overriding function "<" (Left : Time; Right : Time) return Boolean is
   begin
      return Relative_Time (Left) < Relative_Time (Right);
   end "<";

   ---------
   -- "<" --
   ---------

   overriding function "<" (Left : Date; Right : Date) return Boolean is
   begin
      return Julian_Day_Number (Left) < Julian_Day_Number (Right);
   end "<";

   ---------
   -- "<" --
   ---------

   overriding function "<"
    (Left : Date_Time; Right : Date_Time) return Boolean is
   begin
      return Absolute_Time (Left) < Absolute_Time (Right);
   end "<";

   ----------
   -- "<=" --
   ----------

   overriding function "<=" (Left : Time; Right : Time) return Boolean is
   begin
      return Relative_Time (Left) <= Relative_Time (Right);
   end "<=";

   ----------
   -- "<=" --
   ----------

   overriding function "<=" (Left : Date; Right : Date) return Boolean is
   begin
      return Julian_Day_Number (Left) <= Julian_Day_Number (Right);
   end "<=";

   ----------
   -- "<=" --
   ----------

   overriding function "<="
    (Left : Date_Time; Right : Date_Time) return Boolean is
   begin
      return Absolute_Time (Left) <= Absolute_Time (Right);
   end "<=";

   ---------
   -- "=" --
   ---------

   overriding function "=" (Left : Time; Right : Time) return Boolean is
   begin
      return Relative_Time (Left) = Relative_Time (Right);
   end "=";

   ---------
   -- "=" --
   ---------

   overriding function "=" (Left : Date; Right : Date) return Boolean is
   begin
      return Julian_Day_Number (Left) = Julian_Day_Number (Right);
   end "=";

   ---------
   -- "=" --
   ---------

   overriding function "="
     (Left : Date_Time; Right : Date_Time) return Boolean is
   begin
      return Absolute_Time (Left) = Absolute_Time (Right);
   end "=";

   ---------
   -- ">" --
   ---------

   overriding function ">" (Left : Time; Right : Time) return Boolean is
   begin
      return Relative_Time (Left) > Relative_Time (Right);
   end ">";

   ---------
   -- ">" --
   ---------

   overriding function ">" (Left : Date; Right : Date) return Boolean is
   begin
      return Julian_Day_Number (Left) > Julian_Day_Number (Right);
   end ">";

   ---------
   -- ">" --
   ---------

   overriding function ">"
    (Left : Date_Time; Right : Date_Time) return Boolean is
   begin
      return Absolute_Time (Left) > Absolute_Time (Right);
   end ">";

   ----------
   -- ">=" --
   ----------

   overriding function ">=" (Left : Time; Right : Time) return Boolean is
   begin
      return Relative_Time (Left) >= Relative_Time (Right);
   end ">=";

   ----------
   -- ">=" --
   ----------

   overriding function ">=" (Left : Date; Right : Date) return Boolean is
   begin
      return Julian_Day_Number (Left) >= Julian_Day_Number (Right);
   end ">=";

   ----------
   -- ">=" --
   ----------

   overriding function ">="
    (Left : Date_Time; Right : Date_Time) return Boolean is
   begin
      return Absolute_Time (Left) >= Absolute_Time (Right);
   end ">=";

   -----------
   -- Clock --
   -----------

   function Clock return Date_Time is
   begin
      return Date_Time (Matreshka.Internals.Calendars.Clocks.Clock);
   end Clock;

   ----------
   -- Read --
   ----------

   procedure Read
    (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
     Item   : out Time_Zone) is
   begin
      raise Program_Error;
   end Read;

   -----------
   -- Write --
   -----------

   procedure Write
    (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
     Item   : Time_Zone) is
   begin
      raise Program_Error;
   end Write;

end League.Calendars;
